Phase 4 of docs/OWN-STORE.md. OneShotImport reads databases/tasks.db directly — read-only, no provider, no ContentResolver — and writes it into Room in one verified transaction. dmfs row ids are remapped in two passes, because a parent can carry a higher _id than its child. The archive happens before the import, not after, and the import always replaces. That is what actually closes the crash window the plan's "flag *and* rename" is meant to cover: renaming last leaves the flag unset with tasks.db still in place, so the next launch imports a second copy. In this order every kill point re-enters correctly. Recurrence overrides are carried across as master_id/recurrence_id rather than ignored. dmfs stores them as ordinary rows sharing their master's _uid, so importing one as a second master would collide on the unique index and abort the whole import. autoMode now answers OWN, and a stored LOCAL reads as OWN — after the import the dmfs file has been renamed away, so someone who chose local storage explicitly must land on the store their data is now in. StartupGate holds the first store read until the mode has landed and the import has run; showing an upgrading user an empty app is the worst thing this migration could do. The backup rules take the database with its WAL sidecars and exclude the archive, and the app checkpoints on ON_STOP.
142 lines
7.5 KiB
TOML
142 lines
7.5 KiB
TOML
[versions]
|
|
agp = "9.2.1"
|
|
kotlin = "2.3.21"
|
|
ksp = "2.3.9"
|
|
hilt = "2.59.2"
|
|
coreKtx = "1.19.0"
|
|
appcompat = "1.7.1"
|
|
lifecycleRuntime = "2.10.0"
|
|
activityCompose = "1.13.0"
|
|
composeBom = "2026.05.01"
|
|
# Material 3 Expressive APIs currently live only in the 1.5 alpha line.
|
|
# Pin explicitly to override the BOM (which ships stable 1.4.0).
|
|
# Re-evaluate when 1.5.0 stable lands.
|
|
material3 = "1.5.0-alpha21"
|
|
datastore = "1.2.1"
|
|
# Room — Agendula's own task store (docs/OWN-STORE.md).
|
|
room = "2.8.4"
|
|
# SAF directory writing for export/backup (DocumentFile).
|
|
documentfile = "1.1.0"
|
|
junit = "6.1.0"
|
|
junitPlatform = "6.1.0"
|
|
truth = "1.4.5"
|
|
androidxJunit = "1.3.0"
|
|
espressoCore = "3.7.0"
|
|
kotlinxDatetime = "0.7.0"
|
|
kotlinxCoroutines = "1.10.2"
|
|
turbine = "1.2.0"
|
|
hiltNavigationCompose = "1.3.0"
|
|
navigationCompose = "2.9.0"
|
|
lifecycleCompose = "2.10.0"
|
|
androidxTestRules = "1.7.0"
|
|
# Glance: 1.1.1 is the latest stable (1.2.0 is still rc, 1.3.0 alpha).
|
|
glance = "1.1.1"
|
|
|
|
# --- :provider (vendored dmfs task provider) ---------------------------------
|
|
# Versions the upstream 1.4.2 source was written against. These are its runtime
|
|
# dependencies, not ours — nothing above the data layer touches them, and they
|
|
# only move when we deliberately resync the fork. See provider/PROVENANCE.md.
|
|
dmfsJems = "1.43"
|
|
dmfsRfc5545Datetime = "0.2.4"
|
|
dmfsLibRecur = "0.12.2"
|
|
# The provider's own test suite is JUnit 4 + Robolectric, unlike the app's
|
|
# JUnit 5. Kept as upstream wrote it (rewriting ~13 test classes would forfeit
|
|
# the regression coverage that makes vendoring safe), but on current versions:
|
|
# upstream pins Robolectric 3.5.1, which predates AGP's resource handling.
|
|
robolectric = "4.16"
|
|
junit4 = "4.13.2"
|
|
hamcrest = "3.0"
|
|
mockito = "5.20.0"
|
|
|
|
[libraries]
|
|
# AndroidX core
|
|
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
|
|
androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" }
|
|
androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "lifecycleRuntime" }
|
|
androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" }
|
|
|
|
# Compose BOM + libs
|
|
androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" }
|
|
androidx-ui = { group = "androidx.compose.ui", name = "ui" }
|
|
androidx-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" }
|
|
androidx-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" }
|
|
androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" }
|
|
androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" }
|
|
androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" }
|
|
|
|
# Material 3 (Expressive lives in this artifact for 1.5+)
|
|
androidx-material3 = { group = "androidx.compose.material3", name = "material3", version.ref = "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" }
|
|
|
|
# Hilt
|
|
hilt-android = { group = "com.google.dagger", name = "hilt-android", version.ref = "hilt" }
|
|
hilt-compiler = { group = "com.google.dagger", name = "hilt-android-compiler", version.ref = "hilt" }
|
|
|
|
# Room — the own-store database
|
|
androidx-room-runtime = { group = "androidx.room", name = "room-runtime", version.ref = "room" }
|
|
androidx-room-ktx = { group = "androidx.room", name = "room-ktx", version.ref = "room" }
|
|
androidx-room-compiler = { group = "androidx.room", name = "room-compiler", version.ref = "room" }
|
|
androidx-room-testing = { group = "androidx.room", name = "room-testing", version.ref = "room" }
|
|
|
|
# DataStore
|
|
androidx-datastore-preferences = { group = "androidx.datastore", name = "datastore-preferences", version.ref = "datastore" }
|
|
|
|
# SAF — writing the export into a user-chosen folder
|
|
androidx-documentfile = { group = "androidx.documentfile", name = "documentfile", version.ref = "documentfile" }
|
|
|
|
# Unit tests
|
|
junit-jupiter-api = { group = "org.junit.jupiter", name = "junit-jupiter-api", version.ref = "junit" }
|
|
junit-jupiter-engine = { group = "org.junit.jupiter", name = "junit-jupiter-engine", version.ref = "junit" }
|
|
junit-platform-launcher = { group = "org.junit.platform", name = "junit-platform-launcher", version.ref = "junitPlatform" }
|
|
truth = { group = "com.google.truth", name = "truth", version.ref = "truth" }
|
|
|
|
# Android tests
|
|
androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "androidxJunit" }
|
|
androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" }
|
|
|
|
# Domain time
|
|
kotlinx-datetime = { group = "org.jetbrains.kotlinx", name = "kotlinx-datetime", version.ref = "kotlinxDatetime" }
|
|
|
|
# Coroutines (transitively pulled by hilt-android, pinned explicit)
|
|
kotlinx-coroutines-core = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-core", version.ref = "kotlinxCoroutines" }
|
|
kotlinx-coroutines-test = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-test", version.ref = "kotlinxCoroutines" }
|
|
|
|
# Test - Flow assertions
|
|
turbine = { group = "app.cash.turbine", name = "turbine", version.ref = "turbine" }
|
|
|
|
# Hilt navigation-compose (for hiltViewModel() in Composables)
|
|
androidx-hilt-navigation-compose = { group = "androidx.hilt", name = "hilt-navigation-compose", version.ref = "hiltNavigationCompose" }
|
|
|
|
# Navigation-compose (the NavHost / back stack)
|
|
androidx-navigation-compose = { group = "androidx.navigation", name = "navigation-compose", version.ref = "navigationCompose" }
|
|
|
|
# Lifecycle compose (for collectAsStateWithLifecycle)
|
|
androidx-lifecycle-runtime-compose = { group = "androidx.lifecycle", name = "lifecycle-runtime-compose", version.ref = "lifecycleCompose" }
|
|
# ProcessLifecycleOwner — the WAL checkpoint hangs off ON_STOP.
|
|
androidx-lifecycle-process = { group = "androidx.lifecycle", name = "lifecycle-process", version.ref = "lifecycleRuntime" }
|
|
|
|
# Glance — Jetpack home-screen widgets (Compose-like RemoteViews)
|
|
androidx-glance-appwidget = { group = "androidx.glance", name = "glance-appwidget", version.ref = "glance" }
|
|
androidx-glance-material3 = { group = "androidx.glance", name = "glance-material3", version.ref = "glance" }
|
|
|
|
# Android tests - GrantPermissionRule
|
|
androidx-test-rules = { group = "androidx.test", name = "rules", version.ref = "androidxTestRules" }
|
|
|
|
# :provider — vendored dmfs task provider (see provider/PROVENANCE.md)
|
|
dmfs-jems = { group = "org.dmfs", name = "jems", version.ref = "dmfsJems" }
|
|
dmfs-jems-testing = { group = "org.dmfs", name = "jems-testing", version.ref = "dmfsJems" }
|
|
dmfs-rfc5545-datetime = { group = "org.dmfs", name = "rfc5545-datetime", version.ref = "dmfsRfc5545Datetime" }
|
|
dmfs-lib-recur = { group = "org.dmfs", name = "lib-recur", version.ref = "dmfsLibRecur" }
|
|
robolectric = { group = "org.robolectric", name = "robolectric", version.ref = "robolectric" }
|
|
junit4 = { group = "junit", name = "junit", version.ref = "junit4" }
|
|
hamcrest = { group = "org.hamcrest", name = "hamcrest", version.ref = "hamcrest" }
|
|
mockito-core = { group = "org.mockito", name = "mockito-core", version.ref = "mockito" }
|
|
|
|
[plugins]
|
|
android-application = { id = "com.android.application", version.ref = "agp" }
|
|
android-library = { id = "com.android.library", version.ref = "agp" }
|
|
kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
|
|
ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" }
|
|
hilt = { id = "com.google.dagger.hilt.android", version.ref = "hilt" }
|