From 68cb6ca76804eb0e518d2aef7cee5575a62321db Mon Sep 17 00:00:00 2001 From: Rebecca Franks Date: Thu, 28 May 2026 11:04:37 +0100 Subject: [PATCH 1/8] Updated to latest deps --- app/build.gradle.kts | 2 - build_presubmit_mobile.sh | 6 +- build_presubmit_wear.sh | 6 +- build_release_mobile.sh | 6 +- build_release_wear.sh | 6 +- core/theme/build.gradle.kts | 1 + .../xr/CustomizeExportScreenSpatial.kt | 4 +- gradle/libs.versions.toml | 84 ++++++++++--------- gradle/wrapper/gradle-wrapper.properties | 2 +- settings.gradle.kts | 4 +- 10 files changed, 61 insertions(+), 60 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index d580c788..fe54aad1 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -43,7 +43,6 @@ android { initWith(buildTypes.getByName("release")) matchingFallbacks += listOf("release") isDebuggable = false - baselineProfile.automaticGenerationDuringBuild = false } release { isShrinkResources = true @@ -52,7 +51,6 @@ android { getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro", ) - baselineProfile.automaticGenerationDuringBuild = false configure { mappingFileUploadEnabled = true } diff --git a/build_presubmit_mobile.sh b/build_presubmit_mobile.sh index 87d4ab3a..89330f86 100755 --- a/build_presubmit_mobile.sh +++ b/build_presubmit_mobile.sh @@ -24,14 +24,14 @@ set -e DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" echo DIR # Define the Android SDK version you want to target. -ANDROID_SDK_VERSION="36" -ANDROID_BUILD_TOOLS_VERSION="36.0.0" +ANDROID_SDK_VERSION="37" +ANDROID_BUILD_TOOLS_VERSION="37.0.0" # Switched from 'google_apis' to 'google_atd' (Google Automated Test Device). # This system image is designed for headless, automated testing in CI environments # and is more compatible with software rendering. It will be installed but may not # be used by the new build command. -# 36 not available yet as per b/432143095 +# 37 not available yet as per b/432143095 EMULATOR_IMAGE="system-images;android-35;google_atd;x86_64" # --- Environment Setup --- diff --git a/build_presubmit_wear.sh b/build_presubmit_wear.sh index 80d56f61..e0167ea2 100755 --- a/build_presubmit_wear.sh +++ b/build_presubmit_wear.sh @@ -24,14 +24,14 @@ set -e DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" echo DIR # Define the Android SDK version you want to target. -ANDROID_SDK_VERSION="36" -ANDROID_BUILD_TOOLS_VERSION="36.0.0" +ANDROID_SDK_VERSION="37" +ANDROID_BUILD_TOOLS_VERSION="37.0.0" # Switched from 'google_apis' to 'google_atd' (Google Automated Test Device). # This system image is designed for headless, automated testing in CI environments # and is more compatible with software rendering. It will be installed but may not # be used by the new build command. -# 36 not available yet as per b/432143095 +# 37 not available yet as per b/432143095 EMULATOR_IMAGE="system-images;android-35;google_atd;x86_64" # --- Environment Setup --- diff --git a/build_release_mobile.sh b/build_release_mobile.sh index c27a14af..730c9f57 100755 --- a/build_release_mobile.sh +++ b/build_release_mobile.sh @@ -23,14 +23,14 @@ set -e # Get the script's directory. DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" # Define the Android SDK version you want to target. -ANDROID_SDK_VERSION="36" -ANDROID_BUILD_TOOLS_VERSION="36.0.0" +ANDROID_SDK_VERSION="37" +ANDROID_BUILD_TOOLS_VERSION="37.0.0" # Switched from 'google_apis' to 'google_atd' (Google Automated Test Device). # This system image is designed for headless, automated testing in CI environments # and is more compatible with software rendering. It will be installed but may not # be used by the new build command. -# 36 not available yet as per b/432143095 +# 37 not available yet as per b/432143095 EMULATOR_IMAGE="system-images;android-35;google_atd;x86_64" # --- Environment Setup --- diff --git a/build_release_wear.sh b/build_release_wear.sh index 8d747b78..14ca6eb7 100755 --- a/build_release_wear.sh +++ b/build_release_wear.sh @@ -23,14 +23,14 @@ set -e # Get the script's directory. DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" # Define the Android SDK version you want to target. -ANDROID_SDK_VERSION="36" -ANDROID_BUILD_TOOLS_VERSION="36.0.0" +ANDROID_SDK_VERSION="37" +ANDROID_BUILD_TOOLS_VERSION="37.0.0" # Switched from 'google_apis' to 'google_atd' (Google Automated Test Device). # This system image is designed for headless, automated testing in CI environments # and is more compatible with software rendering. It will be installed but may not # be used by the new build command. -# 36 not available yet as per b/432143095 +# 37 not available yet as per b/432143095 EMULATOR_IMAGE="system-images;android-35;google_atd;x86_64" # --- Environment Setup --- diff --git a/core/theme/build.gradle.kts b/core/theme/build.gradle.kts index aea70d60..21e483b4 100644 --- a/core/theme/build.gradle.kts +++ b/core/theme/build.gradle.kts @@ -42,6 +42,7 @@ android { dependencies { implementation(libs.androidx.ui.text.google.fonts) implementation(platform(libs.androidx.compose.bom)) + implementation(libs.androidx.compose.foundation) implementation(libs.androidx.ui.tooling.preview) implementation(libs.androidx.material3) implementation(projects.core.util) diff --git a/feature/results/src/main/java/com/android/developers/androidify/customize/xr/CustomizeExportScreenSpatial.kt b/feature/results/src/main/java/com/android/developers/androidify/customize/xr/CustomizeExportScreenSpatial.kt index fffaee62..338a2cf7 100644 --- a/feature/results/src/main/java/com/android/developers/androidify/customize/xr/CustomizeExportScreenSpatial.kt +++ b/feature/results/src/main/java/com/android/developers/androidify/customize/xr/CustomizeExportScreenSpatial.kt @@ -35,9 +35,9 @@ import androidx.xr.compose.spatial.Orbiter import androidx.xr.compose.spatial.OrbiterOffsetType import androidx.xr.compose.subspace.SpatialBox import androidx.xr.compose.subspace.SpatialColumn -import androidx.xr.compose.subspace.SpatialLayoutSpacer import androidx.xr.compose.subspace.SpatialPanel import androidx.xr.compose.subspace.SpatialRow +import androidx.xr.compose.subspace.SpatialSpacer import androidx.xr.compose.subspace.layout.SubspaceModifier import androidx.xr.compose.subspace.layout.fillMaxHeight import androidx.xr.compose.subspace.layout.fillMaxWidth @@ -109,7 +109,7 @@ fun CustomizeExportLayoutSpatial( } } } - SpatialLayoutSpacer(SubspaceModifier.width(48.dp)) + SpatialSpacer(SubspaceModifier.width(48.dp)) SpatialBox(SubspaceModifier.fillMaxHeight(0.7f)) { SpatialPanel( modifier = SubspaceModifier.offset(z = 10.dp).fillMaxWidth(0.3f), diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 1efa59f7..d774fcb6 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -3,83 +3,84 @@ appVersionCode = "10" appVersionName = "1.3.0" appVersionWearOffset = "60000000" -agp = "9.0.0" -bcpkixJdk18on = "1.83" +agp = "9.2.1" +bcpkixJdk18on = "1.84" core = "1.7.0" -extensionsXr = "1.1.0" +extensionsXr = "1.3.0" leakcanaryAndroid = "2.14" javaVersion = "17" #dependencies accompanist = "0.37.3" -activityCompose = "1.12.1" +activityCompose = "1.13.0" adaptive = "1.2.0" -apksig = "9.0.0-alpha06" +apksig = "9.2.1" appcompat = "1.7.1" -baselineprofile = "1.5.0-alpha01" +baselineprofile = "1.5.0-alpha06" benchmarkMacroJunit4 = "1.4.1" -camerax = "1.5.2" -coilCompose = "3.3.0" -coilGif = "3.3.0" -composeBom = "2025.12.00" +camerax = "1.6.1" +coilCompose = "3.4.0" +coilGif = "3.4.0" +composeBom = "2026.05.01" concurrent = "1.3.0" converterGson = "2.11.0" -coreKtx = "1.17.0" -coreSplashscreen = "1.0.1" -crashlytics = "3.0.6" -datastore = "1.1.7" +coreKtx = "1.18.0" +coreSplashscreen = "1.2.0" +crashlytics = "3.0.7" +datastore = "1.2.1" espressoCore = "3.7.0" -firebaseBom = "34.4.0" -genaiPrompt = "1.0.0-alpha1" +firebaseBom = "34.13.0" +foundation = "1.12.0-alpha03" +genaiPrompt = "1.0.0-beta2" googleServices = "4.4.4" -googleOss = "17.3.0" -googleOssPlugin = "0.10.10" -guava = "33.5.0-android" -hiltAndroid = "2.59" +googleOss = "17.5.1" +googleOssPlugin = "0.12.0" +guava = "33.6.0-android" +hiltAndroid = "2.59.2" hiltLifecycleViewmodel = "1.0.0-alpha03" hiltNavigationCompose = "1.3.0" junit = "4.13.2" junitVersion = "1.3.0" kotlin = "2.3.0" ksp = "2.3.4" -kotlinxCoroutines = "1.10.2" +kotlinxCoroutines = "1.11.0" kotlinxSerialization = "2.3.0" -kotlinxSerializationJson = "1.9.0" -kotlinxSerializationProtobuf = "1.9.0" +kotlinxSerializationJson = "1.11.0" +kotlinxSerializationProtobuf = "1.11.0" ktlint = "1.5.0" lifecycleRuntimeKtx = "2.10.0" lifecycleViewmodelNavigation3 = "2.10.0" loggingInterceptor = "5.3.2" -material3 = "1.5.0-alpha10" -media3 = "1.8.0" -navigation3 = "1.0.0" -okhttp = "4.12.0" -playServicesWearable = "19.0.0" +material3 = "1.5.0-alpha20" +media3 = "1.10.1" +navigation3 = "1.1.2" +okhttp = "5.3.2" +playServicesWearable = "20.0.1" playServicesBaseTesting = "16.2.0" poseDetection = "18.0.0-beta5" profileinstaller = "1.4.1" retrofit = "2.11.0" -robolectric = "4.16" -spotless = "8.0.0" +robolectric = "4.16.1" +spotless = "8.6.0" startup = "1.2.0" runner = "1.7.0" -uiTextGoogleFonts = "1.9.3" +uiTextGoogleFonts = "1.11.2" uiautomator = "2.4.0-alpha07" -uiTooling = "1.10.0" +uiTooling = "1.11.2" validatorPush = "1.0.0-alpha09" watchFacePush = "1.0.0-beta01" -wear = "1.3.0" -wearCompose = "1.6.0-alpha09" -wearComposeTooling = "1.5.6" -wearRemoteInteractions = "1.1.0" -window = "1.5.0" -lifecycleProcess = "2.9.4" +wear = "1.4.0" +wearCompose = "1.6.2" +wearComposeTooling = "1.6.2" +wearRemoteInteractions = "1.2.0" +window = "1.5.1" +lifecycleProcess = "2.10.0" mlkitCommon = "18.11.0" mlkitSegmentation = "16.0.0-beta1" -playServicesBase = "18.9.0" +playServicesBase = "18.10.0" timber = "5.0.1" -workRuntimeKtx = "2.10.5" -xr-compose = "1.0.0-alpha11" +workRuntimeKtx = "2.11.2" +xr-compose = "1.0.0-alpha14" [libraries] accompanist-permissions = { module = "com.google.accompanist:accompanist-permissions", version.ref = "accompanist" } @@ -94,6 +95,7 @@ androidx-camera-camera2 = { module = "androidx.camera:camera-camera2", version.r androidx-camera-compose = { module = "androidx.camera:camera-compose", version.ref = "camerax" } androidx-camera-core = { module = "androidx.camera:camera-core", version.ref = "camerax" } androidx-camera-lifecycle = { group = "androidx.camera", name = "camera-lifecycle", version.ref = "camerax" } +androidx-compose-foundation = { group = "androidx.compose.foundation", name = "foundation", version.ref = "foundation" } androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" } androidx-concurrent-futures-ktx = { module = "androidx.concurrent:concurrent-futures-ktx", version.ref = "concurrent" } androidx-core = { module = "androidx.test:core", version.ref = "core" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 19a6bdeb..c61a118f 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.3.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/settings.gradle.kts b/settings.gradle.kts index 731e17c9..da670135 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -36,10 +36,10 @@ plugins { android { compileSdk { - version = release(36) + version = release(37) } targetSdk { - version = release(36) + version = release(37) } minSdk { version = release(26) From eb5374d3eb551a2936d94fb2cccd20ea03a7ee8e Mon Sep 17 00:00:00 2001 From: Rebecca Franks Date: Thu, 28 May 2026 11:34:45 +0100 Subject: [PATCH 2/8] Updated to latest deps --- build_presubmit_mobile.sh | 2 +- build_presubmit_wear.sh | 2 +- build_release_mobile.sh | 2 +- build_release_wear.sh | 2 +- .../androidify/creation/xr/EditScreenSpatial.kt | 4 ++-- gradle/libs.versions.toml | 12 ++++++------ gradle/wrapper/gradle-wrapper.properties | 2 +- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/build_presubmit_mobile.sh b/build_presubmit_mobile.sh index 89330f86..c224f08b 100755 --- a/build_presubmit_mobile.sh +++ b/build_presubmit_mobile.sh @@ -24,7 +24,7 @@ set -e DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" echo DIR # Define the Android SDK version you want to target. -ANDROID_SDK_VERSION="37" +ANDROID_SDK_VERSION="37.0" ANDROID_BUILD_TOOLS_VERSION="37.0.0" # Switched from 'google_apis' to 'google_atd' (Google Automated Test Device). diff --git a/build_presubmit_wear.sh b/build_presubmit_wear.sh index e0167ea2..54edfab0 100755 --- a/build_presubmit_wear.sh +++ b/build_presubmit_wear.sh @@ -24,7 +24,7 @@ set -e DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" echo DIR # Define the Android SDK version you want to target. -ANDROID_SDK_VERSION="37" +ANDROID_SDK_VERSION="37.0" ANDROID_BUILD_TOOLS_VERSION="37.0.0" # Switched from 'google_apis' to 'google_atd' (Google Automated Test Device). diff --git a/build_release_mobile.sh b/build_release_mobile.sh index 730c9f57..9aa8c7c3 100755 --- a/build_release_mobile.sh +++ b/build_release_mobile.sh @@ -23,7 +23,7 @@ set -e # Get the script's directory. DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" # Define the Android SDK version you want to target. -ANDROID_SDK_VERSION="37" +ANDROID_SDK_VERSION="37.0" ANDROID_BUILD_TOOLS_VERSION="37.0.0" # Switched from 'google_apis' to 'google_atd' (Google Automated Test Device). diff --git a/build_release_wear.sh b/build_release_wear.sh index 14ca6eb7..d8f944ba 100755 --- a/build_release_wear.sh +++ b/build_release_wear.sh @@ -23,7 +23,7 @@ set -e # Get the script's directory. DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" # Define the Android SDK version you want to target. -ANDROID_SDK_VERSION="37" +ANDROID_SDK_VERSION="37.0" ANDROID_BUILD_TOOLS_VERSION="37.0.0" # Switched from 'google_apis' to 'google_atd' (Google Automated Test Device). diff --git a/feature/creation/src/main/java/com/android/developers/androidify/creation/xr/EditScreenSpatial.kt b/feature/creation/src/main/java/com/android/developers/androidify/creation/xr/EditScreenSpatial.kt index 6eaa5be9..5693754b 100644 --- a/feature/creation/src/main/java/com/android/developers/androidify/creation/xr/EditScreenSpatial.kt +++ b/feature/creation/src/main/java/com/android/developers/androidify/creation/xr/EditScreenSpatial.kt @@ -33,7 +33,7 @@ import androidx.compose.ui.unit.dp import androidx.xr.compose.spatial.ContentEdge import androidx.xr.compose.spatial.Orbiter import androidx.xr.compose.subspace.SpatialColumn -import androidx.xr.compose.subspace.SpatialLayoutSpacer +import androidx.xr.compose.subspace.SpatialSpacer import androidx.xr.compose.subspace.SpatialPanel import androidx.xr.compose.subspace.SpatialRow import androidx.xr.compose.subspace.layout.SubspaceModifier @@ -142,7 +142,7 @@ fun EditScreenSpatial( } } } - SpatialLayoutSpacer(SubspaceModifier.width(48.dp)) + SpatialSpacer(SubspaceModifier.width(48.dp)) SpatialPanel( modifier = SubspaceModifier .offset(z = 10.dp) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d774fcb6..839c7c79 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -41,10 +41,10 @@ hiltLifecycleViewmodel = "1.0.0-alpha03" hiltNavigationCompose = "1.3.0" junit = "4.13.2" junitVersion = "1.3.0" -kotlin = "2.3.0" -ksp = "2.3.4" +kotlin = "2.3.21" +ksp = "2.3.6" kotlinxCoroutines = "1.11.0" -kotlinxSerialization = "2.3.0" +kotlinxSerialization = "2.3.21" kotlinxSerializationJson = "1.11.0" kotlinxSerializationProtobuf = "1.11.0" ktlint = "1.5.0" @@ -65,10 +65,10 @@ spotless = "8.6.0" startup = "1.2.0" runner = "1.7.0" uiTextGoogleFonts = "1.11.2" -uiautomator = "2.4.0-alpha07" +uiautomator = "2.4.0-beta02" uiTooling = "1.11.2" validatorPush = "1.0.0-alpha09" -watchFacePush = "1.0.0-beta01" +watchFacePush = "1.0.0" wear = "1.4.0" wearCompose = "1.6.2" wearComposeTooling = "1.6.2" @@ -95,7 +95,7 @@ androidx-camera-camera2 = { module = "androidx.camera:camera-camera2", version.r androidx-camera-compose = { module = "androidx.camera:camera-compose", version.ref = "camerax" } androidx-camera-core = { module = "androidx.camera:camera-core", version.ref = "camerax" } androidx-camera-lifecycle = { group = "androidx.camera", name = "camera-lifecycle", version.ref = "camerax" } -androidx-compose-foundation = { group = "androidx.compose.foundation", name = "foundation", version.ref = "foundation" } +androidx-compose-foundation = { group = "androidx.compose.foundation", name = "foundation" } androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" } androidx-concurrent-futures-ktx = { module = "androidx.concurrent:concurrent-futures-ktx", version.ref = "concurrent" } androidx-core = { module = "androidx.test:core", version.ref = "core" } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index c61a118f..5dd3c012 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.4.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.5.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME From 4907cfe28120dc78445537be399aae2bd5ef1b88 Mon Sep 17 00:00:00 2001 From: Rebecca Franks Date: Thu, 28 May 2026 15:24:49 +0100 Subject: [PATCH 3/8] Updated to latest deps --- .../vertexai/FirebaseAiDataSource.kt | 35 ++++++++++--------- .../androidify/creation/CreationViewModel.kt | 8 +++++ .../creation/xr/EditScreenSpatial.kt | 2 +- gradle/libs.versions.toml | 3 +- .../androidify/ui/CallToActionScreen.kt | 4 +-- .../androidify/ui/TransmissionScreen.kt | 15 ++++---- 6 files changed, 38 insertions(+), 29 deletions(-) diff --git a/core/network/src/main/java/com/android/developers/androidify/vertexai/FirebaseAiDataSource.kt b/core/network/src/main/java/com/android/developers/androidify/vertexai/FirebaseAiDataSource.kt index fef0f431..a0a9e102 100644 --- a/core/network/src/main/java/com/android/developers/androidify/vertexai/FirebaseAiDataSource.kt +++ b/core/network/src/main/java/com/android/developers/androidify/vertexai/FirebaseAiDataSource.kt @@ -23,14 +23,10 @@ import com.android.developers.androidify.model.ValidatedDescription import com.android.developers.androidify.model.ValidatedImage import com.google.firebase.Firebase import com.google.firebase.ai.GenerativeModel -import com.google.firebase.ai.ImagenModel import com.google.firebase.ai.ai import com.google.firebase.ai.type.GenerativeBackend import com.google.firebase.ai.type.HarmBlockThreshold import com.google.firebase.ai.type.HarmCategory -import com.google.firebase.ai.type.ImagenPersonFilterLevel -import com.google.firebase.ai.type.ImagenSafetyFilterLevel -import com.google.firebase.ai.type.ImagenSafetySettings import com.google.firebase.ai.type.PublicPreviewAPI import com.google.firebase.ai.type.ResponseModality import com.google.firebase.ai.type.SafetySetting @@ -81,15 +77,20 @@ class FirebaseAiDataSourceImpl @Inject constructor( ) } - private fun createGenerativeImageModel(): ImagenModel { - return Firebase.ai(backend = GenerativeBackend.vertexAI()).imagenModel( - remoteConfigDataSource.imageModelName(), - safetySettings = - ImagenSafetySettings( - safetyFilterLevel = ImagenSafetyFilterLevel.BLOCK_LOW_AND_ABOVE, - // Uses `ALLOW_ADULT` filter since `ALLOW_ALL` requires a special approval - // See https://cloud.google.com/vertex-ai/generative-ai/docs/image/responsible-ai-imagen#person-face-gen - personFilterLevel = ImagenPersonFilterLevel.ALLOW_ADULT, + private fun createGenerativeImageModel(): GenerativeModel { + return Firebase.ai(backend = GenerativeBackend.vertexAI()).generativeModel( + modelName = remoteConfigDataSource.imageModelName(), + generationConfig = generationConfig { + responseModalities = listOf( + ResponseModality.IMAGE, + ) + }, + safetySettings = listOf( + SafetySetting(HarmCategory.HARASSMENT, HarmBlockThreshold.LOW_AND_ABOVE), + SafetySetting(HarmCategory.HATE_SPEECH, HarmBlockThreshold.LOW_AND_ABOVE), + SafetySetting(HarmCategory.SEXUALLY_EXPLICIT, HarmBlockThreshold.LOW_AND_ABOVE), + SafetySetting(HarmCategory.DANGEROUS_CONTENT, HarmBlockThreshold.LOW_AND_ABOVE), + SafetySetting(HarmCategory.CIVIC_INTEGRITY, HarmBlockThreshold.LOW_AND_ABOVE), ), ) } @@ -227,11 +228,13 @@ class FirebaseAiDataSourceImpl @Inject constructor( } private suspend fun executeImageGeneration( - generativeModel: ImagenModel, + generativeModel: GenerativeModel, prompt: String, ): Bitmap { - val response = generativeModel.generateImages(prompt) - return response.images.first().asBitmap() + val response = generativeModel.generateContent(prompt) + val image = response.candidates.firstOrNull() + ?.content?.parts?.firstNotNullOfOrNull { it.asImageOrNull() } + return image ?: throw IllegalStateException("Could not extract image from model response") } override suspend fun generatePrompt(prompt: String): GeneratedPrompt { diff --git a/feature/creation/src/main/java/com/android/developers/androidify/creation/CreationViewModel.kt b/feature/creation/src/main/java/com/android/developers/androidify/creation/CreationViewModel.kt index 5f509934..05bf2dd0 100644 --- a/feature/creation/src/main/java/com/android/developers/androidify/creation/CreationViewModel.kt +++ b/feature/creation/src/main/java/com/android/developers/androidify/creation/CreationViewModel.kt @@ -42,6 +42,7 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.update +import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import timber.log.Timber @@ -77,6 +78,7 @@ class CreationViewModel @AssistedInject constructor( private var imageGenerationJob: Job? = null init { + Timber.d("CreationViewModel init. hashCode: ${hashCode()}") onImageSelected(originalImageUrl) } @@ -103,6 +105,7 @@ class CreationViewModel @AssistedInject constructor( fun onPromptGenerationClicked() { promptGenerationJob?.cancel() + Timber.d("CreationViewModel onPrompt. hashCode: ${hashCode()} ${viewModelScope.isActive}") promptGenerationJob = viewModelScope.launch { Timber.d("Generating prompt...") _uiState.update { @@ -238,6 +241,11 @@ class CreationViewModel @AssistedInject constructor( it.copy(resultBitmapUri = null) } } + + override fun onCleared() { + super.onCleared() + Timber.d("CreationViewModel onCleared. hashCode: ${hashCode()}") + } } data class CreationState( diff --git a/feature/creation/src/main/java/com/android/developers/androidify/creation/xr/EditScreenSpatial.kt b/feature/creation/src/main/java/com/android/developers/androidify/creation/xr/EditScreenSpatial.kt index 5693754b..b3628c3f 100644 --- a/feature/creation/src/main/java/com/android/developers/androidify/creation/xr/EditScreenSpatial.kt +++ b/feature/creation/src/main/java/com/android/developers/androidify/creation/xr/EditScreenSpatial.kt @@ -33,9 +33,9 @@ import androidx.compose.ui.unit.dp import androidx.xr.compose.spatial.ContentEdge import androidx.xr.compose.spatial.Orbiter import androidx.xr.compose.subspace.SpatialColumn -import androidx.xr.compose.subspace.SpatialSpacer import androidx.xr.compose.subspace.SpatialPanel import androidx.xr.compose.subspace.SpatialRow +import androidx.xr.compose.subspace.SpatialSpacer import androidx.xr.compose.subspace.layout.SubspaceModifier import androidx.xr.compose.subspace.layout.fillMaxHeight import androidx.xr.compose.subspace.layout.fillMaxWidth diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 839c7c79..c8d81e48 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -30,7 +30,6 @@ crashlytics = "3.0.7" datastore = "1.2.1" espressoCore = "3.7.0" firebaseBom = "34.13.0" -foundation = "1.12.0-alpha03" genaiPrompt = "1.0.0-beta2" googleServices = "4.4.4" googleOss = "17.5.1" @@ -49,7 +48,7 @@ kotlinxSerializationJson = "1.11.0" kotlinxSerializationProtobuf = "1.11.0" ktlint = "1.5.0" lifecycleRuntimeKtx = "2.10.0" -lifecycleViewmodelNavigation3 = "2.10.0" +lifecycleViewmodelNavigation3 = "2.11.0-beta02" loggingInterceptor = "5.3.2" material3 = "1.5.0-alpha20" media3 = "1.10.1" diff --git a/wear/src/main/java/com/android/developers/androidify/ui/CallToActionScreen.kt b/wear/src/main/java/com/android/developers/androidify/ui/CallToActionScreen.kt index 82f1e903..c2f6f08c 100644 --- a/wear/src/main/java/com/android/developers/androidify/ui/CallToActionScreen.kt +++ b/wear/src/main/java/com/android/developers/androidify/ui/CallToActionScreen.kt @@ -24,11 +24,11 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp +import androidx.wear.compose.foundation.lazy.TransformingLazyColumn import androidx.wear.compose.foundation.lazy.rememberTransformingLazyColumnState import androidx.wear.compose.material3.MaterialTheme import androidx.wear.compose.material3.ScreenScaffold import androidx.wear.compose.material3.Text -import androidx.wear.compose.material3.lazy.ResponsiveTransformingLazyColumn import androidx.wear.compose.ui.tooling.preview.WearPreviewDevices import com.android.developers.androidify.R import com.android.developers.androidify.ui.theme.AndroidifyWearTheme @@ -43,7 +43,7 @@ fun CallToActionScreen( ScreenScaffold( scrollState = listState, ) { contentPadding -> - ResponsiveTransformingLazyColumn( + TransformingLazyColumn( state = listState, contentPadding = contentPadding, ) { diff --git a/wear/src/main/java/com/android/developers/androidify/ui/TransmissionScreen.kt b/wear/src/main/java/com/android/developers/androidify/ui/TransmissionScreen.kt index 770d79db..98219cca 100644 --- a/wear/src/main/java/com/android/developers/androidify/ui/TransmissionScreen.kt +++ b/wear/src/main/java/com/android/developers/androidify/ui/TransmissionScreen.kt @@ -37,14 +37,13 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp +import androidx.wear.compose.foundation.lazy.TransformingLazyColumn import androidx.wear.compose.foundation.lazy.rememberTransformingLazyColumnState import androidx.wear.compose.material3.CircularProgressIndicator import androidx.wear.compose.material3.MaterialTheme import androidx.wear.compose.material3.ProgressIndicatorDefaults import androidx.wear.compose.material3.ScreenScaffold import androidx.wear.compose.material3.Text -import androidx.wear.compose.material3.lazy.ResponsiveItemType -import androidx.wear.compose.material3.lazy.ResponsiveTransformingLazyColumn import androidx.wear.compose.ui.tooling.preview.WearPreviewDevices import com.android.developers.androidify.R import com.android.developers.androidify.ui.theme.AndroidifyWearTheme @@ -61,27 +60,27 @@ fun TransmissionScreen(modifier: Modifier = Modifier) { modifier = modifier.keepScreenOn(), scrollState = listState, ) { contentPadding -> - ResponsiveTransformingLazyColumn( + TransformingLazyColumn( state = listState, contentPadding = contentPadding, ) { - item(itemType = ResponsiveItemType.IconButton) { + item { Image( modifier = Modifier.fillMaxWidth(0.3f), painter = painterResource(id = R.drawable.logo), contentDescription = stringResource(R.string.logo_description), ) } - item(itemType = ResponsiveItemType.Default) { + item { Spacer(modifier = Modifier.height(4.dp)) } - item(itemType = ResponsiveItemType.IconButton) { + item { FourColorProgressIndicator() } - item(itemType = ResponsiveItemType.Default) { + item { Spacer(modifier = Modifier.height(4.dp)) } - item(itemType = ResponsiveItemType.Text) { + item { Text( modifier = Modifier.fillMaxWidth(), textAlign = TextAlign.Center, From eecef80047ade76df9496a468b7a82ada26289fe Mon Sep 17 00:00:00 2001 From: Rebecca Franks Date: Thu, 28 May 2026 15:24:49 +0100 Subject: [PATCH 4/8] Updated to latest deps --- .../vertexai/FirebaseAiDataSource.kt | 35 ++++++++++--------- feature/creation/build.gradle.kts | 3 ++ .../androidify/creation/CreationViewModel.kt | 8 +++++ .../creation/xr/EditScreenSpatial.kt | 2 +- gradle/libs.versions.toml | 3 +- .../androidify/ui/CallToActionScreen.kt | 4 +-- .../androidify/ui/TransmissionScreen.kt | 15 ++++---- 7 files changed, 41 insertions(+), 29 deletions(-) diff --git a/core/network/src/main/java/com/android/developers/androidify/vertexai/FirebaseAiDataSource.kt b/core/network/src/main/java/com/android/developers/androidify/vertexai/FirebaseAiDataSource.kt index fef0f431..a0a9e102 100644 --- a/core/network/src/main/java/com/android/developers/androidify/vertexai/FirebaseAiDataSource.kt +++ b/core/network/src/main/java/com/android/developers/androidify/vertexai/FirebaseAiDataSource.kt @@ -23,14 +23,10 @@ import com.android.developers.androidify.model.ValidatedDescription import com.android.developers.androidify.model.ValidatedImage import com.google.firebase.Firebase import com.google.firebase.ai.GenerativeModel -import com.google.firebase.ai.ImagenModel import com.google.firebase.ai.ai import com.google.firebase.ai.type.GenerativeBackend import com.google.firebase.ai.type.HarmBlockThreshold import com.google.firebase.ai.type.HarmCategory -import com.google.firebase.ai.type.ImagenPersonFilterLevel -import com.google.firebase.ai.type.ImagenSafetyFilterLevel -import com.google.firebase.ai.type.ImagenSafetySettings import com.google.firebase.ai.type.PublicPreviewAPI import com.google.firebase.ai.type.ResponseModality import com.google.firebase.ai.type.SafetySetting @@ -81,15 +77,20 @@ class FirebaseAiDataSourceImpl @Inject constructor( ) } - private fun createGenerativeImageModel(): ImagenModel { - return Firebase.ai(backend = GenerativeBackend.vertexAI()).imagenModel( - remoteConfigDataSource.imageModelName(), - safetySettings = - ImagenSafetySettings( - safetyFilterLevel = ImagenSafetyFilterLevel.BLOCK_LOW_AND_ABOVE, - // Uses `ALLOW_ADULT` filter since `ALLOW_ALL` requires a special approval - // See https://cloud.google.com/vertex-ai/generative-ai/docs/image/responsible-ai-imagen#person-face-gen - personFilterLevel = ImagenPersonFilterLevel.ALLOW_ADULT, + private fun createGenerativeImageModel(): GenerativeModel { + return Firebase.ai(backend = GenerativeBackend.vertexAI()).generativeModel( + modelName = remoteConfigDataSource.imageModelName(), + generationConfig = generationConfig { + responseModalities = listOf( + ResponseModality.IMAGE, + ) + }, + safetySettings = listOf( + SafetySetting(HarmCategory.HARASSMENT, HarmBlockThreshold.LOW_AND_ABOVE), + SafetySetting(HarmCategory.HATE_SPEECH, HarmBlockThreshold.LOW_AND_ABOVE), + SafetySetting(HarmCategory.SEXUALLY_EXPLICIT, HarmBlockThreshold.LOW_AND_ABOVE), + SafetySetting(HarmCategory.DANGEROUS_CONTENT, HarmBlockThreshold.LOW_AND_ABOVE), + SafetySetting(HarmCategory.CIVIC_INTEGRITY, HarmBlockThreshold.LOW_AND_ABOVE), ), ) } @@ -227,11 +228,13 @@ class FirebaseAiDataSourceImpl @Inject constructor( } private suspend fun executeImageGeneration( - generativeModel: ImagenModel, + generativeModel: GenerativeModel, prompt: String, ): Bitmap { - val response = generativeModel.generateImages(prompt) - return response.images.first().asBitmap() + val response = generativeModel.generateContent(prompt) + val image = response.candidates.firstOrNull() + ?.content?.parts?.firstNotNullOfOrNull { it.asImageOrNull() } + return image ?: throw IllegalStateException("Could not extract image from model response") } override suspend fun generatePrompt(prompt: String): GeneratedPrompt { diff --git a/feature/creation/build.gradle.kts b/feature/creation/build.gradle.kts index cef6a4fd..f352eced 100644 --- a/feature/creation/build.gradle.kts +++ b/feature/creation/build.gradle.kts @@ -43,6 +43,9 @@ dependencies { implementation(libs.hilt.android) implementation(libs.timber) implementation(libs.androidx.hilt.navigation.compose) + implementation(libs.androidx.lifecycle.runtime.ktx) + implementation(libs.androidx.lifecycle.viewmodel.ktx) + implementation(libs.androidx.lifecycle.viewmodel.compose) implementation(libs.androidx.adaptive) implementation(libs.androidx.adaptive.layout) implementation(libs.androidx.window) diff --git a/feature/creation/src/main/java/com/android/developers/androidify/creation/CreationViewModel.kt b/feature/creation/src/main/java/com/android/developers/androidify/creation/CreationViewModel.kt index 5f509934..05bf2dd0 100644 --- a/feature/creation/src/main/java/com/android/developers/androidify/creation/CreationViewModel.kt +++ b/feature/creation/src/main/java/com/android/developers/androidify/creation/CreationViewModel.kt @@ -42,6 +42,7 @@ import kotlinx.coroutines.Job import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.update +import kotlinx.coroutines.isActive import kotlinx.coroutines.launch import timber.log.Timber @@ -77,6 +78,7 @@ class CreationViewModel @AssistedInject constructor( private var imageGenerationJob: Job? = null init { + Timber.d("CreationViewModel init. hashCode: ${hashCode()}") onImageSelected(originalImageUrl) } @@ -103,6 +105,7 @@ class CreationViewModel @AssistedInject constructor( fun onPromptGenerationClicked() { promptGenerationJob?.cancel() + Timber.d("CreationViewModel onPrompt. hashCode: ${hashCode()} ${viewModelScope.isActive}") promptGenerationJob = viewModelScope.launch { Timber.d("Generating prompt...") _uiState.update { @@ -238,6 +241,11 @@ class CreationViewModel @AssistedInject constructor( it.copy(resultBitmapUri = null) } } + + override fun onCleared() { + super.onCleared() + Timber.d("CreationViewModel onCleared. hashCode: ${hashCode()}") + } } data class CreationState( diff --git a/feature/creation/src/main/java/com/android/developers/androidify/creation/xr/EditScreenSpatial.kt b/feature/creation/src/main/java/com/android/developers/androidify/creation/xr/EditScreenSpatial.kt index 5693754b..b3628c3f 100644 --- a/feature/creation/src/main/java/com/android/developers/androidify/creation/xr/EditScreenSpatial.kt +++ b/feature/creation/src/main/java/com/android/developers/androidify/creation/xr/EditScreenSpatial.kt @@ -33,9 +33,9 @@ import androidx.compose.ui.unit.dp import androidx.xr.compose.spatial.ContentEdge import androidx.xr.compose.spatial.Orbiter import androidx.xr.compose.subspace.SpatialColumn -import androidx.xr.compose.subspace.SpatialSpacer import androidx.xr.compose.subspace.SpatialPanel import androidx.xr.compose.subspace.SpatialRow +import androidx.xr.compose.subspace.SpatialSpacer import androidx.xr.compose.subspace.layout.SubspaceModifier import androidx.xr.compose.subspace.layout.fillMaxHeight import androidx.xr.compose.subspace.layout.fillMaxWidth diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 839c7c79..c8d81e48 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -30,7 +30,6 @@ crashlytics = "3.0.7" datastore = "1.2.1" espressoCore = "3.7.0" firebaseBom = "34.13.0" -foundation = "1.12.0-alpha03" genaiPrompt = "1.0.0-beta2" googleServices = "4.4.4" googleOss = "17.5.1" @@ -49,7 +48,7 @@ kotlinxSerializationJson = "1.11.0" kotlinxSerializationProtobuf = "1.11.0" ktlint = "1.5.0" lifecycleRuntimeKtx = "2.10.0" -lifecycleViewmodelNavigation3 = "2.10.0" +lifecycleViewmodelNavigation3 = "2.11.0-beta02" loggingInterceptor = "5.3.2" material3 = "1.5.0-alpha20" media3 = "1.10.1" diff --git a/wear/src/main/java/com/android/developers/androidify/ui/CallToActionScreen.kt b/wear/src/main/java/com/android/developers/androidify/ui/CallToActionScreen.kt index 82f1e903..c2f6f08c 100644 --- a/wear/src/main/java/com/android/developers/androidify/ui/CallToActionScreen.kt +++ b/wear/src/main/java/com/android/developers/androidify/ui/CallToActionScreen.kt @@ -24,11 +24,11 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp +import androidx.wear.compose.foundation.lazy.TransformingLazyColumn import androidx.wear.compose.foundation.lazy.rememberTransformingLazyColumnState import androidx.wear.compose.material3.MaterialTheme import androidx.wear.compose.material3.ScreenScaffold import androidx.wear.compose.material3.Text -import androidx.wear.compose.material3.lazy.ResponsiveTransformingLazyColumn import androidx.wear.compose.ui.tooling.preview.WearPreviewDevices import com.android.developers.androidify.R import com.android.developers.androidify.ui.theme.AndroidifyWearTheme @@ -43,7 +43,7 @@ fun CallToActionScreen( ScreenScaffold( scrollState = listState, ) { contentPadding -> - ResponsiveTransformingLazyColumn( + TransformingLazyColumn( state = listState, contentPadding = contentPadding, ) { diff --git a/wear/src/main/java/com/android/developers/androidify/ui/TransmissionScreen.kt b/wear/src/main/java/com/android/developers/androidify/ui/TransmissionScreen.kt index 770d79db..98219cca 100644 --- a/wear/src/main/java/com/android/developers/androidify/ui/TransmissionScreen.kt +++ b/wear/src/main/java/com/android/developers/androidify/ui/TransmissionScreen.kt @@ -37,14 +37,13 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp +import androidx.wear.compose.foundation.lazy.TransformingLazyColumn import androidx.wear.compose.foundation.lazy.rememberTransformingLazyColumnState import androidx.wear.compose.material3.CircularProgressIndicator import androidx.wear.compose.material3.MaterialTheme import androidx.wear.compose.material3.ProgressIndicatorDefaults import androidx.wear.compose.material3.ScreenScaffold import androidx.wear.compose.material3.Text -import androidx.wear.compose.material3.lazy.ResponsiveItemType -import androidx.wear.compose.material3.lazy.ResponsiveTransformingLazyColumn import androidx.wear.compose.ui.tooling.preview.WearPreviewDevices import com.android.developers.androidify.R import com.android.developers.androidify.ui.theme.AndroidifyWearTheme @@ -61,27 +60,27 @@ fun TransmissionScreen(modifier: Modifier = Modifier) { modifier = modifier.keepScreenOn(), scrollState = listState, ) { contentPadding -> - ResponsiveTransformingLazyColumn( + TransformingLazyColumn( state = listState, contentPadding = contentPadding, ) { - item(itemType = ResponsiveItemType.IconButton) { + item { Image( modifier = Modifier.fillMaxWidth(0.3f), painter = painterResource(id = R.drawable.logo), contentDescription = stringResource(R.string.logo_description), ) } - item(itemType = ResponsiveItemType.Default) { + item { Spacer(modifier = Modifier.height(4.dp)) } - item(itemType = ResponsiveItemType.IconButton) { + item { FourColorProgressIndicator() } - item(itemType = ResponsiveItemType.Default) { + item { Spacer(modifier = Modifier.height(4.dp)) } - item(itemType = ResponsiveItemType.Text) { + item { Text( modifier = Modifier.fillMaxWidth(), textAlign = TextAlign.Center, From 0b614f89b5f4733eb94b413d6b8aab85efcd0df6 Mon Sep 17 00:00:00 2001 From: Rebecca Franks Date: Thu, 28 May 2026 16:41:09 +0100 Subject: [PATCH 5/8] Exclude workmanager --- app/proguard-rules.pro | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 3ad8efb8..bbbcc092 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -51,3 +51,17 @@ # Ignore SAX parser warning -dontwarn org.xml.sax.** + +# WorkManager / Room R8 Full Mode keep rules +-keep class androidx.work.impl.WorkDatabase_Impl { *; } +-keep class androidx.work.impl.** { *; } +-dontwarn androidx.work.impl.** + +# Keep list of constructors used by reflection (Workers) +-keep class * extends androidx.work.ListenableWorker { + (android.content.Context, androidx.work.WorkerParameters); +} +-keep class * extends androidx.work.Worker { + (android.content.Context, androidx.work.WorkerParameters); +} + From 9017343335707a6b5a56c967bc899a0498bbeef0 Mon Sep 17 00:00:00 2001 From: Rebecca Franks Date: Fri, 29 May 2026 10:50:38 +0100 Subject: [PATCH 6/8] Fixing up tests --- .github/workflows/build_and_test.yml | 2 +- .../android/developers/androidify/camera/CameraScreenTest.kt | 2 +- .../developers/androidify/creation/CreationScreenTest.kt | 2 +- .../com/android/developers/androidify/home/HomeScreenTest.kt | 2 +- .../android/developers/androidify/results/ResultsScreenTest.kt | 2 +- gradle.properties | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 8ffca8ad..6238c72b 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -93,7 +93,7 @@ jobs: timeout-minutes: 60 strategy: matrix: - api-level: [26] + api-level: [35] steps: - name: Delete unnecessary tools 🔧 diff --git a/feature/camera/src/androidTest/java/com/android/developers/androidify/camera/CameraScreenTest.kt b/feature/camera/src/androidTest/java/com/android/developers/androidify/camera/CameraScreenTest.kt index d76517ea..57035325 100644 --- a/feature/camera/src/androidTest/java/com/android/developers/androidify/camera/CameraScreenTest.kt +++ b/feature/camera/src/androidTest/java/com/android/developers/androidify/camera/CameraScreenTest.kt @@ -26,7 +26,7 @@ import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsEnabled import androidx.compose.ui.test.assertIsNotDisplayed import androidx.compose.ui.test.assertIsNotEnabled -import androidx.compose.ui.test.junit4.createAndroidComposeRule +import androidx.compose.ui.test.junit4.v2.createAndroidComposeRule import androidx.compose.ui.test.onNodeWithContentDescription import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick diff --git a/feature/creation/src/androidTest/java/com/android/developers/androidify/creation/CreationScreenTest.kt b/feature/creation/src/androidTest/java/com/android/developers/androidify/creation/CreationScreenTest.kt index 837eb79f..5417315c 100644 --- a/feature/creation/src/androidTest/java/com/android/developers/androidify/creation/CreationScreenTest.kt +++ b/feature/creation/src/androidTest/java/com/android/developers/androidify/creation/CreationScreenTest.kt @@ -21,7 +21,7 @@ import androidx.compose.material3.SnackbarHostState import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsOff import androidx.compose.ui.test.assertIsOn -import androidx.compose.ui.test.junit4.createAndroidComposeRule +import androidx.compose.ui.test.junit4.v2.createAndroidComposeRule import androidx.compose.ui.test.onNodeWithContentDescription import androidx.compose.ui.test.onNodeWithText import androidx.test.ext.junit.runners.AndroidJUnit4 diff --git a/feature/home/src/androidTest/java/com/android/developers/androidify/home/HomeScreenTest.kt b/feature/home/src/androidTest/java/com/android/developers/androidify/home/HomeScreenTest.kt index 5e0b077e..e5211da7 100644 --- a/feature/home/src/androidTest/java/com/android/developers/androidify/home/HomeScreenTest.kt +++ b/feature/home/src/androidTest/java/com/android/developers/androidify/home/HomeScreenTest.kt @@ -18,7 +18,7 @@ package com.android.developers.androidify.home import androidx.activity.ComponentActivity import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsNotDisplayed -import androidx.compose.ui.test.junit4.createAndroidComposeRule +import androidx.compose.ui.test.junit4.v2.createAndroidComposeRule import androidx.compose.ui.test.onNodeWithContentDescription import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick diff --git a/feature/results/src/androidTest/java/com/android/developers/androidify/results/ResultsScreenTest.kt b/feature/results/src/androidTest/java/com/android/developers/androidify/results/ResultsScreenTest.kt index 70dd20eb..26edc034 100644 --- a/feature/results/src/androidTest/java/com/android/developers/androidify/results/ResultsScreenTest.kt +++ b/feature/results/src/androidTest/java/com/android/developers/androidify/results/ResultsScreenTest.kt @@ -22,7 +22,7 @@ import androidx.compose.ui.platform.LocalInspectionMode import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsOff import androidx.compose.ui.test.assertIsOn -import androidx.compose.ui.test.junit4.createAndroidComposeRule +import androidx.compose.ui.test.junit4.v2.createAndroidComposeRule import androidx.compose.ui.test.onNodeWithContentDescription import androidx.compose.ui.test.onNodeWithText import androidx.compose.ui.test.performClick diff --git a/gradle.properties b/gradle.properties index fd90e71e..146b2401 100644 --- a/gradle.properties +++ b/gradle.properties @@ -8,7 +8,7 @@ # The setting is particularly useful for tweaking memory settings. org.gradle.caching=true org.gradle.parallel=true -org.gradle.jvmargs=-Dfile.encoding=UTF-8 -XX:+UseG1GC -XX:SoftRefLRUPolicyMSPerMB=1 -XX:ReservedCodeCacheSize=256m -XX:+HeapDumpOnOutOfMemoryError -Xmx4g -Xms4g +org.gradle.jvmargs=-Dfile.encoding=UTF-8 -XX:+UseG1GC -XX:SoftRefLRUPolicyMSPerMB=1 -XX:ReservedCodeCacheSize=256m -XX:+HeapDumpOnOutOfMemoryError -Xmx6g -Xms6g # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. For more details, visit # https://developer.android.com/r/tools/gradle-multi-project-decoupled-projects From edf4cf65cf25a12930f5f21c14a9213f486ee0c3 Mon Sep 17 00:00:00 2001 From: Rebecca Franks Date: Fri, 29 May 2026 10:55:56 +0100 Subject: [PATCH 7/8] Fixing up tests --- .../androidify/home/HomeScreenTest.kt | 38 +++++++++++-------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/feature/home/src/androidTest/java/com/android/developers/androidify/home/HomeScreenTest.kt b/feature/home/src/androidTest/java/com/android/developers/androidify/home/HomeScreenTest.kt index e5211da7..52fa56fa 100644 --- a/feature/home/src/androidTest/java/com/android/developers/androidify/home/HomeScreenTest.kt +++ b/feature/home/src/androidTest/java/com/android/developers/androidify/home/HomeScreenTest.kt @@ -16,6 +16,8 @@ package com.android.developers.androidify.home import androidx.activity.ComponentActivity +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.ui.platform.LocalInspectionMode import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsNotDisplayed import androidx.compose.ui.test.junit4.v2.createAndroidComposeRule @@ -47,15 +49,17 @@ class HomeScreenTest { // Directly render HomeScreenContents, passing a lambda to track the click SharedElementContextPreview { - HomeScreenContents( - layoutType = HomeScreenLayoutType.Compact, // Provide a default or mock value - onClickLetsGo = { offset: IntOffset -> // Match the lambda signature - wasClicked = true - }, - onAboutClicked = {}, // Provide a default or mock value, - videoLink = "", - dancingBotLink = "", - ) + CompositionLocalProvider(LocalInspectionMode provides true) { + HomeScreenContents( + layoutType = HomeScreenLayoutType.Compact, // Provide a default or mock value + onClickLetsGo = { offset: IntOffset -> // Match the lambda signature + wasClicked = true + }, + onAboutClicked = {}, // Provide a default or mock value, + videoLink = "", + dancingBotLink = "", + ) + } } } @@ -73,13 +77,15 @@ class HomeScreenTest { composeTestRule.setContent { SharedElementContextPreview { - HomeScreenContents( - layoutType = HomeScreenLayoutType.Compact, // Ensure compact mode for pager - onClickLetsGo = { }, - onAboutClicked = {}, - videoLink = "", - dancingBotLink = "", - ) + CompositionLocalProvider(LocalInspectionMode provides true) { + HomeScreenContents( + layoutType = HomeScreenLayoutType.Compact, // Ensure compact mode for pager + onClickLetsGo = { }, + onAboutClicked = {}, + videoLink = "", + dancingBotLink = "", + ) + } } } From f96003f364e02a3d4be88cbe0c99885bde841caa Mon Sep 17 00:00:00 2001 From: Rebecca Franks Date: Fri, 29 May 2026 11:10:14 +0100 Subject: [PATCH 8/8] Fixing up tests --- .github/workflows/build_and_test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build_and_test.yml b/.github/workflows/build_and_test.yml index 6238c72b..8ffca8ad 100644 --- a/.github/workflows/build_and_test.yml +++ b/.github/workflows/build_and_test.yml @@ -93,7 +93,7 @@ jobs: timeout-minutes: 60 strategy: matrix: - api-level: [35] + api-level: [26] steps: - name: Delete unnecessary tools 🔧