diff --git a/Jetcaster/package.mill b/Jetcaster/package.mill new file mode 100644 index 000000000..0a4cb66fe --- /dev/null +++ b/Jetcaster/package.mill @@ -0,0 +1,416 @@ +package build.Jetcaster + +import mill.* +import androidlib.* +import kotlinlib.* +import build.* +import mill.api.Task.Simple as T +import mill.api.{PathRef, Task} +import mill.javalib.api.JvmWorkerApi +import mill.kotlinlib.ksp.KspModule +import hilt.AndroidHiltSupport + +import java.nio.file.Files + +object Versions { + val kotlinVersion = "2.1.21" + val kspVersion = "2.0.2" + val androidCompileSdk = 33 + val androidMinSdk = 21 +} + +trait BaseAndroidModule extends AndroidKotlinModule { + def kotlinVersion = Versions.kotlinVersion + + def androidSdkModule = mill.api.ModuleRef(build.androidSdkModule0) + + def androidCompileSdk = Versions.androidCompileSdk + + def androidMinSdk = Versions.androidMinSdk +} + +trait BaseHiltAndroidModule extends BaseAndroidModule, AndroidHiltSupport { + def kspVersion = Versions.kspVersion + def kspJvmTarget = "17" + + override def kotlinUseEmbeddableCompiler: Task[Boolean] = Task { + true + } + + def generatedBuildConfig: T[PathRef] = Task { + val buildType = if (androidIsDebug()) "debug" else "release" + val content: String = + s""" + |package $androidNamespace; + |public final class BuildConfig { + | public static final boolean DEBUG = ${androidIsDebug()}; + | public static final String BUILD_TYPE = "${buildType}"; + | public static final int VERSION_CODE = ${androidVersionCode()}; + | public static final String VERSION_NAME = "${androidVersionName()}"; + |} + """.stripMargin + + val destination = Task.dest / "source" / os.SubPath(androidNamespace.replace( + ".", + "/" + )) / "BuildConfig.java" + + os.write(destination, content, createFolders = true) + + PathRef(destination) + } + + override def generatedSources: T[Seq[PathRef]] = Task { + super.generatedSources() ++ Seq(generatedBuildConfig()) + } +} + + + +object core extends mill.api.Module { + object data extends BaseHiltAndroidModule { + override def androidNamespace: String = "com.example.jetcaster.core.data" + + def androidEnableCompose: T[Boolean] = true + + def bomMvnDeps: T[Seq[Dep]] = Seq( + mvn"androidx.compose:compose-bom-alpha:2025.06.00" + ) + + def kotlinSymbolProcessors: T[Seq[Dep]] = Seq( + mvn"com.google.dagger:hilt-compiler:2.56.2", + mvn"androidx.room:room-compiler:2.7.1" + ) + + override def mvnDeps: T[Seq[Dep]] = super.mvnDeps() ++ Seq( + /* + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.appcompat) + implementation(libs.androidx.compose.runtime) + + // Image loading + implementation(libs.coil.kt.compose) + */ + mvn"androidx.core:core-ktx:1.16.0", + mvn"androidx.appcompat:appcompat:1.7.1", + mvn"androidx.compose.runtime:runtime", + mvn"io.coil-kt:coil-compose:2.7.0", + + /* + // Dependency injection + implementation(libs.androidx.hilt.navigation.compose) + implementation(libs.hilt.android) + */ + mvn"androidx.hilt:hilt-navigation-compose:1.2.0", + mvn"com.google.dagger:hilt-android:2.56.2", + + /* + // Networking + implementation(libs.okhttp3) + implementation(libs.okhttp.logging) + + // Database + implementation(libs.androidx.room.runtime) + implementation(libs.androidx.room.ktx) + ksp(libs.androidx.room.compiler) + */ + mvn"com.squareup.okhttp3:okhttp:4.12.0", + mvn"com.squareup.okhttp3:logging-interceptor:4.12.0", + mvn"androidx.room:room-runtime:2.7.1", + mvn"androidx.room:room-ktx:2.7.1", + + /* + implementation(libs.rometools.rome) + implementation(libs.rometools.modules) + */ + mvn"com.rometools:rome:2.1.0", + mvn"com.rometools:rome-modules:2.1.0", + ) + // testing??? + + } + + object `data-testing` extends BaseAndroidModule { + override def androidNamespace: String = "com.example.jetcaster.core.data.testing" + + override def mvnDeps: T[Seq[Dep]] = super.mvnDeps() ++ Seq( + /* + implementation(libs.androidx.core.ktx) + */ + mvn"androidx.core:core-ktx:1.16.0" + ) + + // testing??? + + override def moduleDeps = super.moduleDeps ++ Seq( + core.data + ) + } + + object designsystem extends BaseAndroidModule { + + override def androidNamespace: String = "com.example.jetcaster.core.designsystem" + + def androidEnableCompose: T[Boolean] = true + + def bomMvnDeps: T[Seq[Dep]] = Seq( + mvn"androidx.compose:compose-bom-alpha:2025.06.00" + ) + + override def mvnDeps: T[Seq[Dep]] = super.mvnDeps() ++ Seq( + /* + implementation(composeBom) + implementation(libs.androidx.compose.foundation) + implementation(libs.androidx.compose.material3) + implementation(libs.androidx.compose.ui.graphics) + implementation(libs.androidx.compose.ui.text) + implementation(libs.coil.kt.compose) + + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.appcompat) + */ + mvn"androidx.compose.foundation:foundation", + mvn"androidx.compose.material3:material3", + mvn"androidx.compose.ui:ui-graphics", + mvn"androidx.compose.ui:ui-text", + mvn"io.coil-kt:coil-compose:2.7.0", + mvn"androidx.core:core-ktx:1.16.0", + mvn"androidx.appcompat:appcompat:1.7.1" + ) + + } + + object domain extends BaseHiltAndroidModule { + override def androidNamespace: String = "com.example.jetcaster.core.domain" + + def kotlinSymbolProcessors: T[Seq[Dep]] = Seq( + mvn"com.google.dagger:hilt-compiler:2.56.2", + ) + + override def mvnDeps: T[Seq[Dep]] = super.mvnDeps() ++ Seq( + + /* + // Dependency injection + implementation(libs.androidx.hilt.navigation.compose) + implementation(libs.hilt.android) + ksp(libs.hilt.compiler) + */ + mvn"androidx.hilt:hilt-navigation-compose:1.2.0", + mvn"com.google.dagger:hilt-android:2.56.2" + ) + + override def moduleDeps = super.moduleDeps ++ Seq( + core.data, + core.`data-testing` + ) + + // testing??? + } + + object `domain-testing` extends BaseAndroidModule { + override def androidNamespace: String = "com.example.jetcaster.core.domain.testing" + + // testing??? + + override def moduleDeps = super.moduleDeps ++ Seq( + core.domain + ) + } +} + + +object glancewidget extends BaseAndroidModule { + + override def androidNamespace: String = "com.example.jetcaster.glancewidget" + + def androidEnableCompose: T[Boolean] = true + + def bomMvnDeps: T[Seq[Dep]] = Seq( + mvn"androidx.compose:compose-bom-alpha:2025.06.00" + ) + + /* + debugImplementation(libs.androidx.compose.ui.tooling) + debugImplementation(libs.androidx.compose.ui.test.manifest) + */ + def debugMvnDeps: T[Seq[Dep]] = Task { + Seq( + mvn"androidx.compose.ui:ui-tooling", + mvn"androidx.compose.ui:ui-test-manifest" + ) + } + + override def mvnDeps: T[Seq[Dep]] = super.mvnDeps() ++ Seq( + /* + implementation(libs.androidx.glance.appwidget) + implementation(libs.androidx.glance.material3) + implementation(libs.androidx.glance) + */ + mvn"androidx.glance:glance-appwidget:1.1.1", + mvn"androidx.glance:glance-material3:1.1.1", + mvn"androidx.glance:glance:1.1.1", + + // implementation(libs.coil.kt.compose) + mvn"io.coil-kt:coil-compose:2.7.0", + + /* + implementation(libs.androidx.core.ktx) + implementation(libs.android.material3) + implementation(libs.androidx.lifecycle.runtime) + implementation(libs.androidx.activity.compose) + implementation(platform(libs.androidx.compose.bom)) + implementation(libs.androidx.compose.ui) + implementation(libs.androidx.compose.ui.graphics) + implementation(libs.androidx.compose.ui.tooling.preview) + implementation(libs.androidx.compose.material3) + */ + mvn"androidx.core:core-ktx:1.16.0", + mvn"com.google.android.material:material:1.13.0-alpha13", + mvn"androidx.lifecycle:lifecycle-runtime-ktx:2.9.1", + mvn"androidx.activity:activity-compose:1.10.1", + mvn"androidx.compose.ui:ui", + mvn"androidx.compose.ui:ui-graphics", + mvn"androidx.compose.ui:ui-tooling-preview", + mvn"androidx.compose.material3:material3" + + ) ++ (if (androidIsDebug()) debugMvnDeps() else Seq()) + + // implementation(projects.core.designsystem) + override def moduleDeps = super.moduleDeps ++ Seq( + core.designsystem + ) + +// object androidTest ?? + +} + +//AndroidBuildConfig ? +object mobile extends BaseHiltAndroidModule, AndroidR8AppModule { + + override def androidApplicationNamespace: String = "com.example.jetcaster" + + override def androidApplicationId: String = "com.example.jetcaster" + + def androidEnableCompose: T[Boolean] = true + + def bomMvnDeps: T[Seq[Dep]] = Seq( + mvn"androidx.compose:compose-bom-alpha:2025.06.00" + ) + + def kotlinSymbolProcessors: T[Seq[Dep]] = Seq( + mvn"com.google.dagger:hilt-compiler:2.56.2", + ) + + override def androidDebugSettings: T[AndroidBuildTypeSettings] = Task { + AndroidBuildTypeSettings( + isMinifyEnabled = false + ) + } + + def androidProjectProguardFiles = Task.Sources( + "proguard-rules.pro" + ) + def androidDefaultProguardFileNames: Task[Seq[String]] = Task.Anon { + Seq("proguard-android-optimize.txt") + } + + // Missing javax.xml.* + // Missing javax.lang.model.* + // Missing org.jaxen.* + override def androidR8Args = Seq("--map-diagnostics", "error", "warning") + + + private def debugMvnDeps: T[Seq[Dep]] = Task { + Seq( + mvn"androidx.compose.ui:ui-tooling" + ) + } + + /* + implementation(projects.core.data) + implementation(projects.core.designsystem) + implementation(projects.core.domain) + implementation(projects.glancewidget) + implementation(projects.core.domainTesting) + */ + def moduleDeps = super.moduleDeps ++ Seq( + core.data, + core.designsystem, + core.domain, + glancewidget, + core.`domain-testing` + ) + + + override def mvnDeps: T[Seq[Dep]] = super.mvnDeps() ++ Seq( + + /* + implementation(libs.kotlin.stdlib) + implementation(libs.kotlinx.coroutines.android) + implementation(libs.kotlinx.collections.immutable) + + implementation(libs.androidx.core.ktx) + implementation(libs.androidx.palette) + */ + mvn"org.jetbrains.kotlin:kotlin-stdlib-jdk8:${Versions.kotlinVersion}", + mvn"org.jetbrains.kotlinx:kotlinx-coroutines-android:1.10.2", + mvn"org.jetbrains.kotlinx:kotlinx-collections-immutable:0.4.0", + mvn"androidx.core:core-ktx:1.16.0", + mvn"androidx.palette:palette:1.0.0", + + /* + implementation(libs.androidx.hilt.navigation.compose) + implementation(libs.hilt.android) + ksp(libs.hilt.compiler) + */ + // Hilt + mvn"androidx.hilt:hilt-navigation-compose:1.2.0", + mvn"com.google.dagger:hilt-android:2.56.2", + + /* + Compose + implementation(libs.androidx.activity.compose) + implementation(libs.androidx.compose.foundation) + implementation(libs.androidx.compose.material3) + implementation(libs.androidx.compose.material3.adaptive) + implementation(libs.androidx.compose.material3.adaptive.layout) + implementation(libs.androidx.compose.material3.adaptive.navigation) + implementation(libs.androidx.compose.ui) + implementation(libs.androidx.compose.ui.tooling.preview) + */ + // Compose + mvn"androidx.activity:activity-compose:1.10.1", + mvn"androidx.compose.foundation:foundation", + mvn"androidx.compose.material3:material3", + mvn"androidx.compose.material3.adaptive:adaptive", + mvn"androidx.compose.material3.adaptive:adaptive-layout", + mvn"androidx.compose.material3.adaptive:adaptive-navigation", + mvn"androidx.compose.ui:ui", + mvn"androidx.compose.ui:ui-tooling-preview", + + /* + More Compose + implementation(libs.androidx.lifecycle.runtime) + implementation(libs.androidx.lifecycle.viewModelCompose) + implementation(libs.androidx.lifecycle.runtime.compose) + implementation(libs.androidx.navigation.compose) + + implementation(libs.androidx.window) + implementation(libs.androidx.window.core) + + implementation(libs.accompanist.adaptive) + + implementation(libs.coil.kt.compose) + */ + mvn"androidx.lifecycle:lifecycle-runtime-ktx:2.9.1", + mvn"androidx.lifecycle:lifecycle-viewmodel-compose:2.9.1", + mvn"androidx.lifecycle:lifecycle-runtime-compose:2.9.1", + mvn"androidx.navigation:navigation-compose:2.9.0", + mvn"androidx.window:window:1.4.0", + mvn"androidx.window:window-core:1.4.0", + mvn"com.google.accompanist:accompanist-adaptive:0.37.3", + mvn"io.coil-kt:coil-compose:2.7.0", + + ) ++ (if (androidIsDebug()) debugMvnDeps() else Seq()) + +}