Skip to content

Commit c24f912

Browse files
authored
Migration to Kotlin DSL (#253)
* Migration to Kotlin DSL * Extract "baseline.profm not deterministic" workaround as a separate kotlin dsl convention plugin * Remove obsolete groovy files
1 parent 75fb3c3 commit c24f912

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

69 files changed

+1044
-864
lines changed

app/build.gradle

-147
This file was deleted.

app/build.gradle.kts

+104
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
import java.io.FileInputStream
2+
import java.util.Properties
3+
4+
plugins {
5+
alias(libs.plugins.generic.application)
6+
alias(libs.plugins.generic.baseline.profm)
7+
}
8+
9+
android {
10+
namespace = "com.shifthackz.aisdv1.app"
11+
defaultConfig {
12+
applicationId = "com.shifthackz.aisdv1.app"
13+
versionName = libs.versions.versionName.get()
14+
versionCode = libs.versions.versionCode.get().toInt()
15+
16+
buildConfigField("String", "IMAGE_CDN_URL", "\"https://random.imagecdn.app/\"")
17+
buildConfigField("String", "HUGGING_FACE_URL", "\"https://huggingface.co/\"")
18+
buildConfigField("String", "HUGGING_FACE_INFERENCE_URL", "\"https://api-inference.huggingface.co/\"")
19+
buildConfigField("String", "HORDE_AI_URL", "\"https://stablehorde.net/\"")
20+
buildConfigField("String", "OPEN_AI_URL", "\"https://api.openai.com/\"")
21+
buildConfigField("String", "STABILITY_AI_URL", "\"https://api.stability.ai/\"")
22+
23+
buildConfigField("String", "HORDE_AI_SIGN_UP_URL", "\"https://stablehorde.net/register\"")
24+
buildConfigField("String", "HUGGING_FACE_INFO_URL", "\"https://huggingface.co/docs/api-inference/index\"")
25+
buildConfigField("String", "OPEN_AI_INFO_URL", "\"https://platform.openai.com/api-keys\"")
26+
buildConfigField("String", "STABILITY_AI_INFO_URL", "\"https://platform.stability.ai/\"")
27+
buildConfigField("String", "UPDATE_API_URL", "\"https://sdai.moroz.cc\"")
28+
buildConfigField("String", "DEMO_MODE_API_URL", "\"https://sdai.moroz.cc\"")
29+
buildConfigField("String", "POLICY_URL", "\"https://sdai.moroz.cc/policy.html\"")
30+
buildConfigField("String", "DONATE_URL", "\"https://www.buymeacoffee.com/shifthackz\"")
31+
buildConfigField("String", "GITHUB_SOURCE_URL", "\"https://github.com/ShiftHackZ/Stable-Diffusion-Android\"")
32+
buildConfigField("String", "SETUP_INSTRUCTIONS_URL", "\"https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki\"")
33+
buildConfigField("String", "SWARM_UI_INFO_URL", "\"https://github.com/mcmonkeyprojects/SwarmUI/tree/master/docs\"")
34+
35+
resourceConfigurations += listOf("en", "ru", "uk", "tr", "zh")
36+
}
37+
38+
val hasPropertiesFile = File("app/keystore/signing.properties").exists()
39+
if (hasPropertiesFile) {
40+
val props = Properties()
41+
props.load(FileInputStream(file("keystore/signing.properties")))
42+
val alias = props["keystore.alias"] as String
43+
signingConfigs {
44+
create("release") {
45+
storeFile = file(props["keystore"] as String)
46+
storePassword = props["keystore.password"] as String
47+
keyAlias = alias
48+
keyPassword = props["keystore.password"] as String
49+
}
50+
}
51+
println("[Signature] -> Build will be signed with signature: $alias")
52+
buildTypes.getByName("release").signingConfig = signingConfigs.getByName("release")
53+
}
54+
55+
flavorDimensions += "type"
56+
productFlavors {
57+
create("dev") {
58+
dimension = "type"
59+
applicationIdSuffix = ".dev"
60+
resValue("string", "app_name", "SDAI Dev")
61+
buildConfigField("String", "BUILD_FLAVOR_TYPE", "\"FOSS\"")
62+
}
63+
create("foss") {
64+
dimension = "type"
65+
applicationIdSuffix = ".foss"
66+
resValue("string", "app_name", "SDAI FOSS")
67+
buildConfigField("String", "BUILD_FLAVOR_TYPE", "\"FOSS\"")
68+
}
69+
create("playstore") {
70+
dimension = "type"
71+
resValue("string", "app_name", "SDAI")
72+
buildConfigField("String", "BUILD_FLAVOR_TYPE", "\"GOOGLE_PLAY\"")
73+
}
74+
}
75+
}
76+
77+
dependencies {
78+
implementation(project(":core:common"))
79+
implementation(project(":core:imageprocessing"))
80+
implementation(project(":core:notification"))
81+
implementation(project(":core:validation"))
82+
implementation(project(":presentation"))
83+
implementation(project(":network"))
84+
implementation(project(":storage"))
85+
implementation(project(":domain"))
86+
implementation(project(":feature:auth"))
87+
implementation(project(":feature:diffusion"))
88+
implementation(project(":feature:work"))
89+
implementation(project(":data"))
90+
implementation(project(":demo"))
91+
implementation(libs.koin.core)
92+
implementation(libs.koin.android)
93+
implementation(libs.koin.compose)
94+
implementation(libs.rx.kotlin)
95+
implementation(libs.rx.android)
96+
implementation(libs.timber)
97+
implementation(libs.shifthackz.catppuccin.splash)
98+
implementation(libs.shifthackz.catppuccin.legacy)
99+
implementation(libs.androidx.work.runtime)
100+
}
101+
102+
kapt {
103+
correctErrorTypes = true
104+
}

app/proguard-rules.pro

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# Add project specific ProGuard rules here.
22
# You can control the set of applied configuration files using the
3-
# proguardFiles setting in build.gradle.
3+
# proguardFiles setting in build.gradle.kts.
44
#
55
# For more details, see
66
# http://developer.android.com/guide/developing/tools/proguard.html
+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
plugins {
2+
`kotlin-dsl`
3+
}
4+
5+
java {
6+
sourceCompatibility = JavaVersion.VERSION_17
7+
targetCompatibility = JavaVersion.VERSION_17
8+
}
9+
10+
tasks.withType<org.jetbrains.kotlin.gradle.tasks.KotlinCompile>().configureEach {
11+
kotlinOptions {
12+
jvmTarget = JavaVersion.VERSION_17.toString()
13+
}
14+
}
15+
16+
dependencies {
17+
compileOnly(libs.android.tools.build.gradle)
18+
compileOnly(libs.kotlin.gradle.plugin)
19+
}
20+
21+
gradlePlugin {
22+
plugins {
23+
register("Library") {
24+
id = "generic.library"
25+
implementationClass = "LibraryConventionPlugin"
26+
}
27+
register("Jacoco") {
28+
id = "generic.jacoco"
29+
implementationClass = "JacocoConventionPlugin"
30+
}
31+
register("Compose") {
32+
id = "generic.compose"
33+
implementationClass = "ComposeConventionPlugin"
34+
}
35+
register("Application") {
36+
id = "generic.application"
37+
implementationClass = "ApplicationConventionPlugin"
38+
}
39+
register("BaselineProFm") {
40+
id = "generic.baseline.profm"
41+
implementationClass = "BaselineProFmConventionPlugin"
42+
}
43+
}
44+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import com.android.build.api.dsl.ApplicationExtension
2+
import com.shifthackz.aisdv1.buildlogic.configureApplication
3+
import com.shifthackz.aisdv1.buildlogic.configureCompose
4+
import com.shifthackz.aisdv1.buildlogic.libs
5+
import org.gradle.api.Plugin
6+
import org.gradle.api.Project
7+
import org.gradle.kotlin.dsl.configure
8+
9+
class ApplicationConventionPlugin : Plugin<Project> {
10+
11+
override fun apply(target: Project) {
12+
with(target) {
13+
with(pluginManager) {
14+
apply("com.android.application")
15+
apply("org.jetbrains.kotlin.android")
16+
apply("org.jetbrains.kotlin.kapt")
17+
apply("generic.jacoco")
18+
}
19+
20+
extensions.configure<ApplicationExtension> {
21+
configureApplication(this)
22+
configureCompose(this)
23+
defaultConfig.targetSdk = libs.findVersion("targetSdk").get().toString().toInt()
24+
}
25+
}
26+
}
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
@file:Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE")
2+
3+
import org.gradle.api.Plugin
4+
import org.gradle.api.Project
5+
import com.android.tools.profgen.ArtProfile
6+
import com.android.tools.profgen.ArtProfileSerializer
7+
import com.android.tools.profgen.DexFile
8+
import com.android.tools.profgen.DexFileData
9+
import java.io.FileOutputStream
10+
import java.util.Collections
11+
12+
/**
13+
* Workaround for "Bug: baseline.profm not deterministic"
14+
*
15+
* Reference : https://f-droid.org/docs/Reproducible_Builds/#bug-baselineprofm-not-deterministic
16+
* Fix snippet : https://gist.github.com/obfusk/61046e09cee352ae6dd109911534b12e
17+
* Issue tracker : https://issuetracker.google.com/issues/231837768
18+
*/
19+
class BaselineProFmConventionPlugin : Plugin<Project> {
20+
21+
override fun apply(target: Project) {
22+
target.afterEvaluate {
23+
tasks.forEach { task ->
24+
if (task.name.startsWith("compile") && task.name.endsWith("ReleaseArtProfile")) {
25+
task.doLast {
26+
outputs.files.forEach { file ->
27+
if (file.name.endsWith(".profm")) {
28+
println("[Baseline ProFm] -> Trying to sort: $file")
29+
val version = ArtProfileSerializer.valueOf("METADATA_0_0_2")
30+
val profile = ArtProfile(file)
31+
val keys = ArrayList(profile?.profileData?.keys ?: setOf())
32+
val sortedData = LinkedHashMap<DexFile, DexFileData>()
33+
println("[Baseline ProFm] -> Keys: $keys")
34+
Collections.sort(keys, DexFile.Companion)
35+
println("[Baseline ProFm] -> Keys (sorted): $keys")
36+
37+
keys.forEach { key ->
38+
profile?.profileData?.get(key)?.let { value ->
39+
sortedData[key] = value
40+
}
41+
}
42+
println("[Baseline ProFm] -> Sorted data: $sortedData")
43+
44+
FileOutputStream(file).use { stream ->
45+
println("[Baseline ProFm] -> Writing magic bytes...")
46+
stream.write(version.magicBytes)
47+
println("[Baseline ProFm] -> Writing version bytes...")
48+
stream.write(version.versionBytes)
49+
println("[Baseline ProFm] -> Writing sorted data...")
50+
version.write(stream, sortedData, "")
51+
}
52+
println("[Baseline ProFm] -> Done!")
53+
}
54+
}
55+
}
56+
}
57+
}
58+
}
59+
}
60+
}

0 commit comments

Comments
 (0)