# Judging the impact of newer library versions on the app requires being intimately familiar with the code base. # Please don't open pull requests upgrading dependencies if you're a new contributor. # Instead, open an issue and let's discuss the upgrade there. # # Declarations are sorted alphabetically within their section. # # When upgrading dependencies, please follow these steps: # 1. Update the version in this file. # 2. Run `./gradlew dependencyGuard` and check the output for any conflicts. # 3. Run `./gradlew build` and fix any issues. # 4. Run the app and check for any issues. [versions] androidDesugar = "2.0.4" androidMaterial = "1.11.0" # AGP and tools should be updated together androidGradlePlugin = "8.2.2" androidTools = "31.2.2" androidxActivity = "1.8.2" androidxAnnotation = "1.7.1" androidxAppCompat = "1.6.1" androidxBiometric = "1.1.0" # https://developer.android.com/jetpack/compose/bom/bom-mapping androidxComposeBom = "2024.02.01" androidxComposeCompiler = "1.5.10" androidxConstraintLayout = "2.1.4" androidxCoordinatorLayout = "1.2.0" androidxCore = "1.12.0" androidxCoreSplashscreen = "1.0.1" androidxDrawerLayout = "1.1.1" androidxFragment = "1.6.2" androidxLifecycle = "2.7.0" androidxLocalBroadcastManager = "1.1.0" androidxNavigation = "2.7.7" androidxRecyclerView = "1.3.2" androidxPreference = "1.2.1" androidxSwiperefreshlayout = "1.1.0" androidxTestCore = "1.5.0" androidxTestEspresso = "3.5.1" androidxTestExt = "1.1.5" androidxTestRules = "1.5.0" androidxTestRunner = "1.5.2" androidxTransition = "1.4.1" androidxWork = "2.9.0" apacheHttpclient5 = "5.3.1" appAuth = "0.11.1" assertk = "0.28.0" circleImageView = "3.1.0" ckchangelog = "2.0.0-beta02" clikt = "4.2.2" commonsIo = "2.15.1" dependencyCheckPlugin = "0.51.0" dependencyGuardPlugin = "0.5.0" detektPlugin = "1.23.5" detektPluginCompose = "0.3.11" fastAdapter = "5.7.0" forkhandlesBom = "2.13.1.0" glide = "4.16.0" gradle = "8.6" http4kBom = "5.13.7.0" icu4j = "72.1" javaDiffUtils = "4.12" jcipAnnotations = "1.0" jetbrainsAnnotations = "24.0.1" jdom = "2.0.6.1" jmapClient = "0.3.1" jsoup = "1.17.2" junit = "4.13.2" jutf7 = "1.0.0" jzlib = "1.0.7" koinCore = "3.5.3" koinAndroid = "3.5.3" koinAndroidCompose = "3.5.3" koinTest = "3.5.3" kotlinBom = "1.9.22" # Needs to match the version used by Gradle, just check with `./gradlew --version` kotlinGradleBom = "1.9.20" kotlinKsp = "1.9.22-1.0.17" kotlinxCoroutines = "1.8.0" kotlinxDateTime = "0.5.0" ktlint = "1.1.1" kxml2 = "1.0" leakcanary = "2.13" materialDrawer = "9.0.2" mime4j = "0.8.9" minidns = "1.0.5" mockito = "5.8.0" mockitoKotlin = "5.2.1" moshi = "1.15.1" okhttp = "4.12.0" okio = "3.8.0" preferencesFix = "1.1.0" robolectric = "4.11.1" safeContentResolver = "1.0.0" searchPreference = "v2.3.0" spotlessPlugin = "6.25.0" timber = "5.0.1" tokenautocomplete = "4.0.0-beta01" turbine = "0.13.0" xmlpull = "1.0" [plugins] android-application = { id = "com.android.application", version.ref = "androidGradlePlugin" } android-library = { id = "com.android.library", version.ref = "androidGradlePlugin" } android-lint = { id = "com.android.lint", version.ref = "androidGradlePlugin" } android-test = { id = "com.android.test", version.ref = "androidGradlePlugin" } dependency-check = { id = "com.github.ben-manes.versions", version.ref = "dependencyCheckPlugin" } dependency-guard = { id = "com.dropbox.dependency-guard", version.ref = "dependencyGuardPlugin" } detekt = { id = "io.gitlab.arturbosch.detekt", version.ref = "detektPlugin" } kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlinBom" } kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlinBom" } kotlin-parcelize = { id = "org.jetbrains.kotlin.plugin.parcelize", version.ref = "kotlinBom" } ksp = { id = "com.google.devtools.ksp", version.ref = "kotlinKsp" } spotless = { id = "com.diffplug.spotless", version.ref = "spotlessPlugin" } [libraries] android-desugar = { module = "com.android.tools:desugar_jdk_libs", version.ref = "androidDesugar" } android-material = { module = "com.google.android.material:material", version.ref = "androidMaterial" } android-tools-common = { module = "com.android.tools:common", version.ref = "androidTools" } androidx-activity = { module = "androidx.activity:activity", version.ref = "androidxActivity" } androidx-activity-compose = { module = "androidx.activity:activity-compose", version.ref = "androidxActivity" } androidx-annotation = { module = "androidx.annotation:annotation", version.ref = "androidxAnnotation" } androidx-appcompat = { module = "androidx.appcompat:appcompat", version.ref = "androidxAppCompat" } androidx-biometric = { module = "androidx.biometric:biometric", version.ref = "androidxBiometric" } androidx-compose-bom = { module = "androidx.compose:compose-bom", version.ref = "androidxComposeBom" } androidx-compose-foundation = { module = "androidx.compose.foundation:foundation" } androidx-compose-material = { module = "androidx.compose.material:material" } androidx-compose-material-icons-extended = { module = "androidx.compose.material:material-icons-extended" } androidx-compose-material3 = { module = "androidx.compose.material3:material3" } androidx-compose-material3-windowSizeClass = { module = "androidx.compose.material3:material3-window-size-class" } androidx-compose-runtime = { module = "androidx.compose.runtime:runtime" } androidx-compose-ui-test-junit4 = { module = "androidx.compose.ui:ui-test-junit4" } androidx-compose-ui-test-manifest = { module = "androidx.compose.ui:ui-test-manifest" } androidx-compose-ui-tooling = { module = "androidx.compose.ui:ui-tooling" } androidx-compose-ui-tooling-preview = { module = "androidx.compose.ui:ui-tooling-preview" } androidx-compose-ui-util = { module = "androidx.compose.ui:ui-util" } androidx-constraintlayout = { module = "androidx.constraintlayout:constraintlayout", version.ref = "androidxConstraintLayout" } androidx-coordinatorlayout = { module = "androidx.coordinatorlayout:coordinatorlayout", version.ref = "androidxCoordinatorLayout" } androidx-core = { module = "androidx.core:core", version.ref = "androidxCore" } androidx-core-ktx = { module = "androidx.core:core-ktx", version.ref = "androidxCore" } androidx-core-splashscreen = { module = "androidx.core:core-splashscreen", version.ref = "androidxCoreSplashscreen" } androidx-fragment = { module = "androidx.fragment:fragment", version.ref = "androidxFragment" } androidx-lifecycle-common = { module = "androidx.lifecycle:lifecycle-common", version.ref = "androidxLifecycle" } androidx-lifecycle-runtime-compose = { module = "androidx.lifecycle:lifecycle-runtime-compose", version.ref = "androidxLifecycle" } androidx-lifecycle-runtime-ktx = { module = "androidx.lifecycle:lifecycle-runtime-ktx", version.ref = "androidxLifecycle" } androidx-lifecycle-viewmodel = { module = "androidx.lifecycle:lifecycle-viewmodel", version.ref = "androidxLifecycle" } androidx-lifecycle-viewmodel-compose = { module = "androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "androidxLifecycle" } androidx-lifecycle-viewmodel-ktx = { module = "androidx.lifecycle:lifecycle-viewmodel-ktx", version.ref = "androidxLifecycle" } androidx-lifecycle-livedata-ktx = { module = "androidx.lifecycle:lifecycle-livedata-ktx", version.ref = "androidxLifecycle" } androidx-localbroadcastmanager = { module = "androidx.localbroadcastmanager:localbroadcastmanager", version.ref = "androidxLocalBroadcastManager" } androidx-navigation-compose = { module = "androidx.navigation:navigation-compose", version.ref = "androidxNavigation" } androidx-navigation-fragment = { module = "androidx.navigation:navigation-fragment", version.ref = "androidxNavigation" } androidx-navigation-ui = { module = "androidx.navigation:navigation-ui", version.ref = "androidxNavigation" } androidx-navigation-testing = { module = "androidx.navigation:navigation-testing", version.ref = "androidxNavigation" } androidx-preference = { module = "androidx.preference:preference", version.ref = "androidxPreference" } androidx-recyclerview = { module = "androidx.recyclerview:recyclerview", version.ref = "androidxRecyclerView" } androidx-swiperefreshlayout = { module = "androidx.swiperefreshlayout:swiperefreshlayout", version.ref = "androidxSwiperefreshlayout" } androidx-test-core = { module = "androidx.test:core", version.ref = "androidxTestCore" } androidx-test-espresso-core = { module = "androidx.test.espresso:espresso-core", version.ref = "androidxTestEspresso" } androidx-test-ext-junit-ktx = { module = "androidx.test.ext:junit-ktx", version.ref = "androidxTestExt" } androidx-test-rules = { module = "androidx.test:rules", version.ref = "androidxTestRules" } androidx-test-runner = { module = "androidx.test:runner", version.ref = "androidxTestRunner" } androidx-work-runtime = { module = "androidx.work:work-runtime", version.ref = "androidxWork" } androidx-work-testing = { module = "androidx.work:work-testing", version.ref = "androidxWork" } apache-httpclient5 = { module = "org.apache.httpcomponents.client5:httpclient5", version.ref = "apacheHttpclient5" } appauth = { module = "net.openid:appauth", version.ref = "appAuth" } assertk = { module = "com.willowtreeapps.assertk:assertk-jvm", version.ref = "assertk" } circleImageView = { module = "de.hdodenhof:circleimageview", version.ref = "circleImageView" } ckchangelog-core = { module = "de.cketti.library.changelog:ckchangelog-core", version.ref = "ckchangelog" } clikt = { module = "com.github.ajalt.clikt:clikt", version.ref = "clikt" } commons-io = { module = "commons-io:commons-io", version.ref = "commonsIo" } detekt-plugin-compose = { module = "io.nlopez.compose.rules:detekt", version.ref = "detektPluginCompose" } diff-utils = { module = "io.github.java-diff-utils:java-diff-utils", version.ref = "javaDiffUtils" } fastadapter = { module = "com.mikepenz:fastadapter", version.ref = "fastAdapter" } fastadapter-extensions-drag = { module = "com.mikepenz:fastadapter-extensions-drag", version.ref = "fastAdapter" } fastadapter-extensions-utils = { module = "com.mikepenz:fastadapter-extensions-utils", version.ref = "fastAdapter" } forkhandles-bom = { module = "dev.forkhandles:forkhandles-bom", version.ref = "forkhandlesBom" } forkhandles-fabrikate4k = { module = "dev.forkhandles:fabrikate4k" } glide = { module = "com.github.bumptech.glide:glide", version.ref = "glide" } glide-compiler = { module = "com.github.bumptech.glide:compiler", version.ref = "glide" } http4k-bom = { module = "org.http4k:http4k-bom", version.ref = "http4kBom" } http4k-core = { module = "org.http4k:http4k-core" } http4k-client-okhttp = { module = "org.http4k:http4k-client-okhttp" } http4k-format-moshi = { module = "org.http4k:http4k-format-moshi" } icu4j-charset = { module = "com.ibm.icu:icu4j-charset", version.ref = "icu4j" } jetbrains-annotations = { module = "org.jetbrains:annotations", version.ref = "jetbrainsAnnotations" } jcip-annotations = { module = "net.jcip:jcip-annotations", version.ref = "jcipAnnotations" } jdom2 = { module = "org.jdom:jdom2", version.ref = "jdom" } jmap-client = { module = "rs.ltt.jmap:jmap-client", version.ref = "jmapClient" } jsoup = { module = "org.jsoup:jsoup", version.ref = "jsoup" } junit = { module = "junit:junit", version.ref = "junit" } jutf7 = { module = "com.beetstra.jutf7:jutf7", version.ref = "jutf7" } jzlib = { module = "com.jcraft:jzlib", version.ref = "jzlib" } koin-core = { module = "io.insert-koin:koin-core", version.ref = "koinCore" } koin-android = { module = "io.insert-koin:koin-android", version.ref = "koinAndroid" } koin-androidx-compose = { module = "io.insert-koin:koin-androidx-compose", version.ref = "koinAndroidCompose" } koin-test = { module = "io.insert-koin:koin-test", version.ref = "koinTest" } koin-test-junit4 = { module = "io.insert-koin:koin-test-junit4", version.ref = "koinTest" } kotlin-bom = { module = "org.jetbrains.kotlin:kotlin-bom", version.ref = "kotlinBom" } kotlin-gradle-bom = { module = "org.jetbrains.kotlin:kotlin-bom", version.ref = "kotlinGradleBom" } kotlin-reflect = { module = "org.jetbrains.kotlin:kotlin-reflect" } kotlin-stdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib" } kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test" } kotlinx-collections-immutable = "org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7" kotlinx-coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "kotlinxCoroutines" } kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlinxCoroutines" } kotlinx-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "kotlinxCoroutines" } kotlinx-datetime = { module = "org.jetbrains.kotlinx:kotlinx-datetime", version.ref = "kotlinxDateTime" } kxml2 = { module = "com.github.cketti:kxml2-extracted-from-android", version.ref = "kxml2" } leakcanary-android = { module = "com.squareup.leakcanary:leakcanary-android", version.ref = "leakcanary" } materialdrawer = { module = "com.mikepenz:materialdrawer", version.ref = "materialDrawer" } mime4j-core = { module = "org.apache.james:apache-mime4j-core", version.ref = "mime4j" } mime4j-dom = { module = "org.apache.james:apache-mime4j-dom", version.ref = "mime4j" } minidns-hla = { module = "org.minidns:minidns-hla", version.ref = "minidns" } mockito-core = { module = "org.mockito:mockito-core", version.ref = "mockito" } mockito-kotlin = { module = "org.mockito.kotlin:mockito-kotlin", version.ref = "mockitoKotlin" } moshi = { module = "com.squareup.moshi:moshi", version.ref = "moshi" } moshi-kotlin-codegen = { module = "com.squareup.moshi:moshi-kotlin-codegen", version.ref = "moshi" } okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp" } okhttp-mockwebserver = { module = "com.squareup.okhttp3:mockwebserver", version.ref = "okhttp" } okio = { module = "com.squareup.okio:okio", version.ref = "okio" } preferencex = { module = "com.takisoft.preferencex:preferencex", version.ref = "preferencesFix" } preferencex-colorpicker = { module = "com.takisoft.preferencex:preferencex-colorpicker", version.ref = "preferencesFix" } preferencex-datetimepicker = { module = "com.takisoft.preferencex:preferencex-datetimepicker", version.ref = "preferencesFix" } robolectric = { module = "org.robolectric:robolectric", version.ref = "robolectric" } safeContentResolver = { module = "de.cketti.safecontentresolver:safe-content-resolver-v21", version.ref = "safeContentResolver" } searchPreference = { module = "com.github.ByteHamster:SearchPreference", version.ref = "searchPreference" } timber = { module = "com.jakewharton.timber:timber", version.ref = "timber" } tokenautocomplete = { module = "com.splitwise:tokenautocomplete", version.ref = "tokenautocomplete" } turbine = { module = "app.cash.turbine:turbine", version.ref = "turbine" } xmlpull = { module = "com.github.cketti:xmlpull-extracted-from-android", version.ref = "xmlpull" } [bundles] shared-jvm-main = [ "koin-core", "kotlinx-datetime", "kotlinx-coroutines-core", ] shared-jvm-android = [ "androidx-core", "androidx-core-ktx", "koin-android", ] shared-jvm-android-app = [ "android-material", "androidx-activity", "androidx-core-splashscreen", ] shared-jvm-android-compose = [ "androidx-compose-foundation", "androidx-compose-ui-tooling-preview", "androidx-lifecycle-runtime-compose", "androidx-lifecycle-viewmodel-compose", "androidx-navigation-compose", "koin-androidx-compose", "kotlinx-collections-immutable", ] shared-jvm-android-compose-debug = [ "androidx-compose-ui-test-manifest", "androidx-compose-ui-tooling", ] shared-jvm-androidtest-compose = [ "androidx-compose-ui-test-junit4", ] shared-jvm-test = [ "assertk", "junit", "koin-test", "koin-test-junit4", "kotlin-test", "kotlinx-coroutines-test", "mockito-core", "mockito-kotlin", "turbine", ] shared-jvm-test-compose = [ "androidx-compose-ui-test-junit4", "androidx-test-espresso-core", "robolectric", ]