From 15089245bb48faa3ce42d049f0b0dbb8adaab9c3 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Wed, 15 Oct 2025 12:58:54 +0800 Subject: [PATCH] Migrate to build version catalog Ref: https://developer.android.com/build/migrate-to-catalogs Signed-off-by: Aayush Gupta --- app/build.gradle.kts | 163 +++++++++++++++++--------------------- build.gradle.kts | 10 +-- gradle/libs.versions.toml | 130 ++++++++++++++++++++++++++++++ 3 files changed, 206 insertions(+), 97 deletions(-) create mode 100644 gradle/libs.versions.toml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 4bbb8ad93..e5f9ce3e4 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -4,11 +4,11 @@ */ plugins { - id("com.android.application") - id("kotlin-android") - id("kotlin-kapt") - id("kotlin-parcelize") - id("org.sonarqube") + alias(libs.plugins.android.application) + alias(libs.plugins.jetbrains.kotlin.android) + alias(libs.plugins.jetbrains.kotlin.kapt) + alias(libs.plugins.jetbrains.kotlin.parcelize) + alias(libs.plugins.sonarqube) checkstyle } @@ -126,28 +126,14 @@ android { } } -val checkstyleVersion = "10.12.1" - -val androidxLifecycleVersion = "2.6.2" -val androidxRoomVersion = "2.6.1" -val androidxWorkVersion = "2.8.1" - -val stateSaverVersion = "1.4.1" -val exoPlayerVersion = "2.18.7" -val googleAutoServiceVersion = "1.1.1" -val groupieVersion = "2.10.1" -val markwonVersion = "4.6.2" - -val leakCanaryVersion = "2.12" -val stethoVersion = "1.6.0" - +// Custom dependency configuration for ktlint val ktlint by configurations.creating checkstyle { configDirectory = rootProject.file("checkstyle") isIgnoreFailures = false isShowViolations = true - toolVersion = checkstyleVersion + toolVersion = libs.versions.checkstyle.get() } tasks.register("runCheckstyle") { @@ -208,113 +194,106 @@ sonar { dependencies { /** Desugaring **/ - coreLibraryDesugaring("com.android.tools:desugar_jdk_libs_nio:2.0.4") + coreLibraryDesugaring(libs.android.desugar) /** NewPipe libraries **/ - implementation("com.github.TeamNewPipe:nanojson:e9d656ddb49a412a5a0a5d5ef20ca7ef09549996") - // WORKAROUND: if you get errors with the NewPipeExtractor dependency, replace `v0.24.3` with - // the corresponding commit hash, since JitPack sometimes deletes artifacts. - // If there’s already a git hash, just add more of it to the end (or remove a letter) - // to cause jitpack to regenerate the artifact. - implementation("com.github.TeamNewPipe:NewPipeExtractor:0023b22095a2d62a60cdfc87f4b5cd85c8b266c3") - implementation("com.github.TeamNewPipe:NoNonsense-FilePicker:5.0.0") + implementation(libs.newpipe.nanojson) + implementation(libs.newpipe.extractor) + implementation(libs.newpipe.filepicker) /** Checkstyle **/ - checkstyle("com.puppycrawl.tools:checkstyle:$checkstyleVersion") - ktlint("com.pinterest:ktlint:0.45.2") + checkstyle(libs.puppycrawl.checkstyle) + ktlint(libs.pinterest.ktlint) /** AndroidX **/ - implementation("androidx.appcompat:appcompat:1.7.1") - implementation("androidx.cardview:cardview:1.0.0") - implementation("androidx.constraintlayout:constraintlayout:2.1.4") - implementation("androidx.core:core-ktx:1.12.0") - implementation("androidx.documentfile:documentfile:1.0.1") - implementation("androidx.fragment:fragment-ktx:1.6.2") - implementation("androidx.lifecycle:lifecycle-livedata-ktx:$androidxLifecycleVersion") - implementation("androidx.lifecycle:lifecycle-viewmodel-ktx:$androidxLifecycleVersion") - implementation("androidx.localbroadcastmanager:localbroadcastmanager:1.1.0") - implementation("androidx.media:media:1.7.0") - implementation("androidx.preference:preference:1.2.1") - implementation("androidx.recyclerview:recyclerview:1.3.2") - implementation("androidx.room:room-runtime:$androidxRoomVersion") - implementation("androidx.room:room-rxjava3:$androidxRoomVersion") - kapt("androidx.room:room-compiler:$androidxRoomVersion") - implementation("androidx.swiperefreshlayout:swiperefreshlayout:1.1.0") - // Newer version specified to prevent accessibility regressions with RecyclerView, see: - // https://developer.android.com/jetpack/androidx/releases/viewpager2#1.1.0-alpha01 - implementation("androidx.viewpager2:viewpager2:1.1.0-beta02") - implementation("androidx.work:work-runtime-ktx:$androidxWorkVersion") - implementation("androidx.work:work-rxjava3:$androidxWorkVersion") - implementation("com.google.android.material:material:1.11.0") - implementation("androidx.webkit:webkit:1.9.0") + implementation(libs.androidx.appcompat) + implementation(libs.androidx.cardview) + implementation(libs.androidx.constraintlayout) + implementation(libs.androidx.core) + implementation(libs.androidx.documentfile) + implementation(libs.androidx.fragment) + implementation(libs.androidx.lifecycle.livedata) + implementation(libs.androidx.lifecycle.viewmodel) + implementation(libs.androidx.localbroadcastmanager) + implementation(libs.androidx.media) + implementation(libs.androidx.preference) + implementation(libs.androidx.recyclerview) + implementation(libs.androidx.room.runtime) + implementation(libs.androidx.room.rxjava3) + kapt(libs.androidx.room.compiler) + implementation(libs.androidx.swiperefreshlayout) + implementation(libs.androidx.viewpager2) + implementation(libs.androidx.work.runtime) + implementation(libs.androidx.work.rxjava3) + implementation(libs.google.android.material) + implementation(libs.androidx.webkit) /** Third-party libraries **/ - implementation("com.github.livefront:bridge:v2.0.2") - implementation("com.evernote:android-state:$stateSaverVersion") - kapt("com.evernote:android-state-processor:$stateSaverVersion") + implementation(libs.livefront.bridge) + implementation(libs.evernote.statesaver.core) + kapt(libs.evernote.statesaver.compiler) // HTML parser - implementation("org.jsoup:jsoup:1.17.2") + implementation(libs.jsoup) // HTTP client - implementation("com.squareup.okhttp3:okhttp:4.12.0") + implementation(libs.squareup.okhttp) // Media player - implementation("com.google.android.exoplayer:exoplayer-core:$exoPlayerVersion") - implementation("com.google.android.exoplayer:exoplayer-dash:$exoPlayerVersion") - implementation("com.google.android.exoplayer:exoplayer-database:$exoPlayerVersion") - implementation("com.google.android.exoplayer:exoplayer-datasource:$exoPlayerVersion") - implementation("com.google.android.exoplayer:exoplayer-hls:$exoPlayerVersion") - implementation("com.google.android.exoplayer:exoplayer-smoothstreaming:$exoPlayerVersion") - implementation("com.google.android.exoplayer:exoplayer-ui:$exoPlayerVersion") - implementation("com.google.android.exoplayer:extension-mediasession:$exoPlayerVersion") + implementation(libs.google.exoplayer.core) + implementation(libs.google.exoplayer.dash) + implementation(libs.google.exoplayer.database) + implementation(libs.google.exoplayer.datasource) + implementation(libs.google.exoplayer.hls) + implementation(libs.google.exoplayer.mediasession) + implementation(libs.google.exoplayer.smoothstreaming) + implementation(libs.google.exoplayer.ui) // Metadata generator for service descriptors - compileOnly("com.google.auto.service:auto-service-annotations:$googleAutoServiceVersion") - kapt("com.google.auto.service:auto-service:$googleAutoServiceVersion") + compileOnly(libs.google.autoservice.annotations) + kapt(libs.google.autoservice.compiler) // Manager for complex RecyclerView layouts - implementation("com.github.lisawray.groupie:groupie:$groupieVersion") - implementation("com.github.lisawray.groupie:groupie-viewbinding:$groupieVersion") + implementation(libs.lisawray.groupie.core) + implementation(libs.lisawray.groupie.viewbinding) // Image loading - //noinspection NewerVersionAvailable,GradleDependency --> 2.8 is the last version, not 2.71828! - implementation("com.squareup.picasso:picasso:2.8") + implementation(libs.squareup.picasso) // Markdown library for Android - implementation("io.noties.markwon:core:$markwonVersion") - implementation("io.noties.markwon:linkify:$markwonVersion") + implementation(libs.noties.markwon.core) + implementation(libs.noties.markwon.linkify) // Crash reporting - implementation("ch.acra:acra-core:5.11.3") + implementation(libs.acra.core) // Properly restarting - implementation("com.jakewharton:process-phoenix:2.1.2") + implementation(libs.jakewharton.phoenix) // Reactive extensions for Java VM - implementation("io.reactivex.rxjava3:rxjava:3.1.8") - implementation("io.reactivex.rxjava3:rxandroid:3.0.2") + implementation(libs.reactivex.rxjava) + implementation(libs.reactivex.rxandroid) // RxJava binding APIs for Android UI widgets - implementation("com.jakewharton.rxbinding4:rxbinding:4.0.0") + implementation(libs.jakewharton.rxbinding) // Date and time formatting - implementation("org.ocpsoft.prettytime:prettytime:5.0.8.Final") + implementation(libs.ocpsoft.prettytime) /** Debugging **/ // Memory leak detection - debugImplementation("com.squareup.leakcanary:leakcanary-object-watcher-android:$leakCanaryVersion") - debugImplementation("com.squareup.leakcanary:plumber-android:$leakCanaryVersion") - debugImplementation("com.squareup.leakcanary:leakcanary-android-core:$leakCanaryVersion") + debugImplementation(libs.squareup.leakcanary.watcher) + debugImplementation(libs.squareup.leakcanary.plumber) + debugImplementation(libs.squareup.leakcanary.core) // Debug bridge for Android - debugImplementation("com.facebook.stetho:stetho:$stethoVersion") - debugImplementation("com.facebook.stetho:stetho-okhttp3:$stethoVersion") + debugImplementation(libs.facebook.stetho.core) + debugImplementation(libs.facebook.stetho.okhttp3) /** Testing **/ - testImplementation("junit:junit:4.13.2") - testImplementation("org.mockito:mockito-core:5.6.0") + testImplementation(libs.junit) + testImplementation(libs.mockito.core) - androidTestImplementation("androidx.test.ext:junit:1.1.5") - androidTestImplementation("androidx.test:runner:1.5.2") - androidTestImplementation("androidx.room:room-testing:$androidxRoomVersion") - androidTestImplementation("org.assertj:assertj-core:3.24.2") + androidTestImplementation(libs.androidx.junit) + androidTestImplementation(libs.androidx.runner) + androidTestImplementation(libs.androidx.room.testing) + androidTestImplementation(libs.assertj.core) } diff --git a/build.gradle.kts b/build.gradle.kts index d08a3cda5..e79ccc3e0 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -4,9 +4,9 @@ */ plugins { - id("com.android.application") version "8.13.0" apply false - id("org.jetbrains.kotlin.android") version "1.9.25" apply false - id("org.jetbrains.kotlin.kapt") version "1.9.25" apply false - id("org.jetbrains.kotlin.plugin.parcelize") version "1.9.25" apply false - id("org.sonarqube") version "4.0.0.2929" apply false + alias(libs.plugins.android.application) apply false + alias(libs.plugins.jetbrains.kotlin.android) apply false + alias(libs.plugins.jetbrains.kotlin.kapt) apply false + alias(libs.plugins.jetbrains.kotlin.parcelize) apply false + alias(libs.plugins.sonarqube) apply false } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 000000000..f0718d4fb --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,130 @@ +# +# SPDX-FileCopyrightText: 2025 NewPipe e.V. +# SPDX-License-Identifier: GPL-3.0-or-later +# + +[versions] +acra = "5.11.3" +agp = "8.13.0" +appcompat = "1.7.1" +assertj = "3.24.2" +autoservice = "1.1.1" +bridge = "v2.0.2" +cardview = "1.0.0" +checkstyle = "10.12.1" +constraintlayout = "2.1.4" +core = "1.12.0" +desugar = "2.0.4" +documentfile = "1.0.1" +exoplayer = "2.18.7" +extractor = "0023b22095a2d62a60cdfc87f4b5cd85c8b266c3" +filepicker = "5.0.0" +fragment = "1.6.2" +groupie = "2.10.1" +jsoup = "1.17.2" +junit = "4.13.2" +junit-ext = "1.1.5" +kotlin = "1.9.25" +ktlint = "0.45.2" +leakcanary = "2.12" +lifecycle = "2.6.2" +localbroadcastmanager = "1.1.0" +markwon = "4.6.2" +material = "1.11.0" +media = "1.7.0" +mockitoCore = "5.6.0" +nanojson = "e9d656ddb49a412a5a0a5d5ef20ca7ef09549996" +okhttp = "4.12.0" +phoenix = "2.1.2" +#noinspection NewerVersionAvailable,GradleDependency --> 2.8 is the last version, not 2.71828! +picasso = "2.8" +preference = "1.2.1" +prettytime = "5.0.8.Final" +recyclerview = "1.3.2" +room = "2.6.1" +runner = "1.5.2" +rxandroid = "3.0.2" +rxbinding = "4.0.0" +rxjava = "3.1.8" +sonarqube = "4.0.0.2929" +statesaver = "1.4.1" +stetho = "1.6.0" +swiperefreshlayout = "1.1.0" +# Newer version specified to prevent accessibility regressions with RecyclerView +# see: https://developer.android.com/jetpack/androidx/releases/viewpager2#1.1.0-alpha01 +viewpager2 = "1.1.0-beta02" +webkit = "1.9.0" +work = "2.8.1" + +[libraries] +acra-core = { module = "ch.acra:acra-core", version.ref = "acra" } +android-desugar = { module = "com.android.tools:desugar_jdk_libs_nio", version.ref = "desugar" } +androidx-appcompat = { module = "androidx.appcompat:appcompat", version.ref = "appcompat" } +androidx-cardview = { module = "androidx.cardview:cardview", version.ref = "cardview" } +androidx-constraintlayout = { module = "androidx.constraintlayout:constraintlayout", version.ref = "constraintlayout" } +androidx-core = { module = "androidx.core:core-ktx", version.ref = "core" } +androidx-documentfile = { module = "androidx.documentfile:documentfile", version.ref = "documentfile" } +androidx-fragment = { module = "androidx.fragment:fragment-ktx", version.ref = "fragment" } +androidx-junit = { module = "androidx.test.ext:junit", version.ref = "junit-ext" } +androidx-lifecycle-livedata = { module = "androidx.lifecycle:lifecycle-livedata-ktx", version.ref = "lifecycle" } +androidx-lifecycle-viewmodel = { module = "androidx.lifecycle:lifecycle-viewmodel-ktx", version.ref = "lifecycle" } +androidx-localbroadcastmanager = { module = "androidx.localbroadcastmanager:localbroadcastmanager", version.ref = "localbroadcastmanager" } +androidx-media = { module = "androidx.media:media", version.ref = "media" } +androidx-preference = { module = "androidx.preference:preference", version.ref = "preference" } +androidx-recyclerview = { module = "androidx.recyclerview:recyclerview", version.ref = "recyclerview" } +androidx-room-compiler = { module = "androidx.room:room-compiler", version.ref = "room" } +androidx-room-runtime = { module = "androidx.room:room-runtime", version.ref = "room" } +androidx-room-rxjava3 = { module = "androidx.room:room-rxjava3", version.ref = "room" } +androidx-room-testing = { module = "androidx.room:room-testing", version.ref = "room" } +androidx-runner = { module = "androidx.test:runner", version.ref = "runner" } +androidx-swiperefreshlayout = { module = "androidx.swiperefreshlayout:swiperefreshlayout", version.ref = "swiperefreshlayout" } +androidx-viewpager2 = { module = "androidx.viewpager2:viewpager2", version.ref = "viewpager2" } +androidx-webkit = { module = "androidx.webkit:webkit", version.ref = "webkit" } +androidx-work-runtime = { module = "androidx.work:work-runtime-ktx", version.ref = "work" } +androidx-work-rxjava3 = { module = "androidx.work:work-rxjava3", version.ref = "work" } +assertj-core = { module = "org.assertj:assertj-core", version.ref = "assertj" } +evernote-statesaver-compiler = { module = "com.evernote:android-state-processor", version.ref = "statesaver" } +evernote-statesaver-core = { module = "com.evernote:android-state", version.ref = "statesaver" } +facebook-stetho-core = { module = "com.facebook.stetho:stetho", version.ref = "stetho" } +facebook-stetho-okhttp3 = { module = "com.facebook.stetho:stetho-okhttp3", version.ref = "stetho" } +google-android-material = { module = "com.google.android.material:material", version.ref = "material" } +google-autoservice-annotations = { module = "com.google.auto.service:auto-service-annotations", version.ref = "autoservice" } +google-autoservice-compiler = { module = "com.google.auto.service:auto-service", version.ref = "autoservice" } +google-exoplayer-core = { module = "com.google.android.exoplayer:exoplayer-core", version.ref = "exoplayer" } +google-exoplayer-dash = { module = "com.google.android.exoplayer:exoplayer-dash", version.ref = "exoplayer" } +google-exoplayer-database = { module = "com.google.android.exoplayer:exoplayer-database", version.ref = "exoplayer" } +google-exoplayer-datasource = { module = "com.google.android.exoplayer:exoplayer-datasource", version.ref = "exoplayer" } +google-exoplayer-hls = { module = "com.google.android.exoplayer:exoplayer-hls", version.ref = "exoplayer" } +google-exoplayer-mediasession = { module = "com.google.android.exoplayer:extension-mediasession", version.ref = "exoplayer" } +google-exoplayer-smoothstreaming = { module = "com.google.android.exoplayer:exoplayer-smoothstreaming", version.ref = "exoplayer" } +google-exoplayer-ui = { module = "com.google.android.exoplayer:exoplayer-ui", version.ref = "exoplayer" } +jakewharton-phoenix = { module = "com.jakewharton:process-phoenix", version.ref = "phoenix" } +jakewharton-rxbinding = { module = "com.jakewharton.rxbinding4:rxbinding", version.ref = "rxbinding" } +jsoup = { module = "org.jsoup:jsoup", version.ref = "jsoup" } +junit = { module = "junit:junit", version.ref = "junit" } +lisawray-groupie-core = { module = "com.github.lisawray.groupie:groupie", version.ref = "groupie" } +lisawray-groupie-viewbinding = { module = "com.github.lisawray.groupie:groupie-viewbinding", version.ref = "groupie" } +livefront-bridge = { module = "com.github.livefront:bridge", version.ref = "bridge" } +mockito-core = { module = "org.mockito:mockito-core", version.ref = "mockitoCore" } +newpipe-extractor = { module = "com.github.TeamNewPipe:NewPipeExtractor", version.ref = "extractor" } +newpipe-filepicker = { module = "com.github.TeamNewPipe:NoNonsense-FilePicker", version.ref = "filepicker" } +newpipe-nanojson = { module = "com.github.TeamNewPipe:nanojson", version.ref = "nanojson" } +noties-markwon-core = { module = "io.noties.markwon:core", version.ref = "markwon" } +noties-markwon-linkify = { module = "io.noties.markwon:linkify", version.ref = "markwon" } +ocpsoft-prettytime = { module = "org.ocpsoft.prettytime:prettytime", version.ref = "prettytime" } +pinterest-ktlint = { module = "com.pinterest:ktlint", version.ref = "ktlint" } +puppycrawl-checkstyle = { module = "com.puppycrawl.tools:checkstyle", version.ref = "checkstyle" } +reactivex-rxandroid = { module = "io.reactivex.rxjava3:rxandroid", version.ref = "rxandroid" } +reactivex-rxjava = { module = "io.reactivex.rxjava3:rxjava", version.ref = "rxjava" } +squareup-leakcanary-core = { module = "com.squareup.leakcanary:leakcanary-android-core", version.ref = "leakcanary" } +squareup-leakcanary-plumber = { module = "com.squareup.leakcanary:plumber-android", version.ref = "leakcanary" } +squareup-leakcanary-watcher = { module = "com.squareup.leakcanary:leakcanary-object-watcher-android", version.ref = "leakcanary" } +squareup-okhttp = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp" } +squareup-picasso = { module = "com.squareup.picasso:picasso", version.ref = "picasso" } + +[plugins] +android-application = { id = "com.android.application", version.ref = "agp" } +jetbrains-kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } +jetbrains-kotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlin" } +jetbrains-kotlin-parcelize = { id = "org.jetbrains.kotlin.plugin.parcelize", version.ref = "kotlin" } +sonarqube = { id = "org.sonarqube", version.ref = "sonarqube" }