diff --git a/.github/workflows/continuous-integration.yml b/.github/workflows/continuous-integration.yml index 94d3ced..1f47811 100644 --- a/.github/workflows/continuous-integration.yml +++ b/.github/workflows/continuous-integration.yml @@ -12,34 +12,13 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout project - uses: actions/checkout@v2 - - name: Make Gradle wrapper executable - run: chmod +x ./gradlew - - uses: actions/setup-java@v3 + uses: actions/checkout@v6 + - name: Setup Java + uses: actions/setup-java@v5 with: distribution: "zulu" - java-version: "17" - - name: Restore gradle.properties - env: - SIGNING_KEY_ID: ${{ secrets.SIGNING_KEY_ID }} - SIGNING_KEY_PASSWORD: ${{ secrets.SIGNING_KEY_PASSWORD }} - SIGNING_KEY_RING_FILE: ${{ secrets.SIGNING_KEY_RING_FILE }} - SONATYPE_PASSWORD: ${{ secrets.SONATYPE_PASSWORD }} - SONATYPE_URL: ${{ secrets.SONATYPE_URL }} - SONATYPE_USERNAME: ${{ secrets.SONATYPE_USERNAME }} - shell: bash - run: | - mkdir -p ~/.gradle/ - echo signing.keyId=${SIGNING_KEY_ID} >> ~/.gradle/gradle.properties - echo signing.password=${SIGNING_KEY_PASSWORD} >> ~/.gradle/gradle.properties - echo signing.secretKeyRingFile=${SIGNING_KEY_RING_FILE} >> ~/.gradle/gradle.properties - echo sonatypePassword=${SONATYPE_PASSWORD} >> ~/.gradle/gradle.properties - echo sonatypeUrl=${SONATYPE_URL} >> ~/.gradle/gradle.properties - echo sonatypeUsername=${SONATYPE_USERNAME} >> ~/.gradle/gradle.properties - cat ~/.gradle/gradle.properties - - name: Run lint checks on entire project - run: ./gradlew ktfmtCheck - - name: Unit test the library module - run: ./gradlew :lighthouse:test - - name: Build release version of library - run: ./gradlew :lighthouse:assembleRelease \ No newline at end of file + java-version: "21" + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v5 + - name: Build everything + run: ./gradlew build \ No newline at end of file diff --git a/build.gradle.kts b/build.gradle.kts index db5d7bc..7f736f8 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,4 +1,7 @@ plugins { + alias(libs.plugins.android.application) apply false + alias(libs.plugins.android.library) apply false + alias(libs.plugins.compose.compiler) alias(libs.plugins.ktfmt) } diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts deleted file mode 100644 index bb55574..0000000 --- a/buildSrc/build.gradle.kts +++ /dev/null @@ -1,14 +0,0 @@ -plugins { - `kotlin-dsl` -} - -repositories { - google() - mavenCentral() -} - -dependencies { - implementation(libs.gradle.android) - implementation(libs.gradle.kotlin) - implementation(libs.gradle.maven) -} \ No newline at end of file diff --git a/buildSrc/settings.gradle.kts b/buildSrc/settings.gradle.kts deleted file mode 100644 index 32b7bcb..0000000 --- a/buildSrc/settings.gradle.kts +++ /dev/null @@ -1,8 +0,0 @@ -@Suppress("UnstableApiUsage") -dependencyResolutionManagement { - versionCatalogs { - create("libs") { - from(files("../gradle/libs.versions.toml")) - } - } -} \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/Extensions.kt b/buildSrc/src/main/kotlin/Extensions.kt deleted file mode 100644 index 5b87da4..0000000 --- a/buildSrc/src/main/kotlin/Extensions.kt +++ /dev/null @@ -1,28 +0,0 @@ -@file:Suppress("NOTHING_TO_INLINE") - -package lighthouse - -import org.gradle.api.Project -import org.gradle.api.provider.Property - -val Project.minSdk: Int - get() = intProperty("minSdk") - -val Project.targetSdk: Int - get() = intProperty("targetSdk") - -val Project.compileSdk: Int - get() = intProperty("compileSdk") - -val Project.versionName: String - get() = stringProperty("POM_VERSION") - -private fun Project.intProperty(name: String): Int { - return (property(name) as String).toInt() -} - -private fun Project.stringProperty(name: String): String { - return property(name) as String -} - -inline infix fun Property.by(value: T) = set(value) \ No newline at end of file diff --git a/buildSrc/src/main/kotlin/Projects.kt b/buildSrc/src/main/kotlin/Projects.kt deleted file mode 100644 index c0089c1..0000000 --- a/buildSrc/src/main/kotlin/Projects.kt +++ /dev/null @@ -1,175 +0,0 @@ -package lighthouse - -import com.android.build.api.dsl.CommonExtension -import com.android.build.api.dsl.Lint -import com.android.build.gradle.BaseExtension -import com.android.build.gradle.LibraryExtension -import com.android.build.gradle.TestExtension -import com.android.build.gradle.internal.dsl.BaseAppModuleExtension -import com.vanniktech.maven.publish.MavenPublishBaseExtension -import com.vanniktech.maven.publish.SonatypeHost -import org.gradle.api.JavaVersion -import org.gradle.api.Project -import org.gradle.api.publish.PublishingExtension -import org.gradle.api.publish.maven.MavenPublication -import org.gradle.kotlin.dsl.apply -import org.gradle.kotlin.dsl.configure -import org.gradle.kotlin.dsl.create -import org.gradle.kotlin.dsl.get -import org.gradle.kotlin.dsl.withType -import org.jetbrains.kotlin.gradle.dsl.JvmTarget -import org.jetbrains.kotlin.gradle.tasks.KotlinJvmCompile -/** - * - */ -fun Project.setupLibraryModule( - moduleName: String, - shouldBePublished: Boolean, - action: LibraryExtension.() -> Unit = {}, -) = setupBaseModule(moduleName) { - if (shouldBePublished) { - apply(plugin = "com.vanniktech.maven.publish.base") - publishing { - singleVariant("release") { - withJavadocJar() - withSourcesJar() - } - } - afterEvaluate { - extensions.configure { - publications.create("release") { - from(components["release"]) - // https://github.com/vanniktech/gradle-maven-publish-plugin/issues/326 - val id = project.property("POM_ARTIFACT_ID").toString() - artifactId = artifactId.replace(project.name, id) - } - } - } - extensions.configure { - publishToMavenCentral(SonatypeHost.S01, automaticRelease = true) - signAllPublications() - - coordinates( - groupId = project.property("POM_GROUP_ID").toString(), - artifactId = project.property("POM_ARTIFACT_ID").toString(), - version = project.property("POM_VERSION").toString(), - ) - - pom { - name.set("Lighthouse") - description.set(project.property("POM_DESCRIPTION").toString()) - inceptionYear.set("2022") - url.set(project.property("POM_URL").toString()) - - licenses { - license { - name.set(project.property("POM_LICENSE_NAME").toString()) - url.set(project.property("POM_LICENSE_URL").toString()) - description.set(project.property("POM_LICENSE_URL").toString()) - } - } - - developers { - developer { - id.set(project.property("POM_DEVELOPER_ID").toString()) - name.set(project.property("POM_DEVELOPER_NAME").toString()) - email.set(project.property("POM_DEVELOPER_EMAIL").toString()) - url.set("https://github.com/username/") - } - } - - scm { - url.set(project.property("POM_URL").toString()) - connection.set(project.property("POM_CONNECTION").toString()) - developerConnection.set(project.property("POM_DEV_CONNECTION").toString()) - } - } - } - } - action() -} - -fun Project.setupDemoModule( - name: String, - action: BaseAppModuleExtension.() -> Unit = {}, -) = setupBaseModule(name) { - defaultConfig { - applicationId = name - versionCode = 1 - versionName = project.versionName - } - buildFeatures { - compose = true - } - composeOptions { - kotlinCompilerExtensionVersion = "1.4.2" - } - - buildTypes { - getByName("release") { - isMinifyEnabled = true - isShrinkResources = true - proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt")) - } - } - - packaging { - resources { - excludes += "/META-INF/{AL2.0,LGPL2.1}" - } - } - action() -} - -private fun Project.setupBaseModule( - name: String, - action: T.() -> Unit, -) { - android { - namespace = name - compileSdkVersion(project.compileSdk) - - defaultConfig { - minSdk = project.minSdk - - testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles("consumer-rules.pro") - - aarMetadata { - minCompileSdk = project.minSdk - } - } - - buildTypes { - getByName("debug") { - isMinifyEnabled = false - } - } - - compileOptions { - sourceCompatibility = JavaVersion.VERSION_17 - targetCompatibility = JavaVersion.VERSION_17 - } - - kotlin { - compilerOptions { - jvmTarget by JvmTarget.JVM_17 - } - } - - testOptions { - unitTests { - isReturnDefaultValues = true - } - } - action() - } -} - -private fun Project.android(action: T.() -> Unit) { - extensions.configure("android", action) -} - -private fun Project.kotlin(action: KotlinJvmCompile.() -> Unit) { - tasks.withType().configureEach(action) -} \ No newline at end of file diff --git a/demo/build.gradle.kts b/demo/build.gradle.kts index 158f857..d7dbdd5 100644 --- a/demo/build.gradle.kts +++ b/demo/build.gradle.kts @@ -1,11 +1,41 @@ -import lighthouse.setupDemoModule +import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { - id("com.android.application") - id("org.jetbrains.kotlin.android") + alias(libs.plugins.android.application) + alias(libs.plugins.compose.compiler) } -setupDemoModule(name = "com.ivanempire.lighthouse.demo") +android { + namespace = "com.ivanempire.demo" + compileSdk = 36 + + defaultConfig { + applicationId = "com.ivanempire.demo" + minSdk = 26 + targetSdk = 36 + versionCode = 1 + versionName = "1.0" + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + } + + buildFeatures { compose = true } + + buildTypes { + release { + isMinifyEnabled = false + proguardFiles( + getDefaultProguardFile("proguard-android-optimize.txt"), + "proguard-rules.pro", + ) + } + } + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + kotlin { compilerOptions { jvmTarget.set(JvmTarget.JVM_17) } } +} dependencies { // Core Android libraries @@ -13,7 +43,7 @@ dependencies { implementation(libs.androidx.runtime) // Compose libraries - implementation(platform("androidx.compose:compose-bom:2023.01.00")) + implementation(platform(libs.compose.bom)) implementation(libs.material3) // Compose integration with activities diff --git a/demo/src/main/AndroidManifest.xml b/demo/src/main/AndroidManifest.xml index 7d08c25..b383e03 100644 --- a/demo/src/main/AndroidManifest.xml +++ b/demo/src/main/AndroidManifest.xml @@ -9,7 +9,7 @@ android:supportsRtl="true" android:theme="@style/Theme.Lighthouse"> diff --git a/demo/src/main/java/com/ivanempire/lighthouse/demo/MainActivity.kt b/demo/src/main/java/com/ivanempire/lighthouse/demo/MainActivity.kt index db48328..6e359db 100644 --- a/demo/src/main/java/com/ivanempire/lighthouse/demo/MainActivity.kt +++ b/demo/src/main/java/com/ivanempire/lighthouse/demo/MainActivity.kt @@ -19,6 +19,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableLongStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue @@ -107,11 +108,11 @@ class MainActivity : ComponentActivity() { @OptIn(ExperimentalMaterial3Api::class) @Composable fun DeviceListItem(device: AbridgedMediaDevice) { - var currentTime by remember { mutableStateOf(System.currentTimeMillis()) } + var currentTime by remember { mutableLongStateOf(System.currentTimeMillis()) } val ttl = device.cache - (currentTime - device.latestTimestamp) / 1000 ListItem( - headlineText = { Text(device.location.toString()) }, - supportingText = { Text(device.uuid) }, + headlineContent = { Text(device.location.toString()) }, + supportingContent = { Text(device.uuid) }, trailingContent = { Text(ttl.toString()) }, ) LaunchedEffect(Unit) { diff --git a/gradle.properties b/gradle.properties index 7186696..6140e31 100644 --- a/gradle.properties +++ b/gradle.properties @@ -10,9 +10,10 @@ kotlin.code.style=official systemProp.org.gradle.internal.launcher.welcomeMessageEnabled=false # Project setup -minSdk=21 -targetSdk=34 -compileSdk=34 +# TODO: Drop back to 21 later, it's pulling in navigationevent +minSdk=23 +targetSdk=36 +compileSdk=36 # POM coordinates POM_VERSION=2.1.1 diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 731c39b..563ce46 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,15 +1,15 @@ [versions] -ktfmt = "0.20.1" -gradle = "8.5.2" -maven = "0.26.0" +ktfmt = "0.25.0" +gradle = "9.1.0" +maven = "0.36.0" junit = "4.13.2" -kotlin = "1.8.10" -mockito-core = "5.7.0" -runtime = "2.8.6" -compose = "1.9.2" -androidx = "1.13.1" -coroutines = "1.7.3" -compose-bom = "2024.09.02" +kotlin = "2.3.10" +mockito-core = "5.22.0" +runtime = "2.10.0" +compose = "1.12.4" +androidx = "1.17.0" +coroutines = "1.10.2" +compose-bom = "2026.02.01" [libraries] # Core Gradle dependencies @@ -33,4 +33,9 @@ mockito-core = { module = "org.mockito:mockito-core", version.ref = "mockito-cor testing-junit = { module = "junit:junit", version.ref = "junit" } [plugins] -ktfmt = { id = "com.ncorti.ktfmt.gradle", version.ref = "ktfmt" } \ No newline at end of file +ktfmt = { id = "com.ncorti.ktfmt.gradle", version.ref = "ktfmt" } +android-library = { id = "com.android.library", version.ref = "gradle" } +android-application = { id = "com.android.application", version.ref = "gradle" } +kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } +maven-publish = {id = "com.vanniktech.maven.publish", version.ref = "maven" } +compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index fb497a5..e36125f 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-all.zip -distributionSha256Sum=682b4df7fe5accdca84a4d1ef6a3a6ab096b3efd5edf7de2bd8c758d95a93703 +distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.0-all.zip +distributionSha256Sum=b21468753cb43c167738ee04f10c706c46459cf8f8ae6ea132dc9ce589a261f2 distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME \ No newline at end of file diff --git a/lighthouse/build.gradle.kts b/lighthouse/build.gradle.kts index 39c5bcb..cc4b0e3 100644 --- a/lighthouse/build.gradle.kts +++ b/lighthouse/build.gradle.kts @@ -1,11 +1,43 @@ -import lighthouse.setupLibraryModule +import org.jetbrains.kotlin.gradle.dsl.JvmTarget plugins { - id("com.android.library") - id("kotlin-android") + alias(libs.plugins.android.library) } -setupLibraryModule(moduleName = "com.ivanempire.lighthouse", shouldBePublished = true) +android { + namespace = "com.ivanempire.lighthouse" + compileSdkVersion(36) + + defaultConfig { + minSdk = 23 + + testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles("consumer-rules.pro") + } + + buildTypes { + getByName("debug") { + isMinifyEnabled = false + } + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 + } + + kotlin { + compilerOptions { + jvmTarget = JvmTarget.JVM_17 + } + } + + testOptions { + unitTests { + isReturnDefaultValues = true + } + } +} dependencies { implementation(libs.androidx.core) @@ -14,4 +46,4 @@ dependencies { testImplementation(libs.mockito.core) testImplementation(libs.testing.junit) testImplementation(libs.kotlinx.coroutines.test) -} \ No newline at end of file +} diff --git a/lighthouse/consumer-rules.pro b/lighthouse/consumer-rules.pro index a2c6b55..3e314b3 100644 --- a/lighthouse/consumer-rules.pro +++ b/lighthouse/consumer-rules.pro @@ -1,6 +1,4 @@ # Basic R8 rules for overall project structure --allowaccessmodification --flattenpackagehierarchy -mergeinterfacesaggressively # Remove intrinsic assertions diff --git a/settings.gradle.kts b/settings.gradle.kts index b25bff1..5461c2b 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -1,6 +1,13 @@ pluginManagement { repositories { - google() + mavenLocal() + google { + content { + includeGroupByRegex("com\\.android.*") + includeGroupByRegex("com\\.google.*") + includeGroupByRegex("androidx.*") + } + } mavenCentral() gradlePluginPortal() }