diff --git a/README.md b/README.md index 410f24ad3..f0c5ad823 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,9 @@ This project brings to table set of best practices, tools, and solutions: * Static analysis tools * Dependency Injection * Material design +* Gradle + * [Dependency locks](https://docs.gradle.org/current/userguide/dependency_locking.html) + * [Versions catalog](https://docs.gradle.org/7.0-milestone-1/userguide/platforms.html) ## Tech-stack @@ -149,27 +152,40 @@ Below diagram presents application data flow when a user interacts with `album l ![app_data_flow](https://github.com/igorwojda/android-showcase/blob/master/misc/image/app_data_flow.png?raw=true) -## External dependencies +## Dependency management + +This project utilizes multiple mechanics to eaisly share the same versions of dependencies. +### App library dependencies + +External dependencies (libraries) are defined using [versions catalog](https://docs.gradle.org/7.0-milestone-1/userguide/platforms.html) feature in the [settings.gradle](./settings.gradle) file. These dynamic library versions are locked using Gradle [docking dependency](https://docs.gradle.org/current/userguide/dependency_locking.html) mechanism - concrete dependency versions are stored in `MODULE_NAME/gradle.lockfile` files. + +To update lock files run `gw :app:assembleDebug --write-locks` command and commit updated `gradle.lockfile` files to repository. -All the external dependencies (external libraries) are defined in the single place - Gradle `buildSrc` folder. This approach allows to easily -manage dependencies and use the same dependency version across all modules. Because each feature module depends on the `app` module -we can easily share all core dependencies without redefining them in each feature module. +Each feature module depends on the `app` module, so dependencies are shared without need to add them explicitly in each feature module. -[and more...](https://github.com/igorwojda/android-showcase/blob/master/buildSrc/src/main/kotlin/LibraryDependency.kt) +### Gradle plugin dependencies +External dependencies (external libraries) are defined using [pluginManagement](https://docs.gradle.org/current/userguide/plugins.html#sec:plugin_management). Dependency definitions are stored in the [settings.gradle](./settings.gradle) file. + +Dynamic versions aren't supported for Gradle plugins, so [docking dependency](https://docs.gradle.org/current/userguide/dependency_locking.html) mechanism can't be used (like for app library dependencies), and thus versions of some libraries & plugins have to be hardcoded in the [gradle.properties](./gradle.properties) file. +### Shared dependencies + +Gradle is missing proper build-in mechanism to share dependency versions between app library dependency and Gradle plugin dependency eg. [Navigation component](https://developer.android.com/guide/navigation/navigation-getting-started) library uses [Safe Args](https://developer.android.com/guide/navigation/navigation-pass-data#Safe-args) Gradle plugin with the same version. + +To enable sharing all versions that are used for both plugins and librares are defined in [gradle.properties](./gradle.properties). + +Unfortunately this technique cannot be applied to older Gradle plugins (usingadded by `classpath`, not by `pluginManagament`), so some version in the [gradle.properties](./gradle.properties) are still duplicated. ## Ci pipeline -[CI pipeline](https://github.com/igorwojda/android-showcase/tree/master/.github/workflows) verifies project correctness which each PR. -All of the tasks run in parallel: +CI Pipeline is utilizing [GitHub Actions](https://github.com/features/actions). Complete GitHub Actions config is located in the [.github/workflows](https://github.com/igorwojda/android-showcase/tree/master/.github/workflows) folder. -These are all of the Gradle tasks that are [GitHub Actions](https://github.com/features/actions): +Series of workflows runs (in parallel) for every opened PR and after merging PR to the `master` branch: * `./gradlew lintDebug` - runs Android lint * `./gradlew detekt` - runs detekt * `./gradlew ktlintCheck` - runs ktlint * `./gradlew testDebugUnitTest` - run unit tests * `./gradlew connectedCheck` - run UI tests * `./gradlew :app:bundleDebug` - create app bundle - ### Design decisions Read related articles to have a better understanding of underlying design decisions and various trade-offs. @@ -228,6 +244,7 @@ Other high-quality projects will help you to find solutions that work for your p * [Roxie](https://github.com/ww-tech/roxie) - solid example of `common state` approach together witch very good documentation * [Kotlin Android template](https://github.com/cortinico/kotlin-android-template) - template that lets you create an Android/Kotlin project and be up and running in a few seconds. +* Gradle dependencies can't be eaisly shared between app librares and Gradle plugins https://github.com/gradle/gradle/issues/16077 ## Known issues - `ktlint` `import-ordering` rule conflicts with IDE default formatting rule, so it have to be [disabled](.editorconfig). This is partially fixed in AS 4.2 (see [527](https://github.com/pinterest/ktlint/issues/527) and [KT-10974](https://youtrack.jetbrains.com/issue/KT-10974)) diff --git a/app/gradle.lockfile b/app/gradle.lockfile new file mode 100644 index 000000000..a1170b5b1 --- /dev/null +++ b/app/gradle.lockfile @@ -0,0 +1,103 @@ +# This is a Gradle generated file for dependency locking. +# Manual edits can break the build and are not advised. +# This file is expected to be part of source control. +androidx.activity:activity-ktx:1.2.0=debugCompileClasspath,debugRuntimeClasspath +androidx.activity:activity:1.2.0=debugCompileClasspath,debugRuntimeClasspath +androidx.annotation:annotation-experimental:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.annotation:annotation:1.2.0-beta01=debugCompileClasspath,debugRuntimeClasspath +androidx.appcompat:appcompat-resources:1.3.0-beta01=debugCompileClasspath,debugRuntimeClasspath +androidx.appcompat:appcompat:1.3.0-beta01=debugCompileClasspath,debugRuntimeClasspath +androidx.arch.core:core-common:2.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.arch.core:core-runtime:2.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.cardview:cardview:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.collection:collection-ktx:1.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.collection:collection:1.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.constraintlayout:constraintlayout-core:1.0.0-alpha3=debugCompileClasspath,debugRuntimeClasspath +androidx.constraintlayout:constraintlayout:2.1.0-alpha2=debugCompileClasspath,debugRuntimeClasspath +androidx.coordinatorlayout:coordinatorlayout:1.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.core:core-ktx:1.5.0-beta01=debugCompileClasspath,debugRuntimeClasspath +androidx.core:core:1.5.0-beta01=debugCompileClasspath,debugRuntimeClasspath +androidx.cursoradapter:cursoradapter:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.customview:customview:1.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.databinding:viewbinding:4.1.2=debugCompileClasspath,debugRuntimeClasspath +androidx.documentfile:documentfile:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.drawerlayout:drawerlayout:1.1.1=debugCompileClasspath,debugRuntimeClasspath +androidx.dynamicanimation:dynamicanimation:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.exifinterface:exifinterface:1.3.2=debugRuntimeClasspath +androidx.fragment:fragment-ktx:1.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.fragment:fragment:1.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.interpolator:interpolator:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.legacy:legacy-support-core-utils:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-common-java8:2.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-common:2.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-livedata-core-ktx:2.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-livedata-core:2.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-livedata-ktx:2.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-livedata:2.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-runtime-ktx:2.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-runtime:2.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-viewmodel-savedstate:2.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-viewmodel:2.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.loader:loader:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.localbroadcastmanager:localbroadcastmanager:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.navigation:navigation-common-ktx:2.3.3=debugCompileClasspath,debugRuntimeClasspath +androidx.navigation:navigation-common:2.3.3=debugCompileClasspath,debugRuntimeClasspath +androidx.navigation:navigation-dynamic-features-fragment:2.3.3=debugCompileClasspath,debugRuntimeClasspath +androidx.navigation:navigation-dynamic-features-runtime:2.3.3=debugCompileClasspath,debugRuntimeClasspath +androidx.navigation:navigation-fragment-ktx:2.3.3=debugCompileClasspath,debugRuntimeClasspath +androidx.navigation:navigation-fragment:2.3.3=debugCompileClasspath,debugRuntimeClasspath +androidx.navigation:navigation-runtime-ktx:2.3.3=debugCompileClasspath,debugRuntimeClasspath +androidx.navigation:navigation-runtime:2.3.3=debugCompileClasspath,debugRuntimeClasspath +androidx.navigation:navigation-ui-ktx:2.3.3=debugCompileClasspath,debugRuntimeClasspath +androidx.navigation:navigation-ui:2.3.3=debugCompileClasspath,debugRuntimeClasspath +androidx.print:print:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.recyclerview:recyclerview:1.2.0-beta01=debugCompileClasspath,debugRuntimeClasspath +androidx.savedstate:savedstate-ktx:1.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.savedstate:savedstate:1.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.tracing:tracing:1.0.0=debugRuntimeClasspath +androidx.transition:transition:1.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.vectordrawable:vectordrawable-animated:1.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.vectordrawable:vectordrawable:1.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.versionedparcelable:versionedparcelable:1.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.viewpager2:viewpager2:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.viewpager:viewpager:1.0.0=debugCompileClasspath,debugRuntimeClasspath +com.airbnb.android:lottie:2.8.0=debugCompileClasspath,debugRuntimeClasspath +com.android.tools.build:aapt2:4.1.2-6503028=_internal_aapt2_binary +com.facebook.stetho:stetho-okhttp3:1.5.0=debugCompileClasspath,debugRuntimeClasspath +com.facebook.stetho:stetho:1.5.0=debugCompileClasspath,debugRuntimeClasspath +com.google.android.material:material:1.3.0=debugCompileClasspath,debugRuntimeClasspath +com.google.android.play:core:1.9.1=debugCompileClasspath,debugRuntimeClasspath +com.google.code.findbugs:jsr305:2.0.1=debugCompileClasspath,debugRuntimeClasspath +com.jakewharton.timber:timber:4.7.1=debugCompileClasspath,debugRuntimeClasspath +com.squareup.moshi:moshi:1.8.0=debugCompileClasspath,debugRuntimeClasspath +com.squareup.okhttp3:logging-interceptor:4.10.0-RC1=debugCompileClasspath,debugRuntimeClasspath +com.squareup.okhttp3:okhttp:4.10.0-RC1=debugCompileClasspath,debugRuntimeClasspath +com.squareup.okio:okio:2.10.0=debugCompileClasspath,debugRuntimeClasspath +com.squareup.retrofit2:converter-moshi:2.9.0=debugCompileClasspath,debugRuntimeClasspath +com.squareup.retrofit2:retrofit:2.9.0=debugCompileClasspath,debugRuntimeClasspath +commons-cli:commons-cli:1.2=debugCompileClasspath,debugRuntimeClasspath +io.coil-kt:coil-base:1.1.1=debugCompileClasspath,debugRuntimeClasspath +io.coil-kt:coil:1.1.1=debugCompileClasspath,debugRuntimeClasspath +org.jetbrains.intellij.deps:trove4j:1.0.20181211=kotlinCompilerClasspath +org.jetbrains.kotlin:kotlin-android-extensions-runtime:1.4.21=debugRuntimeClasspath +org.jetbrains.kotlin:kotlin-compiler-embeddable:1.4.30=kotlinCompilerClasspath +org.jetbrains.kotlin:kotlin-daemon-embeddable:1.4.30=kotlinCompilerClasspath +org.jetbrains.kotlin:kotlin-parcelize-runtime:1.4.21=debugRuntimeClasspath +org.jetbrains.kotlin:kotlin-reflect:1.4.30=debugCompileClasspath,debugRuntimeClasspath,kotlinCompilerClasspath +org.jetbrains.kotlin:kotlin-script-runtime:1.4.30=kotlinCompilerClasspath +org.jetbrains.kotlin:kotlin-stdlib-common:1.4.30=debugCompileClasspath,debugRuntimeClasspath,kotlinCompilerClasspath +org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.4.10=debugCompileClasspath,debugRuntimeClasspath +org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.10=debugCompileClasspath,debugRuntimeClasspath +org.jetbrains.kotlin:kotlin-stdlib:1.4.30=debugCompileClasspath,debugRuntimeClasspath,kotlinCompilerClasspath +org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.2=debugCompileClasspath,debugRuntimeClasspath +org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.4.2=debugCompileClasspath,debugRuntimeClasspath +org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2=debugCompileClasspath,debugRuntimeClasspath +org.jetbrains:annotations:13.0=kotlinCompilerClasspath +org.jetbrains:annotations:16.0.1=debugCompileClasspath,debugRuntimeClasspath +org.kodein.di:kodein-di-core-jvm:6.5.5=debugCompileClasspath,debugRuntimeClasspath +org.kodein.di:kodein-di-core:6.5.5=debugCompileClasspath,debugRuntimeClasspath +org.kodein.di:kodein-di-framework-android-core:6.5.5=debugCompileClasspath,debugRuntimeClasspath +org.kodein.di:kodein-di-framework-android-x:6.5.5=debugCompileClasspath,debugRuntimeClasspath +org.kodein.di:kodein-di-generic-jvm:6.5.5=debugCompileClasspath,debugRuntimeClasspath +empty=debugAnnotationProcessorClasspath,debugReverseMetadataValues,kotlinCompilerPluginClasspath diff --git a/build.gradle.kts b/build.gradle.kts index 777850a65..385abaf5c 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -13,6 +13,10 @@ plugins { id(GradlePluginId.SAFE_ARGS) apply false } +dependencyLocking { + lockAllConfigurations() +} + // all projects = root project + sub projects allprojects { repositories { @@ -41,6 +45,12 @@ allprojects { exclude { element -> element.file.path.contains("generated/") } } } + + // Gradle dependency locking - lock all configurations of the app + // More: https://docs.gradle.org/current/userguide/dependency_locking.html + dependencyLocking { + lockAllConfigurations() + } } subprojects { @@ -73,13 +83,12 @@ tasks.withType { kotlinOptions.jvmTarget = JavaVersion.VERSION_1_8.toString() } +/* +Mimics all static checks that run on CI. +Note that this task is intended to run locally (not on CI), because on CI we prefer to have parallel execution +and separate reports for each of the checks (multiple statuses eg. on github PR page). + */ task("staticCheck") { - description = - """Mimics all static checks that run on CI. - Note that this task is intended to run locally (not on CI), because on CI we prefer to have parallel execution - and separate reports for each check (multiple statuses eg. on github PR page). - """.trimMargin() - group = "verification" afterEvaluate { // Filter modules with "lintDebug" task (non-Android modules do not have lintDebug task) diff --git a/feature_album/gradle.lockfile b/feature_album/gradle.lockfile new file mode 100644 index 000000000..e8f90f90d --- /dev/null +++ b/feature_album/gradle.lockfile @@ -0,0 +1,97 @@ +# This is a Gradle generated file for dependency locking. +# Manual edits can break the build and are not advised. +# This file is expected to be part of source control. +androidx.activity:activity-ktx:1.2.0=debugCompileClasspath,debugRuntimeClasspath +androidx.activity:activity:1.2.0=debugCompileClasspath,debugRuntimeClasspath +androidx.annotation:annotation-experimental:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.annotation:annotation:1.2.0-beta01=debugCompileClasspath,debugRuntimeClasspath +androidx.appcompat:appcompat-resources:1.3.0-beta01=debugCompileClasspath,debugRuntimeClasspath +androidx.appcompat:appcompat:1.3.0-beta01=debugCompileClasspath,debugRuntimeClasspath +androidx.arch.core:core-common:2.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.arch.core:core-runtime:2.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.cardview:cardview:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.collection:collection-ktx:1.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.collection:collection:1.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.constraintlayout:constraintlayout-core:1.0.0-alpha3=debugCompileClasspath,debugRuntimeClasspath +androidx.constraintlayout:constraintlayout:2.1.0-alpha2=debugCompileClasspath,debugRuntimeClasspath +androidx.coordinatorlayout:coordinatorlayout:1.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.core:core-ktx:1.5.0-beta01=debugCompileClasspath,debugRuntimeClasspath +androidx.core:core:1.5.0-beta01=debugCompileClasspath,debugRuntimeClasspath +androidx.cursoradapter:cursoradapter:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.customview:customview:1.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.databinding:viewbinding:4.1.2=debugCompileClasspath,debugRuntimeClasspath +androidx.documentfile:documentfile:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.drawerlayout:drawerlayout:1.1.1=debugCompileClasspath,debugRuntimeClasspath +androidx.dynamicanimation:dynamicanimation:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.exifinterface:exifinterface:1.3.2=debugRuntimeClasspath +androidx.fragment:fragment-ktx:1.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.fragment:fragment:1.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.interpolator:interpolator:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.legacy:legacy-support-core-utils:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-common-java8:2.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-common:2.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-livedata-core-ktx:2.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-livedata-core:2.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-livedata-ktx:2.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-livedata:2.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-runtime-ktx:2.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-runtime:2.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-viewmodel-savedstate:2.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-viewmodel:2.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.loader:loader:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.localbroadcastmanager:localbroadcastmanager:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.navigation:navigation-common-ktx:2.3.3=debugCompileClasspath,debugRuntimeClasspath +androidx.navigation:navigation-common:2.3.3=debugCompileClasspath,debugRuntimeClasspath +androidx.navigation:navigation-dynamic-features-fragment:2.3.3=debugCompileClasspath,debugRuntimeClasspath +androidx.navigation:navigation-dynamic-features-runtime:2.3.3=debugCompileClasspath,debugRuntimeClasspath +androidx.navigation:navigation-fragment-ktx:2.3.3=debugCompileClasspath,debugRuntimeClasspath +androidx.navigation:navigation-fragment:2.3.3=debugCompileClasspath,debugRuntimeClasspath +androidx.navigation:navigation-runtime-ktx:2.3.3=debugCompileClasspath,debugRuntimeClasspath +androidx.navigation:navigation-runtime:2.3.3=debugCompileClasspath,debugRuntimeClasspath +androidx.navigation:navigation-ui-ktx:2.3.3=debugCompileClasspath,debugRuntimeClasspath +androidx.navigation:navigation-ui:2.3.3=debugCompileClasspath,debugRuntimeClasspath +androidx.print:print:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.recyclerview:recyclerview:1.2.0-beta01=debugCompileClasspath,debugRuntimeClasspath +androidx.savedstate:savedstate-ktx:1.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.savedstate:savedstate:1.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.tracing:tracing:1.0.0=debugRuntimeClasspath +androidx.transition:transition:1.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.vectordrawable:vectordrawable-animated:1.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.vectordrawable:vectordrawable:1.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.versionedparcelable:versionedparcelable:1.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.viewpager2:viewpager2:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.viewpager:viewpager:1.0.0=debugCompileClasspath,debugRuntimeClasspath +com.airbnb.android:lottie:2.8.0=debugCompileClasspath,debugRuntimeClasspath +com.facebook.stetho:stetho-okhttp3:1.5.0=debugCompileClasspath,debugRuntimeClasspath +com.facebook.stetho:stetho:1.5.0=debugCompileClasspath,debugRuntimeClasspath +com.google.android.material:material:1.3.0=debugCompileClasspath,debugRuntimeClasspath +com.google.android.play:core:1.9.1=debugCompileClasspath,debugRuntimeClasspath +com.google.code.findbugs:jsr305:2.0.1=debugCompileClasspath,debugRuntimeClasspath +com.jakewharton.timber:timber:4.7.1=debugCompileClasspath,debugRuntimeClasspath +com.squareup.moshi:moshi:1.8.0=debugCompileClasspath,debugRuntimeClasspath +com.squareup.okhttp3:logging-interceptor:4.10.0-RC1=debugCompileClasspath,debugRuntimeClasspath +com.squareup.okhttp3:okhttp:4.10.0-RC1=debugCompileClasspath,debugRuntimeClasspath +com.squareup.okio:okio:2.10.0=debugCompileClasspath,debugRuntimeClasspath +com.squareup.retrofit2:converter-moshi:2.9.0=debugCompileClasspath,debugRuntimeClasspath +com.squareup.retrofit2:retrofit:2.9.0=debugCompileClasspath,debugRuntimeClasspath +commons-cli:commons-cli:1.2=debugCompileClasspath,debugRuntimeClasspath +io.coil-kt:coil-base:1.1.1=debugCompileClasspath,debugRuntimeClasspath +io.coil-kt:coil:1.1.1=debugCompileClasspath,debugRuntimeClasspath +org.jetbrains.kotlin:kotlin-android-extensions-runtime:1.4.21=debugRuntimeClasspath +org.jetbrains.kotlin:kotlin-parcelize-runtime:1.4.21=debugRuntimeClasspath +org.jetbrains.kotlin:kotlin-reflect:1.4.30=debugCompileClasspath,debugRuntimeClasspath +org.jetbrains.kotlin:kotlin-stdlib-common:1.4.30=debugCompileClasspath,debugRuntimeClasspath +org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.4.10=debugCompileClasspath,debugRuntimeClasspath +org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.10=debugCompileClasspath,debugRuntimeClasspath +org.jetbrains.kotlin:kotlin-stdlib:1.4.30=debugCompileClasspath,debugRuntimeClasspath +org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.2=debugCompileClasspath,debugRuntimeClasspath +org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.4.2=debugCompileClasspath,debugRuntimeClasspath +org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2=debugCompileClasspath,debugRuntimeClasspath +org.jetbrains:annotations:16.0.1=debugCompileClasspath,debugRuntimeClasspath +org.kodein.di:kodein-di-core-jvm:6.5.5=debugCompileClasspath,debugRuntimeClasspath +org.kodein.di:kodein-di-core:6.5.5=debugCompileClasspath,debugRuntimeClasspath +org.kodein.di:kodein-di-framework-android-core:6.5.5=debugCompileClasspath,debugRuntimeClasspath +org.kodein.di:kodein-di-framework-android-x:6.5.5=debugCompileClasspath,debugRuntimeClasspath +org.kodein.di:kodein-di-generic-jvm:6.5.5=debugCompileClasspath,debugRuntimeClasspath +empty= diff --git a/feature_favourite/gradle.lockfile b/feature_favourite/gradle.lockfile new file mode 100644 index 000000000..e8f90f90d --- /dev/null +++ b/feature_favourite/gradle.lockfile @@ -0,0 +1,97 @@ +# This is a Gradle generated file for dependency locking. +# Manual edits can break the build and are not advised. +# This file is expected to be part of source control. +androidx.activity:activity-ktx:1.2.0=debugCompileClasspath,debugRuntimeClasspath +androidx.activity:activity:1.2.0=debugCompileClasspath,debugRuntimeClasspath +androidx.annotation:annotation-experimental:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.annotation:annotation:1.2.0-beta01=debugCompileClasspath,debugRuntimeClasspath +androidx.appcompat:appcompat-resources:1.3.0-beta01=debugCompileClasspath,debugRuntimeClasspath +androidx.appcompat:appcompat:1.3.0-beta01=debugCompileClasspath,debugRuntimeClasspath +androidx.arch.core:core-common:2.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.arch.core:core-runtime:2.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.cardview:cardview:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.collection:collection-ktx:1.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.collection:collection:1.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.constraintlayout:constraintlayout-core:1.0.0-alpha3=debugCompileClasspath,debugRuntimeClasspath +androidx.constraintlayout:constraintlayout:2.1.0-alpha2=debugCompileClasspath,debugRuntimeClasspath +androidx.coordinatorlayout:coordinatorlayout:1.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.core:core-ktx:1.5.0-beta01=debugCompileClasspath,debugRuntimeClasspath +androidx.core:core:1.5.0-beta01=debugCompileClasspath,debugRuntimeClasspath +androidx.cursoradapter:cursoradapter:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.customview:customview:1.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.databinding:viewbinding:4.1.2=debugCompileClasspath,debugRuntimeClasspath +androidx.documentfile:documentfile:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.drawerlayout:drawerlayout:1.1.1=debugCompileClasspath,debugRuntimeClasspath +androidx.dynamicanimation:dynamicanimation:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.exifinterface:exifinterface:1.3.2=debugRuntimeClasspath +androidx.fragment:fragment-ktx:1.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.fragment:fragment:1.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.interpolator:interpolator:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.legacy:legacy-support-core-utils:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-common-java8:2.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-common:2.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-livedata-core-ktx:2.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-livedata-core:2.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-livedata-ktx:2.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-livedata:2.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-runtime-ktx:2.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-runtime:2.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-viewmodel-savedstate:2.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-viewmodel:2.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.loader:loader:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.localbroadcastmanager:localbroadcastmanager:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.navigation:navigation-common-ktx:2.3.3=debugCompileClasspath,debugRuntimeClasspath +androidx.navigation:navigation-common:2.3.3=debugCompileClasspath,debugRuntimeClasspath +androidx.navigation:navigation-dynamic-features-fragment:2.3.3=debugCompileClasspath,debugRuntimeClasspath +androidx.navigation:navigation-dynamic-features-runtime:2.3.3=debugCompileClasspath,debugRuntimeClasspath +androidx.navigation:navigation-fragment-ktx:2.3.3=debugCompileClasspath,debugRuntimeClasspath +androidx.navigation:navigation-fragment:2.3.3=debugCompileClasspath,debugRuntimeClasspath +androidx.navigation:navigation-runtime-ktx:2.3.3=debugCompileClasspath,debugRuntimeClasspath +androidx.navigation:navigation-runtime:2.3.3=debugCompileClasspath,debugRuntimeClasspath +androidx.navigation:navigation-ui-ktx:2.3.3=debugCompileClasspath,debugRuntimeClasspath +androidx.navigation:navigation-ui:2.3.3=debugCompileClasspath,debugRuntimeClasspath +androidx.print:print:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.recyclerview:recyclerview:1.2.0-beta01=debugCompileClasspath,debugRuntimeClasspath +androidx.savedstate:savedstate-ktx:1.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.savedstate:savedstate:1.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.tracing:tracing:1.0.0=debugRuntimeClasspath +androidx.transition:transition:1.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.vectordrawable:vectordrawable-animated:1.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.vectordrawable:vectordrawable:1.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.versionedparcelable:versionedparcelable:1.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.viewpager2:viewpager2:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.viewpager:viewpager:1.0.0=debugCompileClasspath,debugRuntimeClasspath +com.airbnb.android:lottie:2.8.0=debugCompileClasspath,debugRuntimeClasspath +com.facebook.stetho:stetho-okhttp3:1.5.0=debugCompileClasspath,debugRuntimeClasspath +com.facebook.stetho:stetho:1.5.0=debugCompileClasspath,debugRuntimeClasspath +com.google.android.material:material:1.3.0=debugCompileClasspath,debugRuntimeClasspath +com.google.android.play:core:1.9.1=debugCompileClasspath,debugRuntimeClasspath +com.google.code.findbugs:jsr305:2.0.1=debugCompileClasspath,debugRuntimeClasspath +com.jakewharton.timber:timber:4.7.1=debugCompileClasspath,debugRuntimeClasspath +com.squareup.moshi:moshi:1.8.0=debugCompileClasspath,debugRuntimeClasspath +com.squareup.okhttp3:logging-interceptor:4.10.0-RC1=debugCompileClasspath,debugRuntimeClasspath +com.squareup.okhttp3:okhttp:4.10.0-RC1=debugCompileClasspath,debugRuntimeClasspath +com.squareup.okio:okio:2.10.0=debugCompileClasspath,debugRuntimeClasspath +com.squareup.retrofit2:converter-moshi:2.9.0=debugCompileClasspath,debugRuntimeClasspath +com.squareup.retrofit2:retrofit:2.9.0=debugCompileClasspath,debugRuntimeClasspath +commons-cli:commons-cli:1.2=debugCompileClasspath,debugRuntimeClasspath +io.coil-kt:coil-base:1.1.1=debugCompileClasspath,debugRuntimeClasspath +io.coil-kt:coil:1.1.1=debugCompileClasspath,debugRuntimeClasspath +org.jetbrains.kotlin:kotlin-android-extensions-runtime:1.4.21=debugRuntimeClasspath +org.jetbrains.kotlin:kotlin-parcelize-runtime:1.4.21=debugRuntimeClasspath +org.jetbrains.kotlin:kotlin-reflect:1.4.30=debugCompileClasspath,debugRuntimeClasspath +org.jetbrains.kotlin:kotlin-stdlib-common:1.4.30=debugCompileClasspath,debugRuntimeClasspath +org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.4.10=debugCompileClasspath,debugRuntimeClasspath +org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.10=debugCompileClasspath,debugRuntimeClasspath +org.jetbrains.kotlin:kotlin-stdlib:1.4.30=debugCompileClasspath,debugRuntimeClasspath +org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.2=debugCompileClasspath,debugRuntimeClasspath +org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.4.2=debugCompileClasspath,debugRuntimeClasspath +org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2=debugCompileClasspath,debugRuntimeClasspath +org.jetbrains:annotations:16.0.1=debugCompileClasspath,debugRuntimeClasspath +org.kodein.di:kodein-di-core-jvm:6.5.5=debugCompileClasspath,debugRuntimeClasspath +org.kodein.di:kodein-di-core:6.5.5=debugCompileClasspath,debugRuntimeClasspath +org.kodein.di:kodein-di-framework-android-core:6.5.5=debugCompileClasspath,debugRuntimeClasspath +org.kodein.di:kodein-di-framework-android-x:6.5.5=debugCompileClasspath,debugRuntimeClasspath +org.kodein.di:kodein-di-generic-jvm:6.5.5=debugCompileClasspath,debugRuntimeClasspath +empty= diff --git a/feature_profile/gradle.lockfile b/feature_profile/gradle.lockfile new file mode 100644 index 000000000..e8f90f90d --- /dev/null +++ b/feature_profile/gradle.lockfile @@ -0,0 +1,97 @@ +# This is a Gradle generated file for dependency locking. +# Manual edits can break the build and are not advised. +# This file is expected to be part of source control. +androidx.activity:activity-ktx:1.2.0=debugCompileClasspath,debugRuntimeClasspath +androidx.activity:activity:1.2.0=debugCompileClasspath,debugRuntimeClasspath +androidx.annotation:annotation-experimental:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.annotation:annotation:1.2.0-beta01=debugCompileClasspath,debugRuntimeClasspath +androidx.appcompat:appcompat-resources:1.3.0-beta01=debugCompileClasspath,debugRuntimeClasspath +androidx.appcompat:appcompat:1.3.0-beta01=debugCompileClasspath,debugRuntimeClasspath +androidx.arch.core:core-common:2.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.arch.core:core-runtime:2.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.cardview:cardview:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.collection:collection-ktx:1.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.collection:collection:1.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.constraintlayout:constraintlayout-core:1.0.0-alpha3=debugCompileClasspath,debugRuntimeClasspath +androidx.constraintlayout:constraintlayout:2.1.0-alpha2=debugCompileClasspath,debugRuntimeClasspath +androidx.coordinatorlayout:coordinatorlayout:1.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.core:core-ktx:1.5.0-beta01=debugCompileClasspath,debugRuntimeClasspath +androidx.core:core:1.5.0-beta01=debugCompileClasspath,debugRuntimeClasspath +androidx.cursoradapter:cursoradapter:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.customview:customview:1.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.databinding:viewbinding:4.1.2=debugCompileClasspath,debugRuntimeClasspath +androidx.documentfile:documentfile:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.drawerlayout:drawerlayout:1.1.1=debugCompileClasspath,debugRuntimeClasspath +androidx.dynamicanimation:dynamicanimation:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.exifinterface:exifinterface:1.3.2=debugRuntimeClasspath +androidx.fragment:fragment-ktx:1.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.fragment:fragment:1.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.interpolator:interpolator:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.legacy:legacy-support-core-utils:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-common-java8:2.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-common:2.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-livedata-core-ktx:2.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-livedata-core:2.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-livedata-ktx:2.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-livedata:2.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-runtime-ktx:2.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-runtime:2.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-viewmodel-savedstate:2.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.lifecycle:lifecycle-viewmodel:2.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.loader:loader:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.localbroadcastmanager:localbroadcastmanager:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.navigation:navigation-common-ktx:2.3.3=debugCompileClasspath,debugRuntimeClasspath +androidx.navigation:navigation-common:2.3.3=debugCompileClasspath,debugRuntimeClasspath +androidx.navigation:navigation-dynamic-features-fragment:2.3.3=debugCompileClasspath,debugRuntimeClasspath +androidx.navigation:navigation-dynamic-features-runtime:2.3.3=debugCompileClasspath,debugRuntimeClasspath +androidx.navigation:navigation-fragment-ktx:2.3.3=debugCompileClasspath,debugRuntimeClasspath +androidx.navigation:navigation-fragment:2.3.3=debugCompileClasspath,debugRuntimeClasspath +androidx.navigation:navigation-runtime-ktx:2.3.3=debugCompileClasspath,debugRuntimeClasspath +androidx.navigation:navigation-runtime:2.3.3=debugCompileClasspath,debugRuntimeClasspath +androidx.navigation:navigation-ui-ktx:2.3.3=debugCompileClasspath,debugRuntimeClasspath +androidx.navigation:navigation-ui:2.3.3=debugCompileClasspath,debugRuntimeClasspath +androidx.print:print:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.recyclerview:recyclerview:1.2.0-beta01=debugCompileClasspath,debugRuntimeClasspath +androidx.savedstate:savedstate-ktx:1.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.savedstate:savedstate:1.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.tracing:tracing:1.0.0=debugRuntimeClasspath +androidx.transition:transition:1.3.0=debugCompileClasspath,debugRuntimeClasspath +androidx.vectordrawable:vectordrawable-animated:1.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.vectordrawable:vectordrawable:1.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.versionedparcelable:versionedparcelable:1.1.0=debugCompileClasspath,debugRuntimeClasspath +androidx.viewpager2:viewpager2:1.0.0=debugCompileClasspath,debugRuntimeClasspath +androidx.viewpager:viewpager:1.0.0=debugCompileClasspath,debugRuntimeClasspath +com.airbnb.android:lottie:2.8.0=debugCompileClasspath,debugRuntimeClasspath +com.facebook.stetho:stetho-okhttp3:1.5.0=debugCompileClasspath,debugRuntimeClasspath +com.facebook.stetho:stetho:1.5.0=debugCompileClasspath,debugRuntimeClasspath +com.google.android.material:material:1.3.0=debugCompileClasspath,debugRuntimeClasspath +com.google.android.play:core:1.9.1=debugCompileClasspath,debugRuntimeClasspath +com.google.code.findbugs:jsr305:2.0.1=debugCompileClasspath,debugRuntimeClasspath +com.jakewharton.timber:timber:4.7.1=debugCompileClasspath,debugRuntimeClasspath +com.squareup.moshi:moshi:1.8.0=debugCompileClasspath,debugRuntimeClasspath +com.squareup.okhttp3:logging-interceptor:4.10.0-RC1=debugCompileClasspath,debugRuntimeClasspath +com.squareup.okhttp3:okhttp:4.10.0-RC1=debugCompileClasspath,debugRuntimeClasspath +com.squareup.okio:okio:2.10.0=debugCompileClasspath,debugRuntimeClasspath +com.squareup.retrofit2:converter-moshi:2.9.0=debugCompileClasspath,debugRuntimeClasspath +com.squareup.retrofit2:retrofit:2.9.0=debugCompileClasspath,debugRuntimeClasspath +commons-cli:commons-cli:1.2=debugCompileClasspath,debugRuntimeClasspath +io.coil-kt:coil-base:1.1.1=debugCompileClasspath,debugRuntimeClasspath +io.coil-kt:coil:1.1.1=debugCompileClasspath,debugRuntimeClasspath +org.jetbrains.kotlin:kotlin-android-extensions-runtime:1.4.21=debugRuntimeClasspath +org.jetbrains.kotlin:kotlin-parcelize-runtime:1.4.21=debugRuntimeClasspath +org.jetbrains.kotlin:kotlin-reflect:1.4.30=debugCompileClasspath,debugRuntimeClasspath +org.jetbrains.kotlin:kotlin-stdlib-common:1.4.30=debugCompileClasspath,debugRuntimeClasspath +org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.4.10=debugCompileClasspath,debugRuntimeClasspath +org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.10=debugCompileClasspath,debugRuntimeClasspath +org.jetbrains.kotlin:kotlin-stdlib:1.4.30=debugCompileClasspath,debugRuntimeClasspath +org.jetbrains.kotlinx:kotlinx-coroutines-android:1.4.2=debugCompileClasspath,debugRuntimeClasspath +org.jetbrains.kotlinx:kotlinx-coroutines-core-jvm:1.4.2=debugCompileClasspath,debugRuntimeClasspath +org.jetbrains.kotlinx:kotlinx-coroutines-core:1.4.2=debugCompileClasspath,debugRuntimeClasspath +org.jetbrains:annotations:16.0.1=debugCompileClasspath,debugRuntimeClasspath +org.kodein.di:kodein-di-core-jvm:6.5.5=debugCompileClasspath,debugRuntimeClasspath +org.kodein.di:kodein-di-core:6.5.5=debugCompileClasspath,debugRuntimeClasspath +org.kodein.di:kodein-di-framework-android-core:6.5.5=debugCompileClasspath,debugRuntimeClasspath +org.kodein.di:kodein-di-framework-android-x:6.5.5=debugCompileClasspath,debugRuntimeClasspath +org.kodein.di:kodein-di-generic-jvm:6.5.5=debugCompileClasspath,debugRuntimeClasspath +empty= diff --git a/gradle.properties b/gradle.properties index 4997bf9c9..577f3b17a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -38,4 +38,7 @@ agpCoordinates=com.android.tools.build:gradle:4.1.2 # Versions must be changed togeher navigationVersion=2.3.3 -navigationCoordinates=androidx.navigation:navigation-safe-args-gradle-plugin:2.3.3 \ No newline at end of file +navigationCoordinates=androidx.navigation:navigation-safe-args-gradle-plugin:2.3.3 + +detektVersion=1.16.0-RC1 +ktlintVersion=9.4.1 diff --git a/gradle/dependency-locks/detektPlugins.lockfile b/gradle/dependency-locks/detektPlugins.lockfile new file mode 100644 index 000000000..656c5dbcc --- /dev/null +++ b/gradle/dependency-locks/detektPlugins.lockfile @@ -0,0 +1,3 @@ +# This is a Gradle generated file for dependency locking. +# Manual edits can break the build and are not advised. +# This file is expected to be part of source control. diff --git a/gradle/dependency-locks/ktlintRuleset.lockfile b/gradle/dependency-locks/ktlintRuleset.lockfile new file mode 100644 index 000000000..656c5dbcc --- /dev/null +++ b/gradle/dependency-locks/ktlintRuleset.lockfile @@ -0,0 +1,3 @@ +# This is a Gradle generated file for dependency locking. +# Manual edits can break the build and are not advised. +# This file is expected to be part of source control. diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index f6b961fd5..e708b1c02 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradlew b/gradlew index cccdd3d51..4f906e0c8 100755 --- a/gradlew +++ b/gradlew @@ -1,5 +1,21 @@ #!/usr/bin/env sh +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + ############################################################################## ## ## Gradle start up script for UN*X @@ -28,7 +44,7 @@ APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS="" +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" @@ -66,6 +82,7 @@ esac CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + # Determine the Java command to use to start the JVM. if [ -n "$JAVA_HOME" ] ; then if [ -x "$JAVA_HOME/jre/sh/java" ] ; then @@ -109,10 +126,11 @@ if $darwin; then GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" fi -# For Cygwin, switch paths to Windows format before running java -if $cygwin ; then +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then APP_HOME=`cygpath --path --mixed "$APP_HOME"` CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` # We build the pattern for arguments to be converted via cygpath @@ -138,19 +156,19 @@ if $cygwin ; then else eval `echo args$i`="\"$arg\"" fi - i=$((i+1)) + i=`expr $i + 1` done case $i in - (0) set -- ;; - (1) set -- "$args0" ;; - (2) set -- "$args0" "$args1" ;; - (3) set -- "$args0" "$args1" "$args2" ;; - (4) set -- "$args0" "$args1" "$args2" "$args3" ;; - (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; esac fi @@ -159,14 +177,9 @@ save () { for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done echo " " } -APP_ARGS=$(save "$@") +APP_ARGS=`save "$@"` # Collect all arguments for the java command, following the shell quoting and substitution rules eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" -# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong -if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then - cd "$(dirname "$0")" -fi - exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat index f9553162f..107acd32c 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -1,3 +1,19 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + @if "%DEBUG%" == "" @echo off @rem ########################################################################## @rem @@ -13,15 +29,18 @@ if "%DIRNAME%" == "" set DIRNAME=. set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS= +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto init +if "%ERRORLEVEL%" == "0" goto execute echo. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. @@ -35,7 +54,7 @@ goto fail set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe -if exist "%JAVA_EXE%" goto init +if exist "%JAVA_EXE%" goto execute echo. echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% @@ -45,28 +64,14 @@ echo location of your Java installation. goto fail -:init -@rem Get command-line arguments, handling Windows variants - -if not "%OS%" == "Windows_NT" goto win9xME_args - -:win9xME_args -@rem Slurp the command line arguments. -set CMD_LINE_ARGS= -set _SKIP=2 - -:win9xME_args_slurp -if "x%~1" == "x" goto execute - -set CMD_LINE_ARGS=%* - :execute @rem Setup the command line set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* :end @rem End local scope for the variables with windows NT shell diff --git a/settings.gradle.kts b/settings.gradle.kts index c621eeada..d7b60adeb 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,5 +1,10 @@ rootProject.buildFileName = "build.gradle.kts" +// Set single lock file (gradle.lockfile) +// This preview feature should be enabled by default in Gradle 7 +// More: https://docs.gradle.org/current/userguide/dependency_locking.html#single_lock_file_per_project +enableFeaturePreview("ONE_LOCKFILE_PER_PROJECT") + include( ":app", ":feature_album", @@ -8,16 +13,6 @@ include( ":library_test_utils" ) -// Gradle is missing proper build-in mechanism to share dependency versions between: -// - library dependency and gradle plugin dependency (eg. kotlin, navigation) -// - implementation and test implementation of the library (eg. coroutines) -// More: https://github.com/gradle/gradle/issues/16077 -// -// As a result some versions are defined multiple times. -// To avoid defining dependency version multiple times dependencies are defined in the gradle.properties file and -// retrieved using settings delegate. Unfortunately this technique cannot be applied to all versions, so some will -// remain duplicated. - pluginManagement { repositories { gradlePluginPortal() @@ -25,18 +20,26 @@ pluginManagement { } plugins { - val kotlinVersion: String by settings - val agpVersion: String by settings - val navigationVersion: String by settings + // See Dependency management section in README.md + // https://github.com/igorwojda/android-showcase#dependency-management - id("io.gitlab.arturbosch.detekt") version "1.16.0-RC1" - id("org.jlleitschuh.gradle.ktlint") version "9.4.1" + val kotlinVersion: String by settings id("org.jetbrains.kotlin.jvm") version kotlinVersion id("org.jetbrains.kotlin.android") version kotlinVersion + + val agpVersion: String by settings id("com.android.application") version agpVersion id("com.android.library") version agpVersion id("com.android.dynamic-feature") version agpVersion + + val navigationVersion: String by settings id("androidx.navigation.safeargs.kotlin") version navigationVersion + + val detektVersion: String by settings + id("io.gitlab.arturbosch.detekt") version detektVersion + + val ktlintVersion: String by settings + id("org.jlleitschuh.gradle.ktlint") version ktlintVersion } resolutionStrategy { @@ -62,61 +65,60 @@ pluginManagement { } } -// Version catalogs is the new Gradle 7 way for sharing dependency versions across projects. -// https://docs.gradle.org/7.0-milestone-1/userguide/platforms.html +// See Dependency management section in README.md +// https://github.com/igorwojda/android-showcase#dependency-management dependencyResolutionManagement { versionCatalogs { create("libs") { - // Retrofit will use okhttp 4 (it has binary capability with okhttp 3) - // See: https://square.github.io/okhttp/upgrading_to_okhttp_4/ - version("okhttp", "4.9.1") - alias("okhttp-okhttp").to("com.squareup.okhttp3", "okhttp").versionRef("okhttp") - alias("okhttp-interceptor").to("com.squareup.okhttp3", "logging-interceptor").versionRef("okhttp") - // bundle is basically an alias for several dependencies - bundle("okhttp", listOf("okhttp-okhttp", "okhttp-interceptor")) val kotlinVersion: String by settings version("kotlin", kotlinVersion) - // // alias("kotlin-stdlib").to("org.jetbrains.kotlin", "kotlin-stdlib").versionRef("kotlin") // Required by Android dynamic feature modules and SafeArgs alias("kotlin-reflect").to("org.jetbrains.kotlin", "kotlin-reflect").versionRef("kotlin") - version("coroutines", "1.3.9") + version("coroutines", "1.+") alias("coroutines").to("org.jetbrains.kotlinx", "kotlinx-coroutines-android").versionRef("coroutines") bundle("kotlin", listOf("kotlin-reflect", "coroutines")) - version("retrofit", "2.9.0") + version("retrofit", "2.+") alias("retrofit-core").to("com.squareup.retrofit2", "retrofit").versionRef("retrofit") alias("converter-moshi").to("com.squareup.retrofit2", "converter-moshi").versionRef("retrofit") bundle("retrofit", listOf("retrofit-core", "converter-moshi")) - alias("play-core").to("com.google.android.play:core:1.9.1") + // Retrofit will use okhttp 4 (it has binary capability with okhttp 3) + // See: https://square.github.io/okhttp/upgrading_to_okhttp_4/ + version("okhttp", "4.+") + alias("okhttp-okhttp").to("com.squareup.okhttp3", "okhttp").versionRef("okhttp") + alias("okhttp-interceptor").to("com.squareup.okhttp3", "logging-interceptor").versionRef("okhttp") + // bundle is basically an alias for several dependencies + bundle("okhttp", listOf("okhttp-okhttp", "okhttp-interceptor")) - version("stetho", "1.5.0") + version("stetho", "1.5.0") // 1.5.1 has critical bug alias("stetho-core").to("com.facebook.stetho", "stetho").versionRef("stetho") alias("stetho-okhttp3").to("com.facebook.stetho", "stetho-okhttp3").versionRef("stetho") bundle("stetho", listOf("stetho-core", "stetho-okhttp3")) - version("kodein", "6.5.5") + version("kodein", "6.+") // Required by Android dynamic feature modules and SafeArgs alias("kodein-core").to("org.kodein.di", "kodein-di-generic-jvm").versionRef("kodein") alias("kodein-android-x").to("org.kodein.di", "kodein-di-framework-android-x").versionRef("kodein") bundle("kodein", listOf("kodein-core", "kodein-android-x")) - alias("timber").to("com.jakewharton.timber:timber:4.7.1") - alias("constraintlayout").to("androidx.constraintlayout:constraintlayout:2.0.4") - alias("coordinatorlayout").to("androidx.coordinatorlayout:coordinatorlayout:1.1.0") - alias("appcompat").to("androidx.appcompat:appcompat:1.2.0") - alias("recyclerview").to("androidx.recyclerview:recyclerview:1.1.0") - alias("material").to("com.google.android.material:material:1.2.0") - alias("lottie").to("com.airbnb.android:lottie:2.5.0") - alias("coil").to("io.coil-kt:coil:1.1.1") - - alias("core-ktx").to("androidx.core:core-ktx:1.3.2") - alias("fragment-ktx").to("androidx.fragment:fragment-ktx:1.2.5") + alias("timber").to("com.jakewharton.timber:timber:4.+") + alias("constraintlayout").to("androidx.constraintlayout:constraintlayout:2.+") + alias("coordinatorlayout").to("androidx.coordinatorlayout:coordinatorlayout:1.+") + alias("appcompat").to("androidx.appcompat:appcompat:1.+") + alias("recyclerview").to("androidx.recyclerview:recyclerview:1.+") + alias("material").to("com.google.android.material:material:1.+") + alias("lottie").to("com.airbnb.android:lottie:2.+") + alias("coil").to("io.coil-kt:coil:1.+") + alias("play-core").to("com.google.android.play:core:1.+") + + alias("core-ktx").to("androidx.core:core-ktx:1.+") + alias("fragment-ktx").to("androidx.fragment:fragment-ktx:1.+") bundle("ktx", listOf("core-ktx", "fragment-ktx")) - version("lifecycle", "2.2.0") + version("lifecycle", "2.+") alias("viewmodel-ktx").to("androidx.lifecycle", "lifecycle-viewmodel-ktx").versionRef("lifecycle") alias("livedata-ktx").to("androidx.lifecycle", "lifecycle-livedata-ktx").versionRef("lifecycle") alias("lifecycle-common").to("androidx.lifecycle", "lifecycle-common-java8").versionRef("lifecycle") @@ -132,15 +134,17 @@ dependencyResolutionManagement { bundle("navigation", listOf("navigation-fragment", "navigation-dynamic", "navigation-ui-ktx")) // Test dependencies - alias("junit").to("junit:junit:4.13") + alias("junit").to("junit:junit:4.+") alias("test-coroutines").to("org.jetbrains.kotlinx", "kotlinx-coroutines-test").versionRef("coroutines") - version("kluent", "1.65") + + version("kluent", "1.+") alias("kluent-core").to("org.amshove.kluent", "kluent").versionRef("kluent") alias("kluent-android").to("org.amshove.kluent", "kluent-android").versionRef("kluent") - alias("test-runner").to("androidx.test:runner:1.1.0") - alias("espresso").to("androidx.test.espresso:espresso-core:3.1.0") - alias("mockk").to("io.mockk:mockk:1.10.5") - alias("arch").to("androidx.arch.core:core-testing:2.1.0") + + alias("test-runner").to("androidx.test:runner:1.+") + alias("espresso").to("androidx.test.espresso:espresso-core:3.+") + alias("mockk").to("io.mockk:mockk:1.+") + alias("arch").to("androidx.arch.core:core-testing:2.+") bundle( "test", listOf(