Files
Mealient/gradle/libs.versions.toml
Kirill Kamakin 1e5e727e92 Implement shopping lists screen (#129)
* Initialize shopping lists feature

* Start shopping lists screen with Compose

* Add icon to shopping list name

* Add shopping lists to menu

* Set max size for the list

* Replace compose-adapter with accompanist

* Remove unused fields from shopping lists response

* Show list of shopping lists from BE

* Hide shopping lists if Mealie is 0.5.6

* Add shopping list item click listener

* Create material app theme for Compose

* Use shorter names

* Load shopping lists by pages and save to db

* Make page handling logic match recipes

* Add swipe to refresh to shopping lists

* Extract SwipeToRefresh Composable

* Make LazyPagingColumn generic

* Show refresh only when mediator is refreshing

* Do not refresh automatically

* Allow controlling Activity state from modules

* Implement navigating to shopping list screen

* Move Compose libraries setup to a plugin

* Implement loading full shopping list info

* Move Storage classes to database module

* Save shopping list items to DB

* Use separate names for separate ids

* Do only one DB version update

* Use unique names for all columns

* Display shopping list items

* Move OperationUiState to ui module

* Subscribe to shopping lists updates

* Indicate progress with progress bar

* Use strings from resources

* Format shopping list item quantities

* Hide unit/food/note/quantity if they are not set

* Implement updating shopping list item checked state

* Remove unnecessary null checks

* Disable checkbox when it is being updated

* Split shopping list screen into composables

* Show items immediately if they are saved

* Fix showing "list is empty" before the items

* Show Snackbar when error happens

* Reduce shopping list items paddings

* Remove shopping lists when URL is changed

* Add error/empty state handling to shopping lists

* Fix empty error state

* Fix tests compilation

* Add margin between text and button

* Add divider between checked and unchecked items

* Move divider to the item

* Refresh the shopping lists on authentication

* Use retry when necessary

* Remove excessive logging

* Fix pages bounds check

* Move FlowExtensionsTest

* Update Compose version

* Fix showing loading indicator for shopping lists

* Add Russian translation

* Fix SDK version lint check

* Rename parameter to match interface

* Add DB migration TODO

* Get rid of DB migrations

* Do not use pagination with shopping lists

* Cleanup after the pagination removal

* Load shopping list items

* Remove shopping lists storage

* Rethrow CancellationException in LoadingHelper

* Add pull-to-refresh on shopping list screen

* Extract LazyColumnWithLoadingState

* Split refresh errors and loading state

* Reuse LazyColumnWithLoadingState for shopping list items

* Remove paging-compose dependency

* Refresh shopping list items on authentication

* Disable missing translation lint check

* Update Compose and Kotlin versions

* Fix order of checked items

* Hide useless information from a shopping list item
2023-07-03 15:07:19 +02:00

211 lines
13 KiB
TOML

[versions]
# https://maven.google.com/web/index.html?q=com.android.tools.build#com.android.tools.build:gradle
androidGradlePlugin = "7.4.2"
# https://github.com/JetBrains/kotlin/releases
kotlin = "1.8.22"
# https://developer.android.com/jetpack/androidx/releases/navigation
googleNavigation = "2.5.3"
# https://dagger.dev/hilt/gradle-setup
hilt = "2.45"
# https://github.com/protocolbuffers/protobuf/releases
protobuf = "3.22.2"
# https://github.com/google/protobuf-gradle-plugin/releases
protobufPlugin = "0.9.1"
# https://plugins.gradle.org/plugin/org.sonarqube
sonarqube = "4.0.0.2929"
# https://plugins.gradle.org/plugin/nl.neotech.plugin.rootcoverage
rootCoverage = "1.6.0"
# https://plugins.gradle.org/plugin/com.guardsquare.appsweep
appsweep = "1.4.0"
# https://github.com/material-components/material-components-android/releases
material = "1.8.0"
# https://developer.android.com/kotlin/ktx#core
coreKtx = "1.9.0"
# https://developer.android.com/jetpack/androidx/releases/appcompat
appcompat = "1.6.1"
# https://developer.android.com/jetpack/androidx/releases/constraintlayout
contraintLayout = "2.1.4"
# https://developer.android.com/jetpack/androidx/releases/swiperefreshlayout
swipeRefreshLayout = "1.1.0"
# https://developer.android.com/jetpack/androidx/releases/core
splashScreen = "1.0.0"
# https://developer.android.com/jetpack/androidx/releases/lifecycle
lifecycle = "2.6.1"
# https://developer.android.com/jetpack/androidx/releases/arch-core
coreTesting = "2.2.0"
# https://github.com/square/retrofit/tags
retrofit = "2.9.0"
# https://github.com/JakeWharton/retrofit2-kotlinx-serialization-converter/tags
retrofitKotlinxSerialization = "0.8.0"
# https://github.com/Kotlin/kotlinx.serialization/releases
kotlinxSerialization = "1.5.0"
# https://github.com/square/okhttp/tags
okhttp = "4.10.0"
# https://developer.android.com/jetpack/androidx/releases/paging
paging = "3.1.1"
# https://developer.android.com/jetpack/androidx/releases/room
room = "2.5.1"
# https://github.com/Kotlin/kotlinx-datetime/releases
kotlinxDatetime = "0.4.0"
# https://github.com/bumptech/glide/releases
glide = "4.15.1"
# https://github.com/androidbroadcast/ViewBindingPropertyDelegate/releases
viewBindingDelegate = "1.5.9"
# https://developer.android.com/jetpack/androidx/releases/datastore
datastore = "1.0.0"
# https://developer.android.com/jetpack/androidx/releases/security
security = "1.0.0"
# https://github.com/junit-team/junit4/releases
junit = "4.13.2"
# https://developer.android.com/jetpack/androidx/releases/test
junitKtx = "1.1.5"
# https://github.com/Kotlin/kotlinx.coroutines/releases
coroutines = "1.6.4"
# https://github.com/robolectric/robolectric/releases
robolectric = "4.9.2"
# https://mvnrepository.com/artifact/com.google.truth/truth
truth = "1.1.3"
# https://mockk.io/
mockk = "1.13.4"
# https://github.com/square/leakcanary/releases
leakcanary = "2.10"
# https://github.com/ChuckerTeam/chucker/releases
chucker = "3.5.2"
# https://github.com/google/desugar_jdk_libs/blob/master/CHANGELOG.md
desugar = "2.0.3"
# https://github.com/google/ksp/releases
kspPlugin = "1.8.22-1.0.11"
# https://developer.android.com/jetpack/androidx/releases/sharetarget
shareTarget = "1.2.0"
# https://github.com/KasperskyLab/Kaspresso/releases
kaspresso = "1.5.1"
# https://developer.android.com/jetpack/androidx/releases/test
androidXTest = "1.5.0"
# https://developer.android.com/jetpack/androidx/releases/test
androidXTestOrchestrator = "1.4.2"
# https://mvnrepository.com/artifact/androidx.compose/compose-bom
composeBom = "2023.06.01"
# https://developer.android.com/jetpack/androidx/releases/compose-kotlin
composeKotlinCompilerExtension = "1.4.8"
# https://google.github.io/accompanist/
accompanistVersion = "0.30.1"
# https://developer.android.com/jetpack/androidx/releases/compose-material
materialCompose = "1.4.3"
# https://composedestinations.rafaelcosta.xyz/setup
composeDestinations = "1.8.42-beta"
# https://mvnrepository.com/artifact/androidx.hilt/hilt-navigation-compose
hiltNavigationCompose = "1.0.0"
[libraries]
android-gradlePlugin = { group = "com.android.tools.build", name = "gradle", version.ref = "androidGradlePlugin" }
android-tools-desugar = { group = "com.android.tools", name = "desugar_jdk_libs", version.ref = "desugar" }
android-material-material = { group = "com.google.android.material", name = "material", version.ref = "material" }
androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" }
androidx-compose-material3 = { group = "androidx.compose.material3", name = "material3" }
androidx-compose-ui-toolingPreview = { group = "androidx.compose.ui", name = "ui-tooling-preview" }
androidx-compose-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" }
androidx-compose-ui-testJunit = { group = "androidx.compose.ui", name = "ui-test-junit4" }
androidx-compose-ui-testManifest = { group = "androidx.compose.ui", name = "ui-test-manifest" }
androidx-compose-runtime-livedata = { group = "androidx.compose.runtime", name = "runtime-livedata" }
androidx-compose-material = { group = "androidx.compose.material", name = "material", version.ref = "materialCompose" }
google-accompanist-themeadapter-material3 = { group = "com.google.accompanist", name = "accompanist-themeadapter-material3", version.ref = "accompanistVersion" }
google-dagger-hiltPlugin = { group = "com.google.dagger", name = "hilt-android-gradle-plugin", version.ref = "hilt" }
google-dagger-hiltAndroid = { group = "com.google.dagger", name = "hilt-android", version.ref = "hilt" }
google-dagger-hiltCompiler = { group = "com.google.dagger", name = "hilt-compiler", version.ref = "hilt" }
google-dagger-hiltAndroidCompiler = { group = "com.google.dagger", name = "hilt-android-compiler", version.ref = "hilt" }
google-dagger-hiltAndroidTesting = { group = "com.google.dagger", name = "hilt-android-testing", version.ref = "hilt" }
androidx-hilt-navigationCompose = { group = "androidx.hilt", name = "hilt-navigation-compose", version.ref = "hiltNavigationCompose" }
google-protobuf-javalite = { group = "com.google.protobuf", name = "protobuf-javalite", version.ref = "protobuf" }
google-protobuf-protoc = { group = "com.google.protobuf", name = "protoc", version.ref = "protobuf" }
google-truth = { group = "com.google.truth", name = "truth", version.ref = "truth" }
jetbrains-kotlinPlugin = { group = "org.jetbrains.kotlin", name = "kotlin-gradle-plugin", version.ref = "kotlin" }
jetbrains-serializationPlugin = { group = "org.jetbrains.kotlin", name = "kotlin-serialization", version.ref = "kotlin" }
jetbrains-kotlinx-serialization = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version.ref = "kotlinxSerialization" }
jetbrains-kotlinx-datetime = { group = "org.jetbrains.kotlinx", name = "kotlinx-datetime", version.ref = "kotlinxDatetime" }
jetbrains-kotlinx-coroutinesAndroid = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-android", version.ref = "coroutines" }
jetbrains-kotlinx-coroutinesTest = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-test", version.ref = "coroutines" }
androidx-navigation-safeArgsPlugin = { group = "androidx.navigation", name = "navigation-safe-args-gradle-plugin", version.ref = "googleNavigation" }
androidx-navigation-fragmentKtx = { group = "androidx.navigation", name = "navigation-fragment-ktx", version.ref = "googleNavigation" }
androidx-navigation-runtimeKtx = { group = "androidx.navigation", name = "navigation-runtime-ktx", version.ref = "googleNavigation" }
androidx-navigation-uiKtx = { group = "androidx.navigation", name = "navigation-ui-ktx", version.ref = "googleNavigation" }
androidx-coreKtx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" }
androidx-constraintLayout = { group = "androidx.constraintlayout", name = "constraintlayout", version.ref = "contraintLayout" }
androidx-swipeRefreshLayout = { group = "androidx.swiperefreshlayout", name = "swiperefreshlayout", version.ref = "swipeRefreshLayout" }
androidx-splashScreen = { group = "androidx.core", name = "core-splashscreen", version.ref = "splashScreen" }
androidx-coreTesting = { group = "androidx.arch.core", name = "core-testing", version.ref = "coreTesting" }
androidx-shareTarget = { group = "androidx.sharetarget", name = "sharetarget", version.ref = "shareTarget" }
androidx-paging-runtimeKtx = { group = "androidx.paging", name = "paging-runtime-ktx", version.ref = "paging" }
androidx-paging-commonKtx = { group = "androidx.paging", name = "paging-common-ktx", version.ref = "paging" }
androidx-lifecycle-livedataKtx = { group = "androidx.lifecycle", name = "lifecycle-livedata-ktx", version.ref = "lifecycle" }
androidx-lifecycle-viewmodelKtx = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-ktx", version.ref = "lifecycle" }
androidx-lifecycle-viewmodelCompose = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose", version.ref = "lifecycle" }
androidx-datastore-preferences = { group = "androidx.datastore", name = "datastore-preferences", version.ref = "datastore" }
androidx-datastore-datastore = { group = "androidx.datastore", name = "datastore", version.ref = "datastore" }
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-paging = { group = "androidx.room", name = "room-paging", 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" }
androidx-test-junit = { group = "androidx.test.ext", name = "junit-ktx", version.ref = "junitKtx" }
androidx-security-crypto = { group = "androidx.security", name = "security-crypto", version.ref = "security" }
androidx-test-core = { group = "androidx.test", name = "core", version.ref = "androidXTest" }
androidx-test-rules = { group = "androidx.test", name = "rules", version.ref = "androidXTest" }
androidx-test-runner = { group = "androidx.test", name = "runner", version.ref = "androidXTest" }
androidx-test-orchestrator = { group = "androidx.test", name = "orchestrator", version.ref = "androidXTestOrchestrator" }
jakewharton-retrofitSerialization = { group = "com.jakewharton.retrofit", name = "retrofit2-kotlinx-serialization-converter", version.ref = "retrofitKotlinxSerialization" }
squareup-retrofit = { group = "com.squareup.retrofit2", name = "retrofit", version.ref = "retrofit" }
squareup-leakcanary = { group = "com.squareup.leakcanary", name = "leakcanary-android", version.ref = "leakcanary" }
okhttp3-bom = { group = "com.squareup.okhttp3", name = "okhttp-bom", version.ref = "okhttp" }
okhttp3-okhttp = { group = "com.squareup.okhttp3", name = "okhttp" }
okhttp3-loggingInterceptor = { group = "com.squareup.okhttp3", name = "logging-interceptor" }
okhttp3-mockwebserver = { group = "com.squareup.okhttp3", name = "mockwebserver", version.ref = "okhttp" }
bumptech-glide-glide = { group = "com.github.bumptech.glide", name = "glide", version.ref = "glide" }
bumptech-glide-okhttp3 = { group = "com.github.bumptech.glide", name = "okhttp3-integration", version.ref = "glide" }
bumptech-glide-recyclerview = { group = "com.github.bumptech.glide", name = "recyclerview-integration", version.ref = "glide" }
bumptech-glide-ksp = { group = "com.github.bumptech.glide", name = "ksp", version.ref = "glide" }
kirich1409-viewBinding = { group = "com.github.kirich1409", name = "viewbindingpropertydelegate-noreflection", version.ref = "viewBindingDelegate" }
junit = { group = "junit", name = "junit", version.ref = "junit" }
robolectric = { group = "org.robolectric", name = "robolectric", version.ref = "robolectric" }
io-mockk = { group = "io.mockk", name = "mockk", version.ref = "mockk" }
chuckerteam-chucker = { group = "com.github.chuckerteam.chucker", name = "library", version.ref = "chucker" }
kaspersky-kaspresso = { group = "com.kaspersky.android-components", name = "kaspresso", version.ref = "kaspresso" }
composeDestinations-core = { group = "io.github.raamcosta.compose-destinations", name = "core", version.ref = "composeDestinations" }
composeDestinations-ksp = { group = "io.github.raamcosta.compose-destinations", name = "ksp", version.ref = "composeDestinations" }
[plugins]
sonarqube = { id = "org.sonarqube", version.ref = "sonarqube" }
rootcoverage = { id = "nl.neotech.plugin.rootcoverage", version.ref = "rootCoverage" }
appsweep = { id = "com.guardsquare.appsweep", version.ref = "appsweep" }
ksp = { id = "com.google.devtools.ksp", version.ref = "kspPlugin" }
protobuf = { id = "com.google.protobuf", version.ref = "protobufPlugin" }