diff --git a/app/build.gradle b/app/build.gradle index b83458b2f..25f1ed849 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,7 +1,7 @@ plugins { - id 'com.android.application' - id 'org.jetbrains.kotlin.android' - id 'com.google.gms.google-services' + alias(libs.plugins.androidApplication) + alias(libs.plugins.jetbrainsKotlinAndroid) + alias(libs.plugins.googleServices) } android { @@ -164,75 +164,78 @@ android { dependencies { implementation project(path: ':quartz') implementation project(path: ':commons') - implementation "androidx.core:core-ktx:$core_ktx_version" - implementation 'androidx.activity:activity-compose:1.8.2' - implementation "androidx.compose.ui:ui:$compose_ui_version" - implementation "androidx.compose.ui:ui-tooling-preview:$compose_ui_version" + implementation libs.androidx.core.ktx + implementation libs.androidx.activity.compose + + implementation platform(libs.androidx.compose.bom) + + implementation libs.androidx.ui + implementation libs.androidx.ui.graphics + implementation libs.androidx.ui.tooling.preview // Needs this to open gallery / image upload - implementation "androidx.fragment:fragment-ktx:$fragment_version" + implementation libs.androidx.fragment.ktx // Navigation - implementation "androidx.navigation:navigation-compose:$nav_version" + implementation libs.androidx.navigation.compose // Observe Live data as State - implementation "androidx.compose.runtime:runtime-livedata:$compose_ui_version" + implementation libs.androidx.runtime.livedata // Material 3 Design - implementation "androidx.compose.material3:material3:${material3_version}" - implementation "androidx.compose.material:material-icons-extended:$compose_ui_version" + implementation libs.androidx.material3 + implementation libs.androidx.material.icons // Adaptive Layout / Two Pane - implementation "androidx.compose.material3:material3-window-size-class:${material3_version}" - implementation 'com.google.accompanist:accompanist-adaptive:0.34.0' - + implementation libs.androidx.material3.windowSize + implementation libs.accompanist.adaptive // Lifecycle - implementation "androidx.lifecycle:lifecycle-runtime-compose:$lifecycle_version" - implementation "androidx.lifecycle:lifecycle-viewmodel-compose:$lifecycle_version" - implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version" - implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version" + implementation libs.androidx.lifecycle.runtime.ktx + implementation libs.androidx.lifecycle.runtime.compose + implementation libs.androidx.lifecycle.viewmodel.compose + implementation libs.androidx.lifecycle.livedata.ktx // Zoomable images - implementation 'net.engawapg.lib:zoomable:1.6.0' + implementation libs.zoomable // Biometrics - implementation "androidx.biometric:biometric-ktx:1.2.0-alpha05" + implementation libs.androidx.biometric.ktx // Websockets API - implementation 'com.squareup.okhttp3:okhttp:5.0.0-alpha.12' + implementation libs.okhttp // HTML Parsing for Link Preview - implementation 'org.jsoup:jsoup:1.17.2' + implementation libs.jsoup // Encrypted Key Storage - implementation 'androidx.security:security-crypto-ktx:1.1.0-alpha06' + implementation libs.androidx.security.crypto.ktx // view videos - implementation "androidx.media3:media3-exoplayer:$media3_version" - implementation "androidx.media3:media3-exoplayer-hls:$media3_version" - implementation "androidx.media3:media3-ui:$media3_version" - implementation "androidx.media3:media3-session:$media3_version" + implementation libs.androidx.media3.exoplayer + implementation libs.androidx.media3.exoplayer.hls + implementation libs.androidx.media3.ui + implementation libs.androidx.media3.session // important for proxy / tor - implementation "androidx.media3:media3-datasource-okhttp:$media3_version" + implementation libs.androidx.media3.datasource.okhttp // Load images from the web. - implementation "io.coil-kt:coil-compose:$coil_version" + implementation libs.coil.compose // view gifs - implementation "io.coil-kt:coil-gif:$coil_version" + implementation libs.coil.gif // view svgs - implementation "io.coil-kt:coil-svg:$coil_version" + implementation libs.coil.svg // create blurhash - implementation group: 'io.trbl', name: 'blurhash', version: '1.0.0' + implementation libs.trbl.blurhash // Permission to upload pictures: - implementation "com.google.accompanist:accompanist-permissions:$accompanist_version" + implementation libs.accompanist.permissions // For QR generation - implementation 'com.google.zxing:core:3.5.3' - implementation 'com.journeyapps:zxing-android-embedded:4.3.0' + implementation libs.zxing + implementation libs.zxing.embedded // Markdown //implementation "com.halilibo.compose-richtext:richtext-ui:0.16.0" @@ -240,51 +243,50 @@ dependencies { //implementation "com.halilibo.compose-richtext:richtext-commonmark:0.16.0" // Markdown (With fix for full-image bleeds) - implementation('com.github.vitorpamplona.compose-richtext:richtext-ui:48702a8ced') - implementation('com.github.vitorpamplona.compose-richtext:richtext-ui-material3:48702a8ced') - implementation('com.github.vitorpamplona.compose-richtext:richtext-commonmark:48702a8ced') + implementation libs.markdown.ui + implementation libs.markdown.ui.material3 + implementation libs.markdown.commonmark // Language picker and Theme chooser - implementation 'androidx.appcompat:appcompat:1.6.1' + implementation libs.androidx.appcompat // Local model for language identification - playImplementation 'com.google.mlkit:language-id:17.0.5' + playImplementation libs.google.mlkit.language.id // Google services model the translate text - playImplementation 'com.google.mlkit:translate:17.0.2' + playImplementation libs.google.mlkit.translate // PushNotifications - playImplementation platform('com.google.firebase:firebase-bom:32.7.2') - playImplementation 'com.google.firebase:firebase-messaging-ktx' + playImplementation platform(libs.firebase.bom) + playImplementation libs.firebase.messaging //PushNotifications(FDroid) - fdroidImplementation 'com.github.UnifiedPush:android-connector:2.2.0' + fdroidImplementation libs.unifiedpush // Charts - implementation "com.patrykandpatrick.vico:core:${vico_version}" - implementation "com.patrykandpatrick.vico:compose:${vico_version}" - implementation "com.patrykandpatrick.vico:views:${vico_version}" - implementation "com.patrykandpatrick.vico:compose-m2:${vico_version}" + implementation libs.vico.charts.core + implementation libs.vico.charts.compose + implementation libs.vico.charts.views + implementation libs.vico.charts.m3 // GeoHash - implementation 'com.github.drfonfon:android-kotlin-geohash:1.0' + implementation libs.drfonfon.geohash // Waveform visualizer - implementation 'com.github.lincollincol:compose-audiowaveform:1.1.1' + implementation libs.audiowaveform // Video compression lib - implementation 'com.github.AbedElazizShe:LightCompressor:1.3.2' + implementation libs.abedElazizShe.image.compressor // Image compression lib - implementation 'id.zelory:compressor:3.0.1' + implementation libs.zelory.video.compressor - testImplementation 'junit:junit:4.13.2' - testImplementation 'io.mockk:mockk:1.13.9' - androidTestImplementation 'androidx.test.ext:junit:1.2.0-alpha03' - androidTestImplementation 'androidx.test.ext:junit-ktx:1.2.0-alpha03' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' - androidTestImplementation "androidx.compose.ui:ui-test-junit4:$compose_ui_version" - debugImplementation "androidx.compose.ui:ui-tooling:$compose_ui_version" - debugImplementation "androidx.compose.ui:ui-test-manifest:$compose_ui_version" + testImplementation libs.junit + testImplementation libs.mockk + androidTestImplementation libs.androidx.junit + androidTestImplementation libs.androidx.junit.ktx + androidTestImplementation libs.androidx.espresso.core + debugImplementation libs.androidx.ui.tooling + debugImplementation libs.androidx.ui.test.manifest } // https://gitlab.com/fdroid/wiki/-/wikis/HOWTO:-diff-&-fix-APKs-for-Reproducible-Builds#differing-assetsdexoptbaselineprofm-easy-to-fix diff --git a/benchmark/build.gradle b/benchmark/build.gradle index 61ab23cfb..be097e2d7 100644 --- a/benchmark/build.gradle +++ b/benchmark/build.gradle @@ -1,7 +1,7 @@ plugins { - id 'com.android.library' - id 'androidx.benchmark' - id 'org.jetbrains.kotlin.android' + alias(libs.plugins.androidLibrary) + alias(libs.plugins.jetbrainsKotlinAndroid) + alias(libs.plugins.androidBenchmark) } android { @@ -49,10 +49,10 @@ android { } dependencies { - androidTestImplementation 'androidx.test:runner:1.5.2' - androidTestImplementation 'androidx.test.ext:junit:1.1.5' - androidTestImplementation 'junit:junit:4.13.2' - androidTestImplementation 'androidx.benchmark:benchmark-junit4:1.2.3' + androidTestImplementation libs.androidx.runner + androidTestImplementation libs.androidx.junit + androidTestImplementation libs.junit + androidTestImplementation libs.androidx.benchmark.junit4 androidTestImplementation project(path: ':quartz') androidTestImplementation project(path: ':commons') diff --git a/build.gradle b/build.gradle index 1962c551a..121417ec7 100644 --- a/build.gradle +++ b/build.gradle @@ -1,31 +1,13 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile -buildscript { - ext { - fragment_version = "1.6.2" - lifecycle_version = '2.7.0' - compose_ui_version = '1.6.2' - nav_version = '2.7.7' - room_version = "2.4.3" - accompanist_version = '0.34.0' - coil_version = '2.6.0' - vico_version = '1.14.0' - media3_version = '1.2.1' - core_ktx_version = '1.12.0' - material3_version = '1.2.0' - } - dependencies { - classpath 'com.google.gms:google-services:4.4.1' - } -} - plugins { - id 'com.android.application' version '8.3.0' apply false - id 'com.android.library' version '8.3.0' apply false - id 'org.jetbrains.kotlin.android' version '1.9.22' apply false - id 'org.jetbrains.kotlin.jvm' version '1.9.22' apply false - id 'androidx.benchmark' version '1.2.3' apply false - id 'com.diffplug.spotless' version '6.25.0' apply false + alias(libs.plugins.androidApplication) apply false + alias(libs.plugins.jetbrainsKotlinAndroid) apply false + alias(libs.plugins.androidLibrary) apply false + alias(libs.plugins.jetbrainsKotlinJvm) apply false + alias(libs.plugins.androidBenchmark) apply false + alias(libs.plugins.diffplugSpotless) apply false + alias(libs.plugins.googleServices) apply false } subprojects { diff --git a/commons/build.gradle b/commons/build.gradle index a30b159dd..6adfe0abd 100644 --- a/commons/build.gradle +++ b/commons/build.gradle @@ -1,6 +1,6 @@ plugins { - id 'com.android.library' - id 'org.jetbrains.kotlin.android' + alias(libs.plugins.androidLibrary) + alias(libs.plugins.jetbrainsKotlinAndroid) } android { @@ -38,12 +38,13 @@ dependencies { implementation project(path: ':quartz') // Import @Immutable and @Stable - implementation "androidx.compose.ui:ui:$compose_ui_version" + implementation platform(libs.androidx.compose.bom) + implementation libs.androidx.ui // immutable collections to avoid recomposition - api('org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7') + api libs.kotlinx.collections.immutable - testImplementation 'junit:junit:4.13.2' - androidTestImplementation 'androidx.test.ext:junit:1.1.5' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' + testImplementation libs.junit + androidTestImplementation libs.androidx.junit + androidTestImplementation libs.androidx.espresso.core } \ No newline at end of file diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 000000000..88a75dab3 --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,124 @@ +[versions] +accompanistAdaptive = "0.34.0" +activityCompose = "1.8.2" +agp = "8.3.0" +androidKotlinGeohash = "1.0" +androidLifecycle = "2.7.0" +androidxJunit = "1.2.0-alpha03" +appcompat = "1.6.1" +audiowaveform = "1.1.1" +benchmark = "1.2.3" +benchmarkJunit4 = "1.2.3" +biometricKtx = "1.2.0-alpha05" +blurhash = "1.0.0" +coil = "2.6.0" +composeBom = "2024.02.01" +coreKtx = "1.12.0" +espressoCore = "3.5.1" +firebaseBom = "32.7.3" +fragmentKtx = "1.6.2" +gms = "4.4.1" +jacksonModuleKotlin = "2.16.1" +jna = "5.14.0" +jsoup = "1.17.2" +junit = "4.13.2" +kotlin = "1.9.22" +kotlinxCollectionsImmutable = "0.3.7" +languageId = "17.0.5" +lazysodiumAndroid = "5.1.0" +lightcompressor = "1.3.2" +markdown = "48702a8ced" +media3 = "1.2.1" +mockk = "1.13.9" +navigationCompose = "2.7.7" +okhttp = "5.0.0-alpha.12" +runner = "1.5.2" +secp256k1KmpJniAndroid = "0.14.0" +securityCryptoKtx = "1.1.0-alpha06" +spotless = "6.25.0" +translate = "17.0.2" +unifiedpush = "2.2.0" +urlDetector = "0.1.23" +vico-charts = "1.14.0" +zelory = "3.0.1" +zoomable = "1.6.0" +zxing = "3.5.3" +zxingAndroidEmbedded = "4.3.0" + +[libraries] +abedElazizShe-image-compressor = { group = "com.github.AbedElazizShe", name = "LightCompressor", version.ref = "lightcompressor" } +accompanist-adaptive = { group = "com.google.accompanist", name = "accompanist-adaptive", version.ref = "accompanistAdaptive" } +accompanist-permissions = { group = "com.google.accompanist", name = "accompanist-permissions", version.ref = "accompanistAdaptive" } +androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "activityCompose" } +androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } +androidx-benchmark-junit4 = { group = "androidx.benchmark", name = "benchmark-junit4", version.ref = "benchmarkJunit4" } +androidx-biometric-ktx = { group = "androidx.biometric", name = "biometric-ktx", version.ref = "biometricKtx" } +androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" } +androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } +androidx-espresso-core = { group = "androidx.test.espresso", name = "espresso-core", version.ref = "espressoCore" } +androidx-fragment-ktx = { group = "androidx.fragment", name = "fragment-ktx", version.ref = "fragmentKtx" } +androidx-junit = { group = "androidx.test.ext", name = "junit", version.ref = "androidxJunit" } +androidx-junit-ktx = { group = "androidx.test.ext", name = "junit-ktx", version.ref = "androidxJunit" } +androidx-lifecycle-livedata-ktx = { group = "androidx.lifecycle", name = "lifecycle-livedata-ktx", version.ref = "androidLifecycle" } +androidx-lifecycle-runtime-compose = { group = "androidx.lifecycle", name = "lifecycle-runtime-compose", version.ref = "androidLifecycle" } +androidx-lifecycle-runtime-ktx = { group = "androidx.lifecycle", name = "lifecycle-runtime-ktx", version.ref = "androidLifecycle" } +androidx-lifecycle-viewmodel-compose = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose", version.ref = "androidLifecycle" } +androidx-material-icons = { group = "androidx.compose.material", name = "material-icons-extended" } +androidx-material3 = { group = "androidx.compose.material3", name = "material3" } +androidx-material3-windowSize = { group = "androidx.compose.material3", name = "material3-window-size-class" } +androidx-media3-datasource-okhttp = { group = "androidx.media3", name = "media3-datasource-okhttp", version.ref = "media3" } +androidx-media3-exoplayer = { group = "androidx.media3", name = "media3-exoplayer", version.ref = "media3" } +androidx-media3-exoplayer-hls = { group = "androidx.media3", name = "media3-exoplayer-hls", version.ref = "media3" } +androidx-media3-session = { group = "androidx.media3", name = "media3-session", version.ref = "media3" } +androidx-media3-ui = { group = "androidx.media3", name = "media3-ui", version.ref = "media3" } +androidx-navigation-compose = { group = "androidx.navigation", name = "navigation-compose", version.ref = "navigationCompose" } +androidx-runner = { group = "androidx.test", name = "runner", version.ref = "runner" } +androidx-runtime-livedata = { group = "androidx.compose.runtime", name = "runtime-livedata" } +androidx-runtime-runtime = { group = "androidx.compose.runtime", name = "runtime" } +androidx-security-crypto-ktx = { group = "androidx.security", name = "security-crypto-ktx", version.ref = "securityCryptoKtx" } +androidx-ui = { group = "androidx.compose.ui", name = "ui" } +androidx-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" } +androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } +androidx-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" } +androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" } +audiowaveform = { group = "com.github.lincollincol", name = "compose-audiowaveform", version.ref = "audiowaveform" } +coil-compose = { group = "io.coil-kt", name = "coil-compose", version.ref = "coil" } +coil-gif = { group = "io.coil-kt", name = "coil-gif", version.ref = "coil" } +coil-svg = { group = "io.coil-kt", name = "coil-svg", version.ref = "coil" } +drfonfon-geohash = { group = "com.github.drfonfon", name = "android-kotlin-geohash", version.ref = "androidKotlinGeohash" } +firebase-bom = { group = "com.google.firebase", name = "firebase-bom", version.ref = "firebaseBom" } +firebase-messaging = { group = "com.google.firebase", name = "firebase-messaging-ktx" } +google-mlkit-language-id = { group = "com.google.mlkit", name = "language-id", version.ref = "languageId" } +google-mlkit-translate = { group = "com.google.mlkit", name = "translate", version.ref = "translate" } +jackson-module-kotlin = { group = "com.fasterxml.jackson.module", name = "jackson-module-kotlin", version.ref = "jacksonModuleKotlin" } +jna = { group = "net.java.dev.jna", name = "jna", version.ref = "jna" } +jsoup = { group = "org.jsoup", name = "jsoup", version.ref = "jsoup" } +junit = { group = "junit", name = "junit", version.ref = "junit" } +kotlinx-collections-immutable = { group = "org.jetbrains.kotlinx", name = "kotlinx-collections-immutable", version.ref = "kotlinxCollectionsImmutable" } +lazysodium-android = { group = "com.goterl", name = "lazysodium-android", version.ref = "lazysodiumAndroid" } +markdown-commonmark = { group = "com.github.vitorpamplona.compose-richtext", name = "richtext-commonmark", version.ref = "markdown" } +markdown-ui = { group = "com.github.vitorpamplona.compose-richtext", name = "richtext-ui", version.ref = "markdown" } +markdown-ui-material3 = { group = "com.github.vitorpamplona.compose-richtext", name = "richtext-ui-material3", version.ref = "markdown" } +mockk = { group = "io.mockk", name = "mockk", version.ref = "mockk" } +okhttp = { group = "com.squareup.okhttp3", name = "okhttp", version.ref = "okhttp" } +secp256k1-kmp-jni-android = { group = "fr.acinq.secp256k1", name = "secp256k1-kmp-jni-android", version.ref = "secp256k1KmpJniAndroid" } +trbl-blurhash = { group = "io.trbl", name = "blurhash", version.ref = "blurhash" } +unifiedpush = { group = "com.github.UnifiedPush", name = "android-connector", version.ref = "unifiedpush" } +url-detector = { group = "io.github.url-detector", name = "url-detector", version.ref = "urlDetector" } +vico-charts-compose = { group = "com.patrykandpatrick.vico", name = "compose", version.ref = "vico-charts" } +vico-charts-core = { group = "com.patrykandpatrick.vico", name = "core", version.ref = "vico-charts" } +vico-charts-m3 = { group = "com.patrykandpatrick.vico", name = "compose-m3", version.ref = "vico-charts" } +vico-charts-views = { group = "com.patrykandpatrick.vico", name = "views", version.ref = "vico-charts" } +zelory-video-compressor = { group = "id.zelory", name = "compressor", version.ref = "zelory" } +zoomable = { group = "net.engawapg.lib", name = "zoomable", version.ref = "zoomable" } +zxing = { group = "com.google.zxing", name = "core", version.ref = "zxing" } +zxing-embedded = { group = "com.journeyapps", name = "zxing-android-embedded", version.ref = "zxingAndroidEmbedded" } + +[plugins] +androidApplication = { id = "com.android.application", version.ref = "agp" } +androidBenchmark = { id = "androidx.benchmark", version.ref = "benchmark" } +androidLibrary = { id = "com.android.library", version.ref = "agp" } +diffplugSpotless = { id = "com.diffplug.spotless", version.ref = "spotless" } +googleServices = { id = "com.google.gms.google-services", version.ref = "gms" } +jetbrainsKotlinAndroid = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } +jetbrainsKotlinJvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } diff --git a/quartz/build.gradle b/quartz/build.gradle index 0b3565103..a9aa482f5 100644 --- a/quartz/build.gradle +++ b/quartz/build.gradle @@ -1,6 +1,6 @@ plugins { - id 'com.android.library' - id 'org.jetbrains.kotlin.android' + alias(libs.plugins.androidLibrary) + alias(libs.plugins.jetbrainsKotlinAndroid) } android { @@ -38,32 +38,34 @@ android { excludes += ['**/libscrypt.dylib'] } } - } dependencies { - implementation "androidx.core:core-ktx:$core_ktx_version" + implementation libs.androidx.core.ktx + + implementation platform(libs.androidx.compose.bom) // @Immutable and @Stable - implementation "androidx.compose.runtime:runtime:$compose_ui_version" + implementation libs.androidx.runtime.runtime // Bitcoin secp256k1 bindings to Android - api 'fr.acinq.secp256k1:secp256k1-kmp-jni-android:0.14.0' + api libs.secp256k1.kmp.jni.android // LibSodium for ChaCha encryption (NIP-44) + // Wait for @aar support in version catalogs implementation "com.goterl:lazysodium-android:5.1.0@aar" implementation 'net.java.dev.jna:jna:5.14.0@aar' // Performant Parser of JSONs into Events - api 'com.fasterxml.jackson.module:jackson-module-kotlin:2.16.1' + api libs.jackson.module.kotlin // immutable collections to avoid recomposition - api('org.jetbrains.kotlinx:kotlinx-collections-immutable:0.3.7') + api libs.kotlinx.collections.immutable // Parses URLs from Text: - api "io.github.url-detector:url-detector:0.1.23" + api libs.url.detector - testImplementation 'junit:junit:4.13.2' - androidTestImplementation 'androidx.test.ext:junit:1.1.5' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1' + testImplementation libs.junit + androidTestImplementation libs.androidx.junit + androidTestImplementation libs.androidx.espresso.core } \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index 6ac181c95..45a4461c7 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,8 +1,14 @@ pluginManagement { repositories { - gradlePluginPortal() - google() + google { + content { + includeGroupByRegex("com\\.android.*") + includeGroupByRegex("com\\.google.*") + includeGroupByRegex("androidx.*") + } + } mavenCentral() + gradlePluginPortal() maven { url "https://jitpack.io" content { @@ -11,6 +17,7 @@ pluginManagement { } } } + dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { @@ -19,6 +26,7 @@ dependencyResolutionManagement { maven { url "https://jitpack.io" } } } + rootProject.name = "Amethyst" include ':app' include ':benchmark'