LibPlugin.kt 12 KB

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