LibPlugin.kt 12 KB

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