Compare commits

...
2 Commits
Author SHA1 Message Date
KremeCN b39b3f95c7 test: add Compose screenshot baseline 2026-08-26 07:10:34 +08:00
KremeCN 94e3e394af build: modernize Android Compose toolchain 2026-08-26 06:38:26 +08:00
14 changed files with 104 additions and 45 deletions
+13 -10
View File
@@ -1,18 +1,24 @@
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
plugins { plugins {
alias(libs.plugins.android.application) alias(libs.plugins.android.application)
alias(libs.plugins.kotlin.android) alias(libs.plugins.kotlin.android)
alias(libs.plugins.kotlin.compose)
alias(libs.plugins.kotlin.kapt) alias(libs.plugins.kotlin.kapt)
alias(libs.plugins.hilt.android) alias(libs.plugins.hilt.android)
alias(libs.plugins.compose.screenshot)
} }
android { android {
namespace = "com.flagship.abox.manager" namespace = "com.flagship.abox.manager"
compileSdk = 34 compileSdk = 37
experimentalProperties["android.experimental.enableScreenshotTest"] = true
defaultConfig { defaultConfig {
applicationId = "com.flagship.abox.manager" applicationId = "com.flagship.abox.manager"
minSdk = 26 minSdk = 26
targetSdk = 34 targetSdk = 36
versionCode = 1 versionCode = 1
versionName = "0.1.0" versionName = "0.1.0"
@@ -33,19 +39,11 @@ android {
compose = true compose = true
} }
composeOptions {
kotlinCompilerExtensionVersion = libs.versions.composeCompiler.get()
}
compileOptions { compileOptions {
sourceCompatibility = JavaVersion.VERSION_17 sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17
} }
kotlinOptions {
jvmTarget = "17"
}
packaging { packaging {
resources { resources {
excludes += "/META-INF/{AL2.0,LGPL2.1}" excludes += "/META-INF/{AL2.0,LGPL2.1}"
@@ -57,6 +55,10 @@ android {
} }
} }
kotlin {
compilerOptions { jvmTarget.set(JvmTarget.JVM_17) }
}
kapt { kapt {
correctErrorTypes = true correctErrorTypes = true
} }
@@ -95,4 +97,5 @@ dependencies {
androidTestImplementation(libs.compose.ui.test.junit4) androidTestImplementation(libs.compose.ui.test.junit4)
debugImplementation(libs.compose.ui.tooling) debugImplementation(libs.compose.ui.tooling)
debugImplementation(libs.compose.ui.test.manifest) debugImplementation(libs.compose.ui.test.manifest)
screenshotTestImplementation(libs.compose.screenshot.test)
} }
@@ -0,0 +1,14 @@
package com.flagship.abox.manager.ui
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.tooling.preview.Preview
import com.android.tools.screenshot.PreviewTest
import com.flagship.abox.manager.designsystem.ABoxTheme
@PreviewTest
@Preview
@Composable
fun AppSmokePreview() {
ABoxTheme(darkTheme = false) { Text("ABox Manager") }
}
+11 -8
View File
@@ -1,11 +1,17 @@
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
plugins { plugins {
alias(libs.plugins.android.library) alias(libs.plugins.android.library)
alias(libs.plugins.kotlin.android) alias(libs.plugins.kotlin.android)
alias(libs.plugins.kotlin.compose)
alias(libs.plugins.compose.screenshot)
} }
android { android {
namespace = "com.flagship.abox.manager.designsystem" namespace = "com.flagship.abox.manager.designsystem"
compileSdk = 34 compileSdk = 37
experimentalProperties["android.experimental.enableScreenshotTest"] = true
defaultConfig { defaultConfig {
minSdk = 26 minSdk = 26
@@ -15,18 +21,14 @@ android {
compose = true compose = true
} }
composeOptions {
kotlinCompilerExtensionVersion = libs.versions.composeCompiler.get()
}
compileOptions { compileOptions {
sourceCompatibility = JavaVersion.VERSION_17 sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17
} }
}
kotlinOptions { kotlin {
jvmTarget = "17" compilerOptions { jvmTarget.set(JvmTarget.JVM_17) }
}
} }
dependencies { dependencies {
@@ -36,4 +38,5 @@ dependencies {
implementation(libs.compose.material3) implementation(libs.compose.material3)
implementation(libs.compose.material.icons.extended) implementation(libs.compose.material.icons.extended)
debugImplementation(libs.compose.ui.tooling) debugImplementation(libs.compose.ui.tooling)
screenshotTestImplementation(libs.compose.screenshot.test)
} }
@@ -0,0 +1,13 @@
package com.flagship.abox.manager.designsystem
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.tooling.preview.Preview
import com.android.tools.screenshot.PreviewTest
@PreviewTest
@Preview
@Composable
fun DesignSystemSmokePreview() {
ABoxTheme(darkTheme = false) { Text("截图基线") }
}
+7 -4
View File
@@ -1,3 +1,5 @@
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
plugins { plugins {
alias(libs.plugins.android.library) alias(libs.plugins.android.library)
alias(libs.plugins.kotlin.android) alias(libs.plugins.kotlin.android)
@@ -5,7 +7,7 @@ plugins {
android { android {
namespace = "com.flagship.abox.manager.session" namespace = "com.flagship.abox.manager.session"
compileSdk = 34 compileSdk = 37
defaultConfig { defaultConfig {
minSdk = 26 minSdk = 26
@@ -16,10 +18,10 @@ android {
sourceCompatibility = JavaVersion.VERSION_17 sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17
} }
}
kotlinOptions { kotlin {
jvmTarget = "17" compilerOptions { jvmTarget.set(JvmTarget.JVM_17) }
}
} }
dependencies { dependencies {
@@ -31,4 +33,5 @@ dependencies {
testImplementation(libs.kotlinx.coroutines.test) testImplementation(libs.kotlinx.coroutines.test)
androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.test.runner) androidTestImplementation(libs.androidx.test.runner)
androidTestImplementation(libs.kotlinx.coroutines.test)
} }
@@ -1,6 +1,7 @@
package com.flagship.abox.manager.session package com.flagship.abox.manager.session
import androidx.datastore.preferences.core.PreferenceDataStoreFactory import androidx.datastore.preferences.core.PreferenceDataStoreFactory
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.flagship.abox.manager.domain.DomainResult import com.flagship.abox.manager.domain.DomainResult
import com.flagship.abox.manager.domain.LoginCredentials import com.flagship.abox.manager.domain.LoginCredentials
import com.flagship.abox.manager.domain.Password import com.flagship.abox.manager.domain.Password
@@ -13,7 +14,9 @@ import kotlinx.coroutines.test.runTest
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
import org.junit.Assert.assertNull import org.junit.Assert.assertNull
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
class CredentialStoreTest { class CredentialStoreTest {
@Test @Test
fun storesClearsAndIsolatesCredentials() = runTest { fun storesClearsAndIsolatesCredentials() = runTest {
@@ -1,6 +1,7 @@
package com.flagship.abox.manager.session package com.flagship.abox.manager.session
import androidx.datastore.preferences.core.PreferenceDataStoreFactory import androidx.datastore.preferences.core.PreferenceDataStoreFactory
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.flagship.abox.manager.domain.DomainResult import com.flagship.abox.manager.domain.DomainResult
import com.flagship.abox.manager.domain.LoginPreferences import com.flagship.abox.manager.domain.LoginPreferences
import com.flagship.abox.manager.domain.ProviderProfile import com.flagship.abox.manager.domain.ProviderProfile
@@ -13,7 +14,9 @@ import kotlinx.coroutines.flow.first
import kotlinx.coroutines.test.runTest import kotlinx.coroutines.test.runTest
import org.junit.Assert.assertEquals import org.junit.Assert.assertEquals
import org.junit.Test import org.junit.Test
import org.junit.runner.RunWith
@RunWith(AndroidJUnit4::class)
class ProviderProfileStoreTest { class ProviderProfileStoreTest {
@Test @Test
fun persistsActiveProfileAndLoginPreferences() = runTest { fun persistsActiveProfileAndLoginPreferences() = runTest {
+7 -8
View File
@@ -1,13 +1,16 @@
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
plugins { plugins {
alias(libs.plugins.android.library) alias(libs.plugins.android.library)
alias(libs.plugins.kotlin.android) alias(libs.plugins.kotlin.android)
alias(libs.plugins.kotlin.compose)
alias(libs.plugins.kotlin.kapt) alias(libs.plugins.kotlin.kapt)
alias(libs.plugins.hilt.android) alias(libs.plugins.hilt.android)
} }
android { android {
namespace = "com.flagship.abox.manager.infrared" namespace = "com.flagship.abox.manager.infrared"
compileSdk = 34 compileSdk = 37
defaultConfig { defaultConfig {
minSdk = 26 minSdk = 26
@@ -18,18 +21,14 @@ android {
compose = true compose = true
} }
composeOptions {
kotlinCompilerExtensionVersion = libs.versions.composeCompiler.get()
}
compileOptions { compileOptions {
sourceCompatibility = JavaVersion.VERSION_17 sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17
} }
}
kotlinOptions { kotlin {
jvmTarget = "17" compilerOptions { jvmTarget.set(JvmTarget.JVM_17) }
}
} }
kapt { kapt {
+2 -1
View File
@@ -2,8 +2,9 @@ plugins {
alias(libs.plugins.android.application) apply false alias(libs.plugins.android.application) apply false
alias(libs.plugins.android.library) apply false alias(libs.plugins.android.library) apply false
alias(libs.plugins.kotlin.android) apply false alias(libs.plugins.kotlin.android) apply false
alias(libs.plugins.kotlin.compose) apply false
alias(libs.plugins.kotlin.jvm) apply false alias(libs.plugins.kotlin.jvm) apply false
alias(libs.plugins.kotlin.kapt) apply false alias(libs.plugins.kotlin.kapt) apply false
alias(libs.plugins.hilt.android) apply false alias(libs.plugins.hilt.android) apply false
alias(libs.plugins.compose.screenshot) apply false
} }
+5 -1
View File
@@ -1,6 +1,10 @@
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 org.gradle.jvmargs=-Xmx4096m -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8
android.experimental.enableScreenshotTest=true
org.gradle.configuration-cache=false org.gradle.configuration-cache=false
android.useAndroidX=true android.useAndroidX=true
android.nonTransitiveRClass=true android.nonTransitiveRClass=true
kotlin.code.style=official kotlin.code.style=official
android.overridePathCheck=true android.overridePathCheck=true
android.builtInKotlin=false
android.newDsl=false
kotlin.jvm.target.validation.mode=warning
+24 -11
View File
@@ -1,15 +1,20 @@
[versions] [versions]
agp = "8.7.3" agp = "9.3.2"
kotlin = "1.9.24" kotlin = "2.4.0"
composeBom = "2024.06.00" composeBom = "2026.08.00"
composeCompiler = "1.5.14"
coroutines = "1.8.1" coroutines = "1.8.1"
hilt = "2.51.1" hilt = "2.60.1"
navigationCompose = "2.7.7" hiltNavigationCompose = "1.4.0"
activityCompose = "1.9.0" navigationCompose = "2.9.8"
lifecycle = "2.8.2" activityCompose = "1.13.0"
room = "2.6.1" lifecycle = "2.11.0"
datastore = "1.1.1" room = "2.8.4"
datastore = "1.2.1"
work = "2.11.2"
adaptive = "1.3.0"
adaptiveNavigationSuite = "1.4.0"
window = "1.5.1"
composeScreenshot = "0.0.1-alpha16"
junit = "4.13.2" junit = "4.13.2"
androidxJunit = "1.2.1" androidxJunit = "1.2.1"
espresso = "3.6.1" espresso = "3.6.1"
@@ -20,7 +25,12 @@ androidx-lifecycle-runtime-compose = { module = "androidx.lifecycle:lifecycle-ru
androidx-lifecycle-viewmodel-ktx = { module = "androidx.lifecycle:lifecycle-viewmodel-ktx", version.ref = "lifecycle" } androidx-lifecycle-viewmodel-ktx = { module = "androidx.lifecycle:lifecycle-viewmodel-ktx", version.ref = "lifecycle" }
androidx-lifecycle-viewmodel-compose = { module = "androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "lifecycle" } androidx-lifecycle-viewmodel-compose = { module = "androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "lifecycle" }
androidx-navigation-compose = { module = "androidx.navigation:navigation-compose", version.ref = "navigationCompose" } androidx-navigation-compose = { module = "androidx.navigation:navigation-compose", version.ref = "navigationCompose" }
androidx-hilt-navigation-compose = { module = "androidx.hilt:hilt-navigation-compose", version = "1.2.0" } androidx-hilt-navigation-compose = { module = "androidx.hilt:hilt-navigation-compose", version.ref = "hiltNavigationCompose" }
androidx-hilt-work = { module = "androidx.hilt:hilt-work", version.ref = "hiltNavigationCompose" }
androidx-work-runtime-ktx = { module = "androidx.work:work-runtime-ktx", version.ref = "work" }
androidx-compose-material3-adaptive = { module = "androidx.compose.material3.adaptive:adaptive", version.ref = "adaptive" }
androidx-compose-material3-adaptive-navigation-suite = { module = "androidx.compose.material3:material3-adaptive-navigation-suite", version.ref = "adaptiveNavigationSuite" }
androidx-window = { module = "androidx.window:window", version.ref = "window" }
compose-bom = { module = "androidx.compose:compose-bom", version.ref = "composeBom" } compose-bom = { module = "androidx.compose:compose-bom", version.ref = "composeBom" }
compose-ui = { module = "androidx.compose.ui:ui" } compose-ui = { module = "androidx.compose.ui:ui" }
compose-ui-tooling = { module = "androidx.compose.ui:ui-tooling" } compose-ui-tooling = { module = "androidx.compose.ui:ui-tooling" }
@@ -29,6 +39,7 @@ compose-material3 = { module = "androidx.compose.material3:material3" }
compose-material-icons-extended = { module = "androidx.compose.material:material-icons-extended" } compose-material-icons-extended = { module = "androidx.compose.material:material-icons-extended" }
compose-ui-test-junit4 = { module = "androidx.compose.ui:ui-test-junit4" } compose-ui-test-junit4 = { module = "androidx.compose.ui:ui-test-junit4" }
compose-ui-test-manifest = { module = "androidx.compose.ui:ui-test-manifest" } compose-ui-test-manifest = { module = "androidx.compose.ui:ui-test-manifest" }
compose-screenshot-test = { module = "com.android.tools.screenshot:screenshot-validation-api", version.ref = "composeScreenshot" }
kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines" } kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines" }
kotlinx-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "coroutines" } kotlinx-coroutines-test = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "coroutines" }
hilt-android = { module = "com.google.dagger:hilt-android", version.ref = "hilt" } hilt-android = { module = "com.google.dagger:hilt-android", version.ref = "hilt" }
@@ -47,6 +58,8 @@ espresso-core = { module = "androidx.test.espresso:espresso-core", version.ref =
android-application = { id = "com.android.application", version.ref = "agp" } android-application = { id = "com.android.application", version.ref = "agp" }
android-library = { id = "com.android.library", version.ref = "agp" } android-library = { id = "com.android.library", version.ref = "agp" }
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
kotlin-compose = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" }
kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" } kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
kotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlin" } kotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlin" }
hilt-android = { id = "com.google.dagger.hilt.android", version.ref = "hilt" } hilt-android = { id = "com.google.dagger.hilt.android", version.ref = "hilt" }
compose-screenshot = { id = "com.android.compose.screenshot", version.ref = "composeScreenshot" }
+2 -2
View File
@@ -1,7 +1,7 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-9.6.1-bin.zip
networkTimeout=10000 networkTimeout=10000
validateDistributionUrl=false validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists