LibPlugin.kt 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. /*
  2. * Copyright (c) Milan Jurkulák 2024.
  3. * Contact:
  4. * e: mimoccc@gmail.com
  5. * e: mj@mjdev.org
  6. * w: https://mjdev.org
  7. */
  8. package org.mjdev.gradle.plugin
  9. import com.android.build.api.dsl.LibraryExtension
  10. import io.gitlab.arturbosch.detekt.DetektPlugin
  11. import io.gitlab.arturbosch.detekt.extensions.DetektExtension
  12. import org.gradle.api.Project
  13. import org.gradle.api.artifacts.dsl.LockMode
  14. import org.gradle.kotlin.dsl.apply
  15. import org.gradle.kotlin.dsl.configure
  16. import org.gradle.kotlin.dsl.dependencies
  17. import org.jetbrains.dokka.Platform
  18. import org.jmailen.gradle.kotlinter.KotlinterExtension
  19. import org.jmailen.gradle.kotlinter.KotlinterPlugin
  20. import org.mjdev.gradle.base.BasePlugin
  21. import org.mjdev.gradle.plugin.config.LibConfig
  22. import org.mjdev.gradle.extensions.asInt
  23. import org.mjdev.gradle.extensions.runAfterAssembleTask
  24. import org.mjdev.gradle.extensions.extension
  25. import org.mjdev.gradle.extensions.libs
  26. import org.mjdev.gradle.extensions.implementation
  27. import org.mjdev.gradle.extensions.debugImplementation
  28. import org.mjdev.gradle.extensions.kapt
  29. import org.mjdev.gradle.extensions.testImplementation
  30. import org.mjdev.gradle.extensions.androidTestImplementation
  31. import org.mjdev.gradle.extensions.ksp
  32. import org.mjdev.gradle.extensions.kotlinCompileOptions
  33. import org.mjdev.gradle.extensions.detektTask
  34. import org.mjdev.gradle.extensions.dokkaTask
  35. import org.mjdev.gradle.extensions.apply
  36. import org.mjdev.gradle.extensions.fromBuildPropertiesFile
  37. import org.mjdev.gradle.extensions.loadRootPropertiesFile
  38. import org.mjdev.gradle.extensions.projectName
  39. import org.mjdev.gradle.extensions.registerTask
  40. import org.mjdev.gradle.extensions.runAfterCleanTask
  41. import org.mjdev.gradle.tasks.CreatePropsTask
  42. @Suppress("UnstableApiUsage")
  43. class LibPlugin : BasePlugin() {
  44. override fun Project.work() {
  45. val libConfig: LibConfig = extension<LibConfig>(LibConfig.configFieldName)
  46. fromBuildPropertiesFile(libConfig, LibConfig.configPropertiesFile)
  47. loadRootPropertiesFile(libConfig.versionPropertiesFile)
  48. apply(plugin = "kotlin-android")
  49. apply(plugin = "com.android.library")
  50. apply(plugin = "kotlin-kapt")
  51. apply(plugin = "kotlin-parcelize")
  52. apply(plugin = "com.google.devtools.ksp")
  53. apply(plugin = "com.google.dagger.hilt.android")
  54. apply(plugin = "dagger.hilt.android.plugin")
  55. apply(plugin = "io.objectbox")
  56. apply("org.jetbrains.dokka")
  57. apply(DetektPlugin::class)
  58. apply(KotlinterPlugin::class)
  59. registerTask<CreatePropsTask> {
  60. propsFilePath = LibConfig.configPropertiesFile
  61. propsClass = LibConfig::class.java
  62. runAfterCleanTask()
  63. }
  64. configure<LibraryExtension> {
  65. namespace = libConfig.namespace
  66. compileSdk = LibConfig.compileSdk
  67. compileOptions {
  68. sourceCompatibility = LibConfig.javaVersion
  69. targetCompatibility = LibConfig.javaVersion
  70. }
  71. buildFeatures {
  72. compose = LibConfig.composeEnabled
  73. buildConfig = LibConfig.buildConfigEnabled
  74. }
  75. composeOptions {
  76. kotlinCompilerExtensionVersion = LibConfig.kotlinCompilerVersion
  77. }
  78. defaultConfig {
  79. minSdk = LibConfig.minSdk
  80. testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
  81. }
  82. packaging.resources.excludes.addAll(LibConfig.projectExcludes)
  83. buildTypes {
  84. debug {
  85. isMinifyEnabled = false
  86. isShrinkResources = false
  87. proguardFiles(
  88. getDefaultProguardFile(libConfig.proguardFile),
  89. libConfig.proguardRulesFile
  90. )
  91. }
  92. release {
  93. isMinifyEnabled = libConfig.minify
  94. isShrinkResources = false
  95. proguardFiles(
  96. getDefaultProguardFile(libConfig.proguardFile),
  97. libConfig.proguardRulesFile
  98. )
  99. }
  100. }
  101. sourceSets {
  102. getByName("main") {
  103. jniLibs.srcDirs()
  104. }
  105. }
  106. lint {
  107. checkReleaseBuilds = true
  108. checkAllWarnings = true
  109. showAll = true
  110. explainIssues = true
  111. abortOnError = !libConfig.ignoreCodeFailures
  112. warningsAsErrors = !libConfig.ignoreCodeFailures
  113. disable += "UnusedIds"
  114. }
  115. testOptions {
  116. unitTests.isReturnDefaultValues = true
  117. }
  118. testCoverage {
  119. jacocoVersion = LibConfig.jacocoVersion
  120. }
  121. }
  122. afterEvaluate {
  123. detektTask {
  124. if (libConfig.autoCorrectCode) {
  125. runAfterAssembleTask()
  126. }
  127. }
  128. dokkaTask {
  129. outputDirectory.set(rootDir.resolve(libConfig.documentationDir))
  130. moduleName.set(projectName)
  131. suppressObviousFunctions.set(false)
  132. dokkaSourceSets.configureEach {
  133. offlineMode.set(false)
  134. includeNonPublic.set(false)
  135. skipDeprecated.set(false)
  136. failOnWarning.set(libConfig.failOnDocumentationWarning)
  137. reportUndocumented.set(libConfig.reportUndocumentedFiles)
  138. skipEmptyPackages.set(false)
  139. platform.set(Platform.jvm)
  140. jdkVersion.set(LibConfig.javaVersion.asInt())
  141. noStdlibLink.set(false)
  142. noJdkLink.set(false)
  143. noAndroidSdkLink.set(false)
  144. }
  145. if (libConfig.createDocumentation) {
  146. runAfterAssembleTask()
  147. }
  148. }
  149. kotlinCompileOptions {
  150. kotlinOptions {
  151. freeCompilerArgs += "-Xjsr305=strict"
  152. jvmTarget = LibConfig.javaVersion.toString()
  153. }
  154. }
  155. configure<DetektExtension> {
  156. reportsDir = rootDir.resolve(libConfig.codeReportsDir)
  157. ignoreFailures = libConfig.ignoreCodeFailures
  158. @Suppress("DEPRECATION")
  159. config = files(project.rootDir.resolve(libConfig.detectConfigFile))
  160. }
  161. configure<KotlinterExtension> {
  162. ignoreFailures = libConfig.ignoreCodeFailures
  163. reporters = arrayOf("checkstyle", "plain")
  164. }
  165. }
  166. dependencyLocking {
  167. lockMode.set(LockMode.STRICT)
  168. }
  169. dependencies {
  170. // core
  171. implementation(libs.androidx.ktx)
  172. implementation(libs.kotlinx.coroutines.android)
  173. implementation(libs.kotlinx.coroutines.core)
  174. // reflect / todo : remove
  175. implementation(libs.kotlin.reflect)
  176. // window manager
  177. implementation(libs.androidx.window)
  178. // fix duplicates
  179. implementation(libs.androidx.work.runtime.ktx)
  180. // compose
  181. implementation(platform(libs.androidx.compose.bom))
  182. implementation(libs.androidx.compose.ui.tooling)
  183. implementation(libs.androidx.compose.activity)
  184. // more icons
  185. implementation(libs.androidx.material.icons.extended)
  186. // tv compose
  187. implementation(libs.androidx.tv.foundation)
  188. implementation(libs.androidx.tv.material)
  189. // view model
  190. implementation(libs.androidx.compose.lifecycle.viewmodel)
  191. // navigation
  192. implementation(libs.androidx.compose.navigation)
  193. // todo remove, dynamic background & colors
  194. implementation(libs.androidx.material3)
  195. // previews
  196. debugImplementation(libs.androidx.customview.poolingcontainer)
  197. // foundation
  198. implementation(libs.androidx.foundation)
  199. // dagger
  200. implementation(libs.dagger)
  201. // dagger android
  202. implementation(libs.dagger.android)
  203. implementation(libs.dagger.android.support)
  204. // dagger hilt
  205. implementation(libs.dagger.hilt.android)
  206. implementation(libs.androidx.compose.hilt.navigation)
  207. kapt(libs.dagger.compiler)
  208. kapt(libs.dagger.android.processor)
  209. kapt(libs.dagger.hilt.compiler)
  210. // moshi
  211. implementation(libs.moshi)
  212. implementation(libs.moshi.retrofit.converter)
  213. ksp(libs.moshi.kotlin.codegen)
  214. // okhttp
  215. implementation(platform(libs.okhttp3.bom))
  216. implementation(libs.okhttp3)
  217. implementation(libs.okhttp3.logging.interceptor)
  218. // timber
  219. implementation(libs.timber)
  220. // retrofit
  221. implementation(libs.retrofit)
  222. implementation(libs.retrofit2.kotlin.coroutines.adapter)
  223. // sandwich
  224. implementation(libs.sandwich)
  225. implementation(libs.sandwich.retrofit)
  226. // glide
  227. implementation(libs.glide.okhttp3.integration)
  228. implementation(libs.glide.compose)
  229. ksp(libs.glide.ksp)
  230. // landscapist
  231. implementation(libs.landscapist.glide)
  232. implementation(libs.landscapist.transformation)
  233. implementation(libs.landscapist.palette)
  234. implementation(libs.landscapist.placeholder)
  235. // exif
  236. implementation(libs.androidx.exifinterface)
  237. // exoPlayer
  238. implementation(libs.androidx.media3.exoplayer)
  239. implementation(libs.androidx.media3.exoplayer.dash)
  240. implementation(libs.androidx.media3.exoplayer.hls)
  241. implementation(libs.androidx.media3.exoplayer.rtsp)
  242. implementation(libs.androidx.media3.datasource.cronet)
  243. implementation(libs.androidx.media3.datasource.okhttp)
  244. implementation(libs.androidx.media3.datasource.rtmp)
  245. implementation(libs.androidx.media3.ui)
  246. implementation(libs.androidx.media3.session)
  247. implementation(libs.androidx.media3.extractor)
  248. implementation(libs.androidx.media3.cast)
  249. implementation(libs.androidx.media3.exoplayer.workmanager)
  250. implementation(libs.androidx.media3.transformer)
  251. implementation(libs.androidx.media3.database)
  252. implementation(libs.androidx.media3.decoder)
  253. implementation(libs.androidx.media3.datasource)
  254. implementation(libs.androidx.media3.common)
  255. implementation(libs.androidx.media3.exoplayer.ima)
  256. implementation(libs.androidx.media3.ui.leanback)
  257. // encrypt
  258. implementation(libs.aescrypt)
  259. // permission
  260. implementation(libs.accompanist.permissions)
  261. // zxing
  262. implementation(libs.zxing.core)
  263. // svg
  264. implementation(libs.androidsvg.aar)
  265. // pallette
  266. implementation(libs.androidx.palette.ktx)
  267. // lottie
  268. implementation(libs.compose.lottie)
  269. // jsoup
  270. implementation(libs.jsoup)
  271. // dm
  272. implementation(libs.dailymotion.sdk.android)
  273. // dynamic theme
  274. implementation(libs.android.material)
  275. // widget
  276. implementation(libs.androidx.glance.appwidget)
  277. implementation(libs.androidx.glance.material)
  278. implementation(libs.androidx.glance.material3)
  279. // test
  280. testImplementation(libs.junit)
  281. androidTestImplementation(libs.androidx.junit)
  282. androidTestImplementation(libs.androidx.espresso.core)
  283. // anr
  284. implementation(libs.anrwatchdog)
  285. // oauth
  286. implementation(libs.auth0)
  287. implementation(libs.android.jwtdecode)
  288. }
  289. }
  290. }