LibPlugin.kt 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  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. // previews
  190. debugImplementation(libs.androidx.customview.poolingcontainer)
  191. // foundation
  192. implementation(libs.androidx.foundation)
  193. // Kodein DI
  194. implementation(libs.kodein.di)
  195. implementation(libs.kodein.di.framework.compose)
  196. implementation(libs.kodein.di.framework.android.x)
  197. implementation(libs.kodein.di.framework.android.x.viewmodel)
  198. implementation(libs.kodein.di.framework.android.x.viewmodel.savedstate)
  199. // moshi
  200. implementation(libs.moshi)
  201. implementation(libs.moshi.retrofit.converter)
  202. ksp(libs.moshi.kotlin.codegen)
  203. // okhttp
  204. implementation(platform(libs.okhttp3.bom))
  205. implementation(libs.okhttp3)
  206. implementation(libs.okhttp3.logging.interceptor)
  207. // timber
  208. implementation(libs.timber)
  209. // retrofit
  210. implementation(libs.retrofit)
  211. implementation(libs.retrofit2.kotlin.coroutines.adapter)
  212. // sandwich
  213. implementation(libs.sandwich)
  214. implementation(libs.sandwich.retrofit)
  215. // glide
  216. implementation(libs.glide.okhttp3.integration)
  217. implementation(libs.glide.compose)
  218. ksp(libs.glide.ksp)
  219. // landscapist
  220. implementation(libs.landscapist.glide)
  221. implementation(libs.landscapist.transformation)
  222. implementation(libs.landscapist.palette)
  223. implementation(libs.landscapist.placeholder)
  224. // exif
  225. implementation(libs.androidx.exifinterface)
  226. // exoPlayer
  227. implementation(libs.androidx.media3.exoplayer)
  228. implementation(libs.androidx.media3.exoplayer.dash)
  229. implementation(libs.androidx.media3.exoplayer.hls)
  230. implementation(libs.androidx.media3.exoplayer.rtsp)
  231. implementation(libs.androidx.media3.datasource.cronet)
  232. implementation(libs.androidx.media3.datasource.okhttp)
  233. implementation(libs.androidx.media3.datasource.rtmp)
  234. implementation(libs.androidx.media3.ui)
  235. implementation(libs.androidx.media3.session)
  236. implementation(libs.androidx.media3.extractor)
  237. implementation(libs.androidx.media3.cast)
  238. implementation(libs.androidx.media3.exoplayer.workmanager)
  239. implementation(libs.androidx.media3.transformer)
  240. implementation(libs.androidx.media3.database)
  241. implementation(libs.androidx.media3.decoder)
  242. implementation(libs.androidx.media3.datasource)
  243. implementation(libs.androidx.media3.common)
  244. implementation(libs.androidx.media3.exoplayer.ima)
  245. implementation(libs.androidx.media3.ui.leanback)
  246. // encrypt
  247. implementation(libs.aescrypt)
  248. // permission
  249. implementation(libs.accompanist.permissions)
  250. // zxing
  251. implementation(libs.zxing.core)
  252. // svg
  253. implementation(libs.androidsvg.aar)
  254. // palette
  255. implementation(libs.androidx.palette.ktx)
  256. // lottie
  257. implementation(libs.compose.lottie)
  258. // jsoup
  259. implementation(libs.jsoup)
  260. // dm
  261. implementation(libs.dailymotion.sdk.android)
  262. // widget
  263. implementation(libs.androidx.glance.appwidget)
  264. implementation(libs.androidx.glance.material)
  265. implementation(libs.androidx.glance.material3)
  266. // test
  267. testImplementation(libs.junit)
  268. androidTestImplementation(libs.androidx.junit)
  269. androidTestImplementation(libs.androidx.espresso.core)
  270. // anr
  271. implementation(libs.anrwatchdog)
  272. // oauth
  273. // implementation(libs.auth0)
  274. // implementation(libs.android.jwtdecode)
  275. }
  276. }
  277. }