Snap for 11390309 from 00e9783e77aa1315d3d7da01d87b6e4b7adf137c to studio-jellyfish-release

Change-Id: Ia5dc929635139f3c9d2fbee2b5c2a09ba0ac9281
diff --git a/.idea/libraries/rust_plugin.xml b/.idea/libraries/rust_plugin.xml
index 281b1de..da45035 100644
--- a/.idea/libraries/rust_plugin.xml
+++ b/.idea/libraries/rust_plugin.xml
@@ -5,7 +5,7 @@
       <root url="jar://$PROJECT_DIR$/../../../prebuilts/tools/common/rust-plugin/intellij-rust/lib/antlr4-runtime-4.13.0.jar!/" />
       <root url="jar://$PROJECT_DIR$/../../../prebuilts/tools/common/rust-plugin/intellij-rust/lib/completion-ranking-rust-0.4.1.jar!/" />
       <root url="jar://$PROJECT_DIR$/../../../prebuilts/tools/common/rust-plugin/intellij-rust/lib/intelliLang.jar!/" />
-      <root url="jar://$PROJECT_DIR$/../../../prebuilts/tools/common/rust-plugin/intellij-rust/lib/intellij-rust-0.4.201.SNAPSHOT-232-dev.jar!/" />
+      <root url="jar://$PROJECT_DIR$/../../../prebuilts/tools/common/rust-plugin/intellij-rust/lib/intellij-rust-233.999999-SNAPSHOT.jar!/" />
       <root url="jar://$PROJECT_DIR$/../../../prebuilts/tools/common/rust-plugin/intellij-rust/lib/jackson-dataformat-toml-2.14.2.jar!/" />
       <root url="jar://$PROJECT_DIR$/../../../prebuilts/tools/common/rust-plugin/intellij-rust/lib/org.eclipse.jgit-6.5.0.202303070854-r.jar!/" />
       <root url="jar://$PROJECT_DIR$/../../../prebuilts/tools/common/rust-plugin/intellij-rust/lib/semver-jvm-1.4.2.jar!/" />
@@ -13,8 +13,7 @@
     <JAVADOC />
     <SOURCES>
       <root url="file://$PROJECT_DIR$/../../../external/jetbrains/rust/src/main/"/>
-      <root url="file://$PROJECT_DIR$/../../../external/jetbrains/rust/src/232/"/>
-      <root url="jar://$PROJECT_DIR$/../../../prebuilts/tools/common/rust-plugin/intellij-rust/lib/src/intellij-rust-0.4.201.SNAPSHOT-232-dev-src.jar!/" />
+      <root url="file://$PROJECT_DIR$/../../../external/jetbrains/rust/src/233/"/>
     </SOURCES>
   </library>
 </component>
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
index eeece91..90cceba 100644
--- a/.idea/modules.xml
+++ b/.idea/modules.xml
@@ -139,6 +139,7 @@
       <module fileurl="file://$PROJECT_DIR$/../../vendor/google/git4insights/git4insights.iml" filepath="$PROJECT_DIR$/../../vendor/google/git4insights/git4insights.iml" />
       <module fileurl="file://$PROJECT_DIR$/../../studio/google/cloud/tools/android-studio-plugin/google-cloud-tools-as.iml" filepath="$PROJECT_DIR$/../../studio/google/cloud/tools/android-studio-plugin/google-cloud-tools-as.iml" />
       <module fileurl="file://$PROJECT_DIR$/../../studio/google/cloud/tools/google-login-plugin/google-login-as.iml" filepath="$PROJECT_DIR$/../../studio/google/cloud/tools/google-login-plugin/google-login-as.iml" />
+      <module fileurl="file://$PROJECT_DIR$/intellij-integration/intellij-integration-tests.iml" filepath="$PROJECT_DIR$/intellij-integration/intellij-integration-tests.iml" />
       <module fileurl="file://$PROJECT_DIR$/android-adb/intellij.android.adb.iml" filepath="$PROJECT_DIR$/android-adb/intellij.android.adb.iml" />
       <module fileurl="file://$PROJECT_DIR$/android-adb/intellij.android.adb.testUtil.iml" filepath="$PROJECT_DIR$/android-adb/intellij.android.adb.testUtil.iml" />
       <module fileurl="file://$PROJECT_DIR$/android-adb/intellij.android.adb.tests.iml" filepath="$PROJECT_DIR$/android-adb/intellij.android.adb.tests.iml" />
@@ -299,8 +300,10 @@
       <module fileurl="file://$PROJECT_DIR$/nav/safeargs/common/intellij.android.nav.safeargs.common.iml" filepath="$PROJECT_DIR$/nav/safeargs/common/intellij.android.nav.safeargs.common.iml" />
       <module fileurl="file://$PROJECT_DIR$/nav/safeargs/common/gradle/intellij.android.nav.safeargs.common.gradle.iml" filepath="$PROJECT_DIR$/nav/safeargs/common/gradle/intellij.android.nav.safeargs.common.gradle.iml" />
       <module fileurl="file://$PROJECT_DIR$/nav/safeargs/k1/intellij.android.nav.safeargs.k1.iml" filepath="$PROJECT_DIR$/nav/safeargs/k1/intellij.android.nav.safeargs.k1.iml" />
+      <module fileurl="file://$PROJECT_DIR$/nav/safeargs/k2/intellij.android.nav.safeargs.k2.iml" filepath="$PROJECT_DIR$/nav/safeargs/k2/intellij.android.nav.safeargs.k2.iml" />
       <module fileurl="file://$PROJECT_DIR$/nav/safeargs/tests/common/intellij.android.nav.safeargs.tests.common.iml" filepath="$PROJECT_DIR$/nav/safeargs/tests/common/intellij.android.nav.safeargs.tests.common.iml" />
       <module fileurl="file://$PROJECT_DIR$/nav/safeargs/tests/k1/intellij.android.nav.safeargs.tests.k1.iml" filepath="$PROJECT_DIR$/nav/safeargs/tests/k1/intellij.android.nav.safeargs.tests.k1.iml" />
+      <module fileurl="file://$PROJECT_DIR$/nav/safeargs/tests/k2/intellij.android.nav.safeargs.tests.k2.iml" filepath="$PROJECT_DIR$/nav/safeargs/tests/k2/intellij.android.nav.safeargs.tests.k2.iml" />
       <module fileurl="file://$PROJECT_DIR$/android-navigator/intellij.android.navigator.iml" filepath="$PROJECT_DIR$/android-navigator/intellij.android.navigator.iml" />
       <module fileurl="file://$PROJECT_DIR$/android-navigator/intellij.android.navigator.testutils.iml" filepath="$PROJECT_DIR$/android-navigator/intellij.android.navigator.testutils.iml" />
       <module fileurl="file://$PROJECT_DIR$/android-npw/intellij.android.newProjectWizard.iml" filepath="$PROJECT_DIR$/android-npw/intellij.android.newProjectWizard.iml" />
@@ -381,7 +384,6 @@
       <module fileurl="file://$PROJECT_DIR$/../../base/wizard/template-plugin/intellij.android.wizardTemplate.plugin.iml" filepath="$PROJECT_DIR$/../../base/wizard/template-plugin/intellij.android.wizardTemplate.plugin.iml" />
       <module fileurl="file://$PROJECT_DIR$/lint/intellij.lint.iml" filepath="$PROJECT_DIR$/lint/intellij.lint.iml" />
       <module fileurl="file://$PROJECT_DIR$/lint/tests/intellij.lint.tests.iml" filepath="$PROJECT_DIR$/lint/tests/intellij.lint.tests.iml" />
-      <module fileurl="file://$PROJECT_DIR$/kotlin-integration/kotlin-integration-tests.iml" filepath="$PROJECT_DIR$/kotlin-integration/kotlin-integration-tests.iml" />
       <module fileurl="file://$PROJECT_DIR$/../../vendor/google/lldb-integration-tests/lldb-integration-tests.iml" filepath="$PROJECT_DIR$/../../vendor/google/lldb-integration-tests/lldb-integration-tests.iml" />
       <module fileurl="file://$PROJECT_DIR$/memory-usage/memory-usage.iml" filepath="$PROJECT_DIR$/memory-usage/memory-usage.iml" />
       <module fileurl="file://$PROJECT_DIR$/../../vendor/google/ml/sml-android/ml.sml-android.iml" filepath="$PROJECT_DIR$/../../vendor/google/ml/sml-android/ml.sml-android.iml" />
diff --git a/android-adb-ui/BUILD b/android-adb-ui/BUILD
index 96a1fef..dda06f7 100644
--- a/android-adb-ui/BUILD
+++ b/android-adb-ui/BUILD
@@ -22,6 +22,7 @@
         "//prebuilts/studio/intellij-sdk:studio-sdk-plugin-platform-images",
         "//prebuilts/studio/intellij-sdk:studio-sdk",
         "//tools/adt/idea/.idea/libraries:studio-analytics-proto",
+        "//tools/base/device-provisioner:studio.android.sdktools.device-provisioner[module]",
     ],
 )
 
@@ -56,5 +57,6 @@
         "//tools/adt/idea/.idea/libraries:truth[test]",
         "//tools/analytics-library/testing:android.sdktools.analytics-testing[module, test]",
         "//tools/adt/idea/.idea/libraries:studio-analytics-proto[test]",
+        "//tools/base/device-provisioner:studio.android.sdktools.device-provisioner[module, test]",
     ],
 )
diff --git a/android-adb-ui/intellij.android.adb.ui.iml b/android-adb-ui/intellij.android.adb.ui.iml
index 1a980cc..f840db3 100644
--- a/android-adb-ui/intellij.android.adb.ui.iml
+++ b/android-adb-ui/intellij.android.adb.ui.iml
@@ -21,5 +21,6 @@
     <orderEntry type="library" name="studio-plugin-platform-images" level="project" />
     <orderEntry type="library" name="studio-sdk" level="project" />
     <orderEntry type="library" name="studio-analytics-proto" level="project" />
+    <orderEntry type="module" module-name="android.sdktools.device-provisioner" />
   </component>
 </module>
\ No newline at end of file
diff --git a/android-adb-ui/intellij.android.adb.ui.tests.iml b/android-adb-ui/intellij.android.adb.ui.tests.iml
index e3b9d24..bade3cc 100644
--- a/android-adb-ui/intellij.android.adb.ui.tests.iml
+++ b/android-adb-ui/intellij.android.adb.ui.tests.iml
@@ -25,6 +25,7 @@
     <orderEntry type="library" scope="TEST" name="truth" level="project" />
     <orderEntry type="module" module-name="android.sdktools.analytics-testing" scope="TEST" />
     <orderEntry type="library" scope="TEST" name="studio-analytics-proto" level="project" />
+    <orderEntry type="module" module-name="android.sdktools.device-provisioner" scope="TEST" />
   </component>
   <component name="TestModuleProperties" production-module="intellij.android.adb.ui" />
 </module>
\ No newline at end of file
diff --git a/android-adb-ui/resources/messages/AndroidAdbUiBundle.properties b/android-adb-ui/resources/messages/AndroidAdbUiBundle.properties
index b722da4..c51a059 100644
--- a/android-adb-ui/resources/messages/AndroidAdbUiBundle.properties
+++ b/android-adb-ui/resources/messages/AndroidAdbUiBundle.properties
@@ -18,12 +18,13 @@
 screenshot.task.step.obtain=Obtaining screenshot from device\u2026
 screenshot.error.decode=Failed to decode screenshot
 screenshot.error.generic=Unexpected error while obtaining screenshot: {0}
+screenshot.error.save=Unable to save screenshot
 screenshot.notification.title=Screen capture
 screenshot.notification.copied.to.clipboard=Image copied to clipboard
+screenshot.decoration.rectangular=Rectangular
+screenshot.decoration.display.shape=Display Shape
+screenshot.decoration.play-compatible=Play Store Compatible
 screenshot.dialog.title=Save as PNG
-screenshot.dialog.decoration.rectangular=Rectangular
-screenshot.dialog.decoration.display.shape=Display Shape
-screenshot.dialog.decoration.display.play-compatible=Play Store Compatible
 screenshot.dialog.ok.button.text=Save
 screenshot.dialog.error=Unexpected error while saving screenshot: {0}
 
diff --git a/android-adb-ui/src/com/android/tools/idea/ui/screenshot/AdbScreenCapScreenshotSupplier.kt b/android-adb-ui/src/com/android/tools/idea/ui/screenshot/AdbScreenCapScreenshotSupplier.kt
index fb15665..b894b13 100644
--- a/android-adb-ui/src/com/android/tools/idea/ui/screenshot/AdbScreenCapScreenshotSupplier.kt
+++ b/android-adb-ui/src/com/android/tools/idea/ui/screenshot/AdbScreenCapScreenshotSupplier.kt
@@ -22,11 +22,11 @@
 import com.android.adblib.shellCommand
 import com.android.adblib.utils.ByteArrayShellCollector
 import com.android.annotations.concurrency.WorkerThread
+import com.android.sdklib.deviceprovisioner.DeviceType
 import com.android.tools.idea.adblib.AdbLibService
 import com.android.tools.idea.concurrency.AndroidCoroutineScope
 import com.android.tools.idea.ui.AndroidAdbUiBundle
 import com.android.tools.idea.ui.screenshot.ScreenshotAction.ScreenshotOptions
-import com.intellij.openapi.Disposable
 import com.intellij.openapi.project.Project
 import kotlinx.coroutines.async
 import kotlinx.coroutines.runBlocking
@@ -42,7 +42,7 @@
   project: Project,
   private val serialNumber: String,
   private val screenshotOptions: ScreenshotOptions,
-) : ScreenshotSupplier, Disposable {
+) : ScreenshotSupplier {
   private val coroutineScope = AndroidCoroutineScope(this)
   private val adbLibService = AdbLibService.getInstance(project)
   private val deviceDisplayInfoRegex = Regex("\\s(DisplayDeviceInfo\\W.*)")
@@ -85,7 +85,7 @@
     when {
       pmOutput.contains("feature:android.software.leanback") -> DeviceType.TV
       pmOutput.contains("feature:android.hardware.type.watch") -> DeviceType.WEAR
-      else -> DeviceType.PHONE
+      else -> DeviceType.HANDHELD
     }
 
   /**
diff --git a/android-adb-ui/src/com/android/tools/idea/ui/screenshot/DeviceArtScreenshotPostprocessor.kt b/android-adb-ui/src/com/android/tools/idea/ui/screenshot/DeviceArtScreenshotDecorator.kt
similarity index 92%
rename from android-adb-ui/src/com/android/tools/idea/ui/screenshot/DeviceArtScreenshotPostprocessor.kt
rename to android-adb-ui/src/com/android/tools/idea/ui/screenshot/DeviceArtScreenshotDecorator.kt
index 29a4983..76ed96f 100644
--- a/android-adb-ui/src/com/android/tools/idea/ui/screenshot/DeviceArtScreenshotPostprocessor.kt
+++ b/android-adb-ui/src/com/android/tools/idea/ui/screenshot/DeviceArtScreenshotDecorator.kt
@@ -28,11 +28,11 @@
 import kotlin.math.max
 
 /**
- * A [ScreenshotPostprocessor] using [DeviceArtPainter].
+ * A [ScreenshotDecorator] using [DeviceArtPainter].
  */
-internal class DeviceArtScreenshotPostprocessor : ScreenshotPostprocessor {
+internal class DeviceArtScreenshotDecorator : ScreenshotDecorator {
   @Slow
-  override fun addFrame(screenshotImage: ScreenshotImage, framingOption: FramingOption?, backgroundColor: Color?): BufferedImage {
+  override fun decorate(screenshotImage: ScreenshotImage, framingOption: FramingOption?, backgroundColor: Color?): BufferedImage {
     if (framingOption == null) {
       return if (screenshotImage.isRoundDisplay) circularClip(screenshotImage.image, backgroundColor) else screenshotImage.image
     }
diff --git a/android-adb-ui/src/com/android/tools/idea/ui/screenshot/DeviceArtScreenshotOptions.kt b/android-adb-ui/src/com/android/tools/idea/ui/screenshot/DeviceArtScreenshotOptions.kt
index 1f79261..5061f03 100644
--- a/android-adb-ui/src/com/android/tools/idea/ui/screenshot/DeviceArtScreenshotOptions.kt
+++ b/android-adb-ui/src/com/android/tools/idea/ui/screenshot/DeviceArtScreenshotOptions.kt
@@ -16,6 +16,7 @@
 package com.android.tools.idea.ui.screenshot
 
 import com.android.resources.ScreenOrientation
+import com.android.sdklib.deviceprovisioner.DeviceType
 import com.android.tools.adtui.ImageUtils
 import com.android.tools.adtui.device.DeviceArtDescriptor
 import com.android.tools.idea.ui.screenshot.ScreenshotViewer.Option.ALLOW_IMAGE_ROTATION
@@ -33,7 +34,7 @@
 
   override val screenshotViewerOptions: EnumSet<ScreenshotViewer.Option> = EnumSet.of(ALLOW_IMAGE_ROTATION)
 
-  override val screenshotPostprocessor: ScreenshotPostprocessor = DeviceArtScreenshotPostprocessor()
+  override val screenshotDecorator: ScreenshotDecorator = DeviceArtScreenshotDecorator()
 
   override fun createScreenshotImage(image: BufferedImage, displayInfo: String, deviceType: DeviceType): ScreenshotImage {
     return ScreenshotImage(image, 0, deviceType, displayInfo)
diff --git a/android-adb-ui/src/com/android/tools/idea/ui/screenshot/DeviceType.kt b/android-adb-ui/src/com/android/tools/idea/ui/screenshot/DeviceType.kt
deleted file mode 100644
index 70e527c..0000000
--- a/android-adb-ui/src/com/android/tools/idea/ui/screenshot/DeviceType.kt
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.tools.idea.ui.screenshot
-
-enum class DeviceType {
-  WEAR,
-  TV,
-  PHONE
-}
\ No newline at end of file
diff --git a/android-adb-ui/src/com/android/tools/idea/ui/screenshot/ScreenshotAction.kt b/android-adb-ui/src/com/android/tools/idea/ui/screenshot/ScreenshotAction.kt
index 6d9064e..2166739 100644
--- a/android-adb-ui/src/com/android/tools/idea/ui/screenshot/ScreenshotAction.kt
+++ b/android-adb-ui/src/com/android/tools/idea/ui/screenshot/ScreenshotAction.kt
@@ -17,27 +17,31 @@
 
 import com.android.SdkConstants
 import com.android.io.writeImage
-import com.android.tools.idea.ui.AndroidAdbUiBundle
+import com.android.sdklib.deviceprovisioner.DeviceType
+import com.android.tools.idea.ui.AndroidAdbUiBundle.message
 import com.intellij.openapi.Disposable
 import com.intellij.openapi.actionSystem.ActionUpdateThread
 import com.intellij.openapi.actionSystem.AnActionEvent
 import com.intellij.openapi.actionSystem.DataKey
 import com.intellij.openapi.diagnostic.thisLogger
 import com.intellij.openapi.fileEditor.FileEditorManager
+import com.intellij.openapi.progress.ProgressIndicator
 import com.intellij.openapi.project.DumbAwareAction
 import com.intellij.openapi.ui.Messages
 import com.intellij.openapi.util.Disposer
 import com.intellij.openapi.util.io.FileUtil
 import com.intellij.openapi.vfs.LocalFileSystem
+import com.intellij.openapi.vfs.VirtualFile
 import icons.StudioIcons
 import java.awt.image.BufferedImage
+import java.io.IOException
 
 /**
  * Captures a screenshot of the device display.
  */
 class ScreenshotAction : DumbAwareAction(
-  AndroidAdbUiBundle.message("screenshot.action.title"),
-  AndroidAdbUiBundle.message("screenshot.action.description"),
+  message("screenshot.action.title"),
+  message("screenshot.action.description"),
   StudioIcons.Common.SCREENSHOT,
 ) {
 
@@ -54,51 +58,37 @@
 
     val screenshotSupplier = AdbScreenCapScreenshotSupplier(project, serialNumber, screenshotOptions)
     var disposable: Disposable? = screenshotSupplier
+
     object : ScreenshotTask(project, screenshotSupplier) {
+      var backingFile: VirtualFile? = null
+
+      override fun run(indicator: ProgressIndicator) {
+        super.run(indicator)
+        val screenshot = screenshot ?: return
+        try {
+          val screenshotDecorator = screenshotOptions.screenshotDecorator
+          val framingOptions = screenshotOptions.getFramingOptions(screenshot)
+          val decoration = ScreenshotViewer.getDefaultDecoration(screenshot, screenshotDecorator, framingOptions.firstOrNull(), project)
+          val processedImage = screenshotDecorator.decorate(screenshot, decoration)
+          val file = FileUtil.createTempFile("screenshot", SdkConstants.DOT_PNG).toPath()
+          processedImage.writeImage("PNG", file)
+          backingFile = LocalFileSystem.getInstance().refreshAndFindFileByNioFile(file) ?:
+              throw IOException(message("screenshot.error.save"))
+        }
+        catch (e: IOException) {
+          thisLogger().warn("Error while saving screenshot file", e)
+          error = message("screenshot.error.generic", e)
+        }
+      }
 
       override fun onSuccess() {
-        error?.let { msg ->
-          Messages.showErrorDialog(project, msg, AndroidAdbUiBundle.message("screenshot.action.title"))
+        val error = error
+        if (error != null) {
+          Messages.showErrorDialog(project, error, message("screenshot.action.title"))
           return
         }
 
-        try {
-          val backingFile = FileUtil.createTempFile("screenshot", SdkConstants.DOT_PNG).toPath()
-          val screenshotImage = screenshot!!
-          screenshotImage.image.writeImage(SdkConstants.EXT_PNG, backingFile)
-          val screenshotPostprocessor = screenshotOptions.screenshotPostprocessor
-          val framingOptions = screenshotOptions.getFramingOptions(screenshotImage)
-          val defaultFrame =
-              if (framingOptions.isNotEmpty()) screenshotOptions.getDefaultFramingOption(framingOptions, screenshotImage) else 0
-          val viewer: ScreenshotViewer = object : ScreenshotViewer(project,
-                                                                   screenshotImage,
-                                                                   backingFile,
-                                                                   screenshotSupplier,
-                                                                   screenshotPostprocessor,
-                                                                   framingOptions,
-                                                                   defaultFrame,
-                                                                   screenshotOptions.screenshotViewerOptions) {
-            override fun doOKAction() {
-              super.doOKAction()
-              screenshot?.let {
-                LocalFileSystem.getInstance().refreshAndFindFileByNioFile(it)?.let { virtualFile ->
-                  virtualFile.refresh(false, false)
-                  FileEditorManager.getInstance(project).openFile(virtualFile, true)
-                }
-              }
-            }
-          }
-          viewer.show()
-          Disposer.register(viewer.disposable, screenshotSupplier)
-          disposable = null
-        }
-        catch (e: Exception) {
-          thisLogger().warn("Error while displaying screenshot viewer: ", e)
-          Messages.showErrorDialog(
-            project,
-            AndroidAdbUiBundle.message("screenshot.error.generic", e),
-            AndroidAdbUiBundle.message("screenshot.action.title"))
-        }
+        showScreenshotViewer(screenshot!!, backingFile!!)
       }
 
       override fun onFinished() {
@@ -107,6 +97,35 @@
         }
       }
 
+      private fun showScreenshotViewer(screenshot: ScreenshotImage, backingFile: VirtualFile) {
+        val screenshotPostprocessor = screenshotOptions.screenshotDecorator
+        val framingOptions = screenshotOptions.getFramingOptions(screenshot)
+        try {
+          val defaultFrame =
+              if (framingOptions.isNotEmpty()) screenshotOptions.getDefaultFramingOption(framingOptions, screenshot) else 0
+          val viewer: ScreenshotViewer = object : ScreenshotViewer(project,
+                                                                   screenshot,
+                                                                   backingFile,
+                                                                   screenshotSupplier,
+                                                                   screenshotPostprocessor,
+                                                                   framingOptions,
+                                                                   defaultFrame,
+                                                                   screenshotOptions.screenshotViewerOptions) {
+            override fun doOKAction() {
+              super.doOKAction()
+              backingFile.refresh(false, false)
+              FileEditorManager.getInstance(project).openFile(backingFile, true)
+            }
+          }
+          viewer.show()
+          Disposer.register(viewer.disposable, screenshotSupplier)
+          disposable = null
+        }
+        catch (e: Exception) {
+          thisLogger().warn("Error while displaying screenshot viewer", e)
+          Messages.showErrorDialog(project, message("screenshot.error.generic", e), message("screenshot.action.title"))
+        }
+      }
     }.queue()
   }
 
@@ -117,7 +136,7 @@
   interface ScreenshotOptions {
     val serialNumber: String
     val screenshotViewerOptions: Set<ScreenshotViewer.Option>
-    val screenshotPostprocessor: ScreenshotPostprocessor
+    val screenshotDecorator: ScreenshotDecorator
 
     fun createScreenshotImage(image: BufferedImage, displayInfo: String, deviceType: DeviceType): ScreenshotImage
 
diff --git a/android-adb-ui/src/com/android/tools/idea/ui/screenshot/ScreenshotDecorationOption.kt b/android-adb-ui/src/com/android/tools/idea/ui/screenshot/ScreenshotDecorationOption.kt
new file mode 100644
index 0000000..316826d
--- /dev/null
+++ b/android-adb-ui/src/com/android/tools/idea/ui/screenshot/ScreenshotDecorationOption.kt
@@ -0,0 +1,50 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.tools.idea.ui.screenshot
+
+import com.android.tools.idea.ui.AndroidAdbUiBundle.message
+import com.android.utils.HashCodes
+import java.awt.Color
+import java.util.Objects
+
+/** Describes additional decorations applied to a screenshot image. */
+class ScreenshotDecorationOption
+    private constructor(private val clipAction: String?, val background: Color? = null, val framingOption: FramingOption? = null) {
+
+  constructor(framingOption: FramingOption) : this(null, null, framingOption)
+
+  override fun toString(): String {
+    return framingOption?.displayName ?: clipAction.toString()
+  }
+
+  override fun hashCode(): Int {
+    return HashCodes.mix(Objects.hashCode(clipAction), Objects.hashCode(framingOption))
+  }
+
+  override fun equals(other: Any?): Boolean {
+    if (this === other) return true
+    if (other == null || javaClass != other.javaClass) return false
+    other as ScreenshotDecorationOption
+    return clipAction == other.clipAction && framingOption == other.framingOption
+  }
+
+  @Suppress("UseJBColor") // Use real black color (JBColor.BLACK is grey in dark modes).
+  companion object {
+    @JvmField val RECTANGULAR = ScreenshotDecorationOption(message("screenshot.decoration.rectangular"), Color.BLACK)
+    @JvmField val DISPLAY_SHAPE_CLIP = ScreenshotDecorationOption(message("screenshot.decoration.display.shape"))
+    @JvmField val PLAY_COMPATIBLE = ScreenshotDecorationOption(message("screenshot.decoration.play-compatible"), Color.BLACK)
+  }
+}
diff --git a/android-adb-ui/src/com/android/tools/idea/ui/screenshot/ScreenshotPostprocessor.kt b/android-adb-ui/src/com/android/tools/idea/ui/screenshot/ScreenshotDecorator.kt
similarity index 65%
rename from android-adb-ui/src/com/android/tools/idea/ui/screenshot/ScreenshotPostprocessor.kt
rename to android-adb-ui/src/com/android/tools/idea/ui/screenshot/ScreenshotDecorator.kt
index 4e20d21..748b903 100644
--- a/android-adb-ui/src/com/android/tools/idea/ui/screenshot/ScreenshotPostprocessor.kt
+++ b/android-adb-ui/src/com/android/tools/idea/ui/screenshot/ScreenshotDecorator.kt
@@ -17,30 +17,39 @@
 package com.android.tools.idea.ui.screenshot
 
 import com.android.annotations.concurrency.Slow
-import java.awt.AlphaComposite
 import java.awt.Color
-import java.awt.Dimension
 import java.awt.image.BufferedImage
 
 /**
  * Used in conjunction with [ScreenshotViewer].
  */
-interface ScreenshotPostprocessor {
+interface ScreenshotDecorator {
   /**
    * Adds a device frame to a screenshot image.
    *
    * @param screenshotImage the screenshot image to process
    * @param framingOption determines the type of the frame to add to the image, or null to possibly
    *     adjust the screenshot without adding a frame
-   * @param backgroundColor the back color to use when clipping the screenshot
+   * @param backgroundColor the background color to use when clipping the screenshot
    * @return the framed image
    */
   @Slow
-  fun addFrame(screenshotImage: ScreenshotImage, framingOption: FramingOption?, backgroundColor: Color?): BufferedImage
+  fun decorate(screenshotImage: ScreenshotImage, framingOption: FramingOption?, backgroundColor: Color?): BufferedImage
+
+  /**
+   * Decorates a screenshot by adding device frame or clopping it to the screen shape.
+   *
+   * @param screenshotImage the screenshot image to process
+   * @param decorationOption determines the type of decoration to add to the image
+   * @return the decorated image
+   */
+  @Slow
+  fun decorate(screenshotImage: ScreenshotImage, decorationOption: ScreenshotDecorationOption): BufferedImage =
+      decorate(screenshotImage, decorationOption.framingOption, decorationOption.background)
 
   /**
    * Indicates whether the postprocessor is capable of clipping a screenshot image to the shape of
    * the device display.
    */
-  abstract val canClipToDisplayShape: Boolean
+  val canClipToDisplayShape: Boolean
 }
\ No newline at end of file
diff --git a/android-adb-ui/src/com/android/tools/idea/ui/screenshot/ScreenshotImage.kt b/android-adb-ui/src/com/android/tools/idea/ui/screenshot/ScreenshotImage.kt
index 98dc083..9a3cf34 100644
--- a/android-adb-ui/src/com/android/tools/idea/ui/screenshot/ScreenshotImage.kt
+++ b/android-adb-ui/src/com/android/tools/idea/ui/screenshot/ScreenshotImage.kt
@@ -15,6 +15,7 @@
  */
 package com.android.tools.idea.ui.screenshot
 
+import com.android.sdklib.deviceprovisioner.DeviceType
 import com.android.tools.adtui.ImageUtils
 import java.awt.Dimension
 import java.awt.image.BufferedImage
diff --git a/android-adb-ui/src/com/android/tools/idea/ui/screenshot/ScreenshotSupplier.kt b/android-adb-ui/src/com/android/tools/idea/ui/screenshot/ScreenshotSupplier.kt
index 7860fc4..c4c7ed6 100644
--- a/android-adb-ui/src/com/android/tools/idea/ui/screenshot/ScreenshotSupplier.kt
+++ b/android-adb-ui/src/com/android/tools/idea/ui/screenshot/ScreenshotSupplier.kt
@@ -17,11 +17,12 @@
 package com.android.tools.idea.ui.screenshot
 
 import com.android.annotations.concurrency.Slow
+import com.intellij.openapi.Disposable
 
 /**
  * Used in conjunction with [ScreenshotViewer].
  */
-interface ScreenshotSupplier {
+interface ScreenshotSupplier : Disposable {
   /**
    * Captures and returns a new screenshot. Throws a [RuntimeException] in case of an error.
    */
diff --git a/android-adb-ui/src/com/android/tools/idea/ui/screenshot/ScreenshotTask.kt b/android-adb-ui/src/com/android/tools/idea/ui/screenshot/ScreenshotTask.kt
index 9d8a9f7..69afe7d 100644
--- a/android-adb-ui/src/com/android/tools/idea/ui/screenshot/ScreenshotTask.kt
+++ b/android-adb-ui/src/com/android/tools/idea/ui/screenshot/ScreenshotTask.kt
@@ -13,7 +13,6 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package com.android.tools.idea.ui.screenshot
 
 import com.android.tools.idea.ui.AndroidAdbUiBundle
@@ -33,7 +32,7 @@
   var screenshot: ScreenshotImage? = null
     private set
   var error: String? = null
-    private set
+    protected set
 
   override fun run(indicator: ProgressIndicator) {
     indicator.isIndeterminate = true
@@ -45,13 +44,7 @@
       if (indicator.isCanceled) {
         return
       }
-      val message = ExceptionUtil.getMessage(e)
-      if (message == null) {
-        AndroidAdbUiBundle.message("screenshot.error.generic", e.javaClass.name)
-      }
-      else {
-        error = message
-      }
+      error = ExceptionUtil.getMessage(e) ?: AndroidAdbUiBundle.message("screenshot.error.generic", e.javaClass.name)
     }
   }
 }
diff --git a/android-adb-ui/src/com/android/tools/idea/ui/screenshot/ScreenshotViewer.java b/android-adb-ui/src/com/android/tools/idea/ui/screenshot/ScreenshotViewer.java
index 5817a04..558ad89 100644
--- a/android-adb-ui/src/com/android/tools/idea/ui/screenshot/ScreenshotViewer.java
+++ b/android-adb-ui/src/com/android/tools/idea/ui/screenshot/ScreenshotViewer.java
@@ -18,11 +18,11 @@
 import static com.android.SdkConstants.EXT_PNG;
 import static com.google.wireless.android.sdk.stats.AndroidStudioEvent.EventKind.DEVICE_SCREENSHOT_EVENT;
 import static com.intellij.openapi.components.StoragePathMacros.NON_ROAMABLE_FILE;
+import static org.jetbrains.android.util.DisposableUtils.runOnDisposalOfAnyOf;
 
 import com.android.tools.analytics.UsageTracker;
 import com.android.tools.idea.ui.AndroidAdbUiBundle;
 import com.android.tools.pixelprobe.color.Colors;
-import com.android.utils.HashCodes;
 import com.google.common.base.Preconditions;
 import com.google.wireless.android.sdk.stats.AndroidStudioEvent;
 import com.google.wireless.android.sdk.stats.DeviceScreenshotEvent;
@@ -31,6 +31,7 @@
 import com.intellij.notification.NotificationGroup;
 import com.intellij.notification.NotificationType;
 import com.intellij.notification.Notifications;
+import com.intellij.openapi.Disposable;
 import com.intellij.openapi.actionSystem.DataProvider;
 import com.intellij.openapi.actionSystem.PlatformCoreDataKeys;
 import com.intellij.openapi.application.ApplicationManager;
@@ -56,7 +57,6 @@
 import com.intellij.openapi.wm.IdeFocusManager;
 import com.intellij.util.xmlb.XmlSerializerUtil;
 import java.awt.BorderLayout;
-import java.awt.Color;
 import java.awt.Component;
 import java.awt.color.ICC_ColorSpace;
 import java.awt.datatransfer.DataFlavor;
@@ -111,7 +111,7 @@
 
   private final @NotNull Project myProject;
   private final @Nullable ScreenshotSupplier myScreenshotSupplier;
-  private final @NotNull ScreenshotPostprocessor myScreenshotPostprocessor;
+  private final @NotNull ScreenshotDecorator myScreenshotDecorator;
 
   private final @NotNull VirtualFile myBackingFile;
   private final @NotNull ImageFileEditor myImageFileEditor;
@@ -124,54 +124,9 @@
   private @NotNull JButton myRotateRightButton;
   private @NotNull JButton myRotateLeftButton;
   private @NotNull JPanel myContentPane;
-  private @NotNull JComboBox<DecorationOption> myDecorationComboBox;
+  private @NotNull JComboBox<ScreenshotDecorationOption> myDecorationComboBox;
   private @NotNull JButton myCopyButton;
 
-  private static final class DecorationOption {
-    private static final DecorationOption RECTANGULAR =
-      new DecorationOption(AndroidAdbUiBundle.message("screenshot.dialog.decoration.rectangular"));
-    private static final DecorationOption DISPLAY_SHAPE_CLIP =
-      new DecorationOption(AndroidAdbUiBundle.message("screenshot.dialog.decoration.display.shape"));
-    private static final DecorationOption PLAY_COMPATIBLE =
-      new DecorationOption(AndroidAdbUiBundle.message("screenshot.dialog.decoration.display.play-compatible"));
-
-    private final @Nullable String myClipAction;
-    private final @Nullable FramingOption myFramingOption;
-
-    public DecorationOption(@NotNull FramingOption framingOption) {
-      myClipAction = null;
-      myFramingOption = framingOption;
-    }
-
-    private DecorationOption(@NotNull String clipAction) {
-      myClipAction = clipAction;
-      myFramingOption = null;
-    }
-
-    public @Nullable FramingOption getFramingOption() {
-      return myFramingOption;
-    }
-
-    @Override
-    public @NotNull String toString() {
-      //noinspection ConstantConditions - Either myFramingOption or myClipAction must be not null
-      return myFramingOption != null ? myFramingOption.getDisplayName() : myClipAction;
-    }
-
-    @Override
-    public int hashCode() {
-      return HashCodes.mix(Objects.hashCode(myClipAction), Objects.hashCode(myFramingOption));
-    }
-
-    @Override
-    public boolean equals(@Nullable Object obj) {
-      if (this == obj) return true;
-      if (obj == null || getClass() != obj.getClass()) return false;
-      DecorationOption other = (DecorationOption)obj;
-      return Objects.equals(myClipAction, other.myClipAction) && Objects.equals(myFramingOption, other.myFramingOption);
-    }
-  }
-
   /**
    * Number of quadrants by which the screenshot from the device has been rotated. One of 0, 1, 2 or 3.
    * Used only if rotation buttons are enabled.
@@ -201,7 +156,7 @@
    *                                the viewer is closed
    * @param screenshotSupplier      an optional supplier of additional screenshots. The <i>Recapture</i>
    *                                button is hidden if not provided
-   * @param screenshotPostprocessor an optional postprocessor used for framing and clipping.
+   * @param screenshotDecorator an optional postprocessor used for framing and clipping.
    *                                The <i>Frame screenshot</i> checkbox and the framing options are hidden if not provided
    * @param framingOptions          available choices of frames.  Ignored if {@code screenshotPostprocessor}
    *                                is null. The pull-down list of framing options is shown only when
@@ -212,9 +167,9 @@
    */
   public ScreenshotViewer(@NotNull Project project,
                           @NotNull ScreenshotImage screenshotImage,
-                          @NotNull Path backingFile,
+                          @NotNull VirtualFile backingFile,
                           @Nullable ScreenshotSupplier screenshotSupplier,
-                          @NotNull ScreenshotPostprocessor screenshotPostprocessor,
+                          @NotNull ScreenshotDecorator screenshotDecorator,
                           @NotNull List<? extends FramingOption> framingOptions,
                           int defaultFramingOption,
                           @NotNull Set<Option> screenshotViewerOptions) {
@@ -227,20 +182,18 @@
 
     myProject = project;
     myScreenshotSupplier = screenshotSupplier;
-    myScreenshotPostprocessor = screenshotPostprocessor;
+    myScreenshotDecorator = screenshotDecorator;
     mySourceImageRef.set(screenshotImage);
     myRotationQuadrants = screenshotImage.getScreenshotRotationQuadrants();
-    myDisplayedImageRef.set(screenshotImage.getImage());
 
-    VirtualFile virtualFile = LocalFileSystem.getInstance().refreshAndFindFileByNioFile(backingFile);
-    assert virtualFile != null;
-    myBackingFile = virtualFile;
+    myBackingFile = backingFile;
 
     if (screenshotSupplier == null) {
       hideComponent(myRefreshButton);
     }
     else {
       myRefreshButton.setIcon(AllIcons.Actions.Refresh);
+      runOnDisposalOfAnyOf(new Disposable[] { screenshotSupplier, getDisposable() }, () -> myRefreshButton.setEnabled(false));
     }
 
     myEditorProvider = getImageFileEditorProvider();
@@ -250,43 +203,40 @@
 
     myPersistentStorage = PersistentState.getInstance(myProject);
 
-    DefaultComboBoxModel<DecorationOption> decorationOptions = new DefaultComboBoxModel<>();
-    decorationOptions.addElement(DecorationOption.RECTANGULAR);
+    DefaultComboBoxModel<ScreenshotDecorationOption> decorationOptions = new DefaultComboBoxModel<>();
+    decorationOptions.addElement(ScreenshotDecorationOption.RECTANGULAR);
     // Clipping is available when the postprocessor supports it and for round devices.
-    boolean canClipDeviceMask = screenshotPostprocessor.getCanClipToDisplayShape() || screenshotImage.isRoundDisplay();
+    boolean canClipDeviceMask = screenshotDecorator.getCanClipToDisplayShape() || screenshotImage.isRoundDisplay();
     if (canClipDeviceMask) {
-      decorationOptions.addElement(DecorationOption.DISPLAY_SHAPE_CLIP);
+      decorationOptions.addElement(ScreenshotDecorationOption.DISPLAY_SHAPE_CLIP);
     }
-    int width = screenshotImage.getWidth();
-    int height = screenshotImage.getHeight();
-    boolean isOneToOneRatio = width == height;
     // DAC specifies a 384x384 minimum size requirement but that requirement is actually not enforced.
-    // The image ratio is enforced, however.
-    boolean isPlayCompatibleWearScreenshot = screenshotImage.isWear() && isOneToOneRatio;
+    // The 1:1 image aspect ratio is enforced, however.
+    boolean isPlayCompatibleWearScreenshot = screenshotImage.isWear() && screenshotImage.getWidth() == screenshotImage.getHeight();
     if (isPlayCompatibleWearScreenshot) {
-      decorationOptions.addElement(DecorationOption.PLAY_COMPATIBLE);
+      decorationOptions.addElement(ScreenshotDecorationOption.PLAY_COMPATIBLE);
     }
     int frameOptionStartIndex = decorationOptions.getSize();
     for (FramingOption framingOption : framingOptions) {
-      decorationOptions.addElement(new DecorationOption(framingOption));
+      decorationOptions.addElement(new ScreenshotDecorationOption(framingOption));
     }
     myDecorationComboBox.setModel(decorationOptions);
 
     if (myPersistentStorage.frameScreenshot && myDecorationComboBox.getItemCount() > defaultFramingOption + frameOptionStartIndex) {
       myDecorationComboBox.setSelectedIndex(defaultFramingOption + frameOptionStartIndex); // Select the default framing option.
     }
+    else if (canClipDeviceMask) {
+      myDecorationComboBox.setSelectedItem(ScreenshotDecorationOption.DISPLAY_SHAPE_CLIP);
+    }
+    else if (isPlayCompatibleWearScreenshot) {
+      myDecorationComboBox.setSelectedItem(ScreenshotDecorationOption.PLAY_COMPATIBLE);
+    }
     else {
-      if (canClipDeviceMask) {
-        myDecorationComboBox.setSelectedItem(DecorationOption.DISPLAY_SHAPE_CLIP);
-      } else if (isPlayCompatibleWearScreenshot) {
-        myDecorationComboBox.setSelectedItem(DecorationOption.PLAY_COMPATIBLE);
-      } else {
-        myDecorationComboBox.setSelectedItem(DecorationOption.RECTANGULAR);
-      }
+      myDecorationComboBox.setSelectedItem(ScreenshotDecorationOption.RECTANGULAR);
     }
 
     ActionListener decorationListener = event -> {
-      myPersistentStorage.frameScreenshot = ((DecorationOption)decorationOptions.getSelectedItem()).getFramingOption() != null;
+      myPersistentStorage.frameScreenshot = ((ScreenshotDecorationOption)decorationOptions.getSelectedItem()).getFramingOption() != null;
       updateImageFrame();
     };
     myDecorationComboBox.addActionListener(decorationListener);
@@ -313,13 +263,32 @@
       logScreenshotUsage();
     });
 
-    updateEditorImage();
-
     init();
 
     updateImageFrame();
   }
 
+  public static @NotNull ScreenshotDecorationOption getDefaultDecoration(
+      @NotNull ScreenshotImage screenshotImage, @NotNull ScreenshotDecorator screenshotDecorator,
+      @Nullable FramingOption defaultFramingOption, @NotNull Project project) {
+    // Clipping is available when either the postprocessor supports it or for round devices.
+    boolean canClipDeviceMask = screenshotDecorator.getCanClipToDisplayShape() || screenshotImage.isRoundDisplay();
+    // DAC specifies a 384x384 minimum size requirement but that requirement is actually not enforced.
+    // The 1:1 image aspect ratio is enforced, however.
+    boolean isPlayCompatibleWearScreenshot = screenshotImage.isWear() && screenshotImage.getWidth() == screenshotImage.getHeight();
+
+    if (PersistentState.getInstance(project).frameScreenshot && defaultFramingOption != null) {
+      return new ScreenshotDecorationOption(defaultFramingOption);
+    }
+    else if (canClipDeviceMask) {
+      return ScreenshotDecorationOption.DISPLAY_SHAPE_CLIP;
+    }
+    else if (isPlayCompatibleWearScreenshot) {
+      return ScreenshotDecorationOption.PLAY_COMPATIBLE;
+    }
+    return ScreenshotDecorationOption.RECTANGULAR;
+  }
+
   private void hideComponent(@NotNull Component component) {
     component.getParent().remove(component);
   }
@@ -398,16 +367,9 @@
     updateEditorImage();
   }
 
-  private BufferedImage processImage(ScreenshotImage sourceImage) {
-    DecorationOption selectedDecoration = (DecorationOption)Objects.requireNonNull(myDecorationComboBox.getSelectedItem());
-    FramingOption framingOption = selectedDecoration.getFramingOption();
-    Color backgroundColor = null;
-    if (selectedDecoration.equals(DecorationOption.RECTANGULAR) ||
-        selectedDecoration.equals(DecorationOption.PLAY_COMPATIBLE)) {
-      //noinspection UseJBColor - we want the actual color Black, JBColor will be grey in dark modes.
-      backgroundColor = Color.BLACK;
-    }
-    return myScreenshotPostprocessor.addFrame(sourceImage, framingOption, backgroundColor);
+  private @NotNull BufferedImage processImage(@NotNull ScreenshotImage sourceImage) {
+    ScreenshotDecorationOption decoration = (ScreenshotDecorationOption)Objects.requireNonNull(myDecorationComboBox.getSelectedItem());
+    return myScreenshotDecorator.decorate(sourceImage, decoration);
   }
 
   @VisibleForTesting
@@ -595,20 +557,21 @@
   private @NotNull DeviceScreenshotEvent.DeviceType getUsageDeviceType() {
     return switch (mySourceImageRef.get().getDeviceType()) {
       case WEAR -> DeviceScreenshotEvent.DeviceType.WEAR;
-      case PHONE -> DeviceScreenshotEvent.DeviceType.PHONE;
+      case HANDHELD -> DeviceScreenshotEvent.DeviceType.PHONE;
       case TV -> DeviceScreenshotEvent.DeviceType.TV;
+      case AUTOMOTIVE -> DeviceScreenshotEvent.DeviceType.UNKNOWN_DEVICE_TYPE;
     };
   }
 
   private @NotNull DeviceScreenshotEvent.DecorationOption getUsageDecorationOption() {
-    DecorationOption selectedDecoration = (DecorationOption)Objects.requireNonNull(myDecorationComboBox.getSelectedItem());
-    if (DecorationOption.RECTANGULAR.equals(selectedDecoration)) {
+    ScreenshotDecorationOption selectedDecoration = (ScreenshotDecorationOption)Objects.requireNonNull(myDecorationComboBox.getSelectedItem());
+    if (ScreenshotDecorationOption.RECTANGULAR.equals(selectedDecoration)) {
       return DeviceScreenshotEvent.DecorationOption.RECTANGULAR;
     }
-    if (DecorationOption.DISPLAY_SHAPE_CLIP.equals(selectedDecoration)) {
+    if (ScreenshotDecorationOption.DISPLAY_SHAPE_CLIP.equals(selectedDecoration)) {
       return DeviceScreenshotEvent.DecorationOption.DISPLAY_SHAPE_CLIP;
     }
-    if (DecorationOption.PLAY_COMPATIBLE.equals(selectedDecoration)) {
+    if (ScreenshotDecorationOption.PLAY_COMPATIBLE.equals(selectedDecoration)) {
       return DeviceScreenshotEvent.DecorationOption.PLAY_COMPATIBLE;
     }
     return DeviceScreenshotEvent.DecorationOption.FRAMED;
diff --git a/android-adb-ui/testSrc/com/android/tools/idea/ui/screenshot/DeviceArtScreenshotOptionsTest.kt b/android-adb-ui/testSrc/com/android/tools/idea/ui/screenshot/DeviceArtScreenshotOptionsTest.kt
index 5d422f7..c4f7596 100644
--- a/android-adb-ui/testSrc/com/android/tools/idea/ui/screenshot/DeviceArtScreenshotOptionsTest.kt
+++ b/android-adb-ui/testSrc/com/android/tools/idea/ui/screenshot/DeviceArtScreenshotOptionsTest.kt
@@ -15,6 +15,7 @@
  */
 package com.android.tools.idea.ui.screenshot
 
+import com.android.sdklib.deviceprovisioner.DeviceType
 import com.google.common.truth.Truth
 import org.junit.Test
 import java.awt.Color
@@ -32,7 +33,7 @@
   fun testCreateScreenshotImage() {
     val image = createImage(1080, 2400, Color.WHITE)
     val displayInfo = "DisplayDeviceInfo{..., 1080 x 2400, ..., density 560, ...}"
-    val screenshotImage = screenshotOptions.createScreenshotImage(image, displayInfo, DeviceType.PHONE)
+    val screenshotImage = screenshotOptions.createScreenshotImage(image, displayInfo, DeviceType.HANDHELD)
     Truth.assertThat(screenshotImage.image.width).isEqualTo(1080)
     Truth.assertThat(screenshotImage.image.height).isEqualTo(2400)
     Truth.assertThat(screenshotImage.displaySize).isEqualTo(Dimension(1080, 2400))
@@ -71,7 +72,7 @@
   fun testGetFramingOptionsPhone() {
     val image = createImage(1080, 2340, Color.WHITE)
     val displayInfo = "DisplayDeviceInfo{..., 1080 x 2340, ..., density 420, ...}"
-    val screenshotImage = screenshotOptions.createScreenshotImage(image, displayInfo, DeviceType.PHONE)
+    val screenshotImage = screenshotOptions.createScreenshotImage(image, displayInfo, DeviceType.HANDHELD)
     val framingOptions = screenshotOptions.getFramingOptions(screenshotImage)
     Truth.assertThat(framingOptions.map(FramingOption::displayName)).containsExactly("Generic Phone", "Generic Tablet")
   }
diff --git a/android-adb-ui/testSrc/com/android/tools/idea/ui/screenshot/ScreenshotViewerTest.kt b/android-adb-ui/testSrc/com/android/tools/idea/ui/screenshot/ScreenshotViewerTest.kt
index 7f62bbf..816f16b 100644
--- a/android-adb-ui/testSrc/com/android/tools/idea/ui/screenshot/ScreenshotViewerTest.kt
+++ b/android-adb-ui/testSrc/com/android/tools/idea/ui/screenshot/ScreenshotViewerTest.kt
@@ -16,6 +16,7 @@
 package com.android.tools.idea.ui.screenshot
 
 import com.android.SdkConstants
+import com.android.sdklib.deviceprovisioner.DeviceType
 import com.android.testutils.waitForCondition
 import com.android.tools.adtui.ImageUtils
 import com.android.tools.adtui.swing.FakeUi
@@ -37,7 +38,9 @@
 import com.intellij.openapi.fileChooser.impl.FileChooserFactoryImpl
 import com.intellij.openapi.project.Project
 import com.intellij.openapi.ui.DialogWrapper.CLOSE_EXIT_CODE
+import com.intellij.openapi.util.Disposer
 import com.intellij.openapi.util.io.FileUtil
+import com.intellij.openapi.vfs.LocalFileSystem
 import com.intellij.openapi.vfs.VirtualFile
 import com.intellij.openapi.vfs.VirtualFileWrapper
 import com.intellij.testFramework.DisposableRule
@@ -123,8 +126,8 @@
 
   @Test
   fun testResizing() {
-    val screenshotImage = ScreenshotImage(createImage(100, 200), 0, DeviceType.PHONE, DISPLAY_INFO_PHONE)
-    val viewer = createScreenshotViewer(screenshotImage, DeviceArtScreenshotPostprocessor())
+    val screenshotImage = ScreenshotImage(createImage(100, 200), 0, DeviceType.HANDHELD, DISPLAY_INFO_PHONE)
+    val viewer = createScreenshotViewer(screenshotImage, DeviceArtScreenshotDecorator())
     val ui = FakeUi(viewer.rootPane)
 
     val zoomModel = ui.getComponent<ImageComponentDecorator>().zoomModel
@@ -138,8 +141,8 @@
 
   @Test
   fun testUpdateEditorImage() {
-    val screenshotImage = ScreenshotImage(createImage(100, 200), 0, DeviceType.PHONE, DISPLAY_INFO_PHONE)
-    val viewer = createScreenshotViewer(screenshotImage, DeviceArtScreenshotPostprocessor())
+    val screenshotImage = ScreenshotImage(createImage(100, 200), 0, DeviceType.HANDHELD, DISPLAY_INFO_PHONE)
+    val viewer = createScreenshotViewer(screenshotImage, DeviceArtScreenshotDecorator())
     val ui = FakeUi(viewer.rootPane)
 
     val zoomModel = ui.getComponent<ImageComponentDecorator>().zoomModel
@@ -153,9 +156,33 @@
   }
 
   @Test
+  fun testRecapture() {
+    val screenshotImage = ScreenshotImage(createImage(100, 200), 0, DeviceType.HANDHELD, DISPLAY_INFO_PHONE)
+    val screenshotSupplier = object : ScreenshotSupplier {
+      var captured = false
+
+      override fun captureScreenshot(): ScreenshotImage {
+        captured = true
+        return screenshotImage
+      }
+
+      override fun dispose() {
+      }
+    }
+    val viewer = createScreenshotViewer(screenshotImage, DeviceArtScreenshotDecorator(), screenshotSupplier)
+    val ui = FakeUi(viewer.rootPane)
+
+    val recaptureButton = ui.getComponent<JButton> { it.text == "Recapture" }
+    ui.clickOn(recaptureButton)
+    assertThat(screenshotSupplier.captured).isTrue()
+    Disposer.dispose(screenshotSupplier)
+    assertThat(recaptureButton.isEnabled).isFalse()
+  }
+
+  @Test
   fun testClipRoundScreenshot() {
     val screenshotImage = ScreenshotImage(createImage(200, 180), 0, DeviceType.WEAR, DISPLAY_INFO_WATCH)
-    val viewer = createScreenshotViewer(screenshotImage, DeviceArtScreenshotPostprocessor())
+    val viewer = createScreenshotViewer(screenshotImage, DeviceArtScreenshotDecorator())
     val ui = FakeUi(viewer.rootPane)
     val clipComboBox = ui.getComponent<JComboBox<*>>()
 
@@ -171,7 +198,7 @@
   @Test
   fun testClipRoundScreenshotWithBackgroundColor() {
     val screenshotImage = ScreenshotImage(createImage(200, 180), 0, DeviceType.WEAR, DISPLAY_INFO_WATCH)
-    val viewer = createScreenshotViewer(screenshotImage, DeviceArtScreenshotPostprocessor())
+    val viewer = createScreenshotViewer(screenshotImage, DeviceArtScreenshotDecorator())
     val ui = FakeUi(viewer.rootPane)
 
     val clipComboBox = ui.getComponent<JComboBox<*>>()
@@ -194,7 +221,7 @@
       UIManager.setLookAndFeel(DarculaLaf())
     }
     val screenshotImage = ScreenshotImage(createImage(200, 180), 0, DeviceType.WEAR, DISPLAY_INFO_WATCH)
-    val viewer = createScreenshotViewer(screenshotImage, DeviceArtScreenshotPostprocessor())
+    val viewer = createScreenshotViewer(screenshotImage, DeviceArtScreenshotDecorator())
     val ui = FakeUi(viewer.rootPane)
     val clipComboBox = ui.getComponent<JComboBox<*>>()
 
@@ -213,7 +240,7 @@
   @Test
   fun testPlayCompatibleScreenshotIsAvailable() {
     val screenshotImage = ScreenshotImage(createImage(360, 360), 0, DeviceType.WEAR, DISPLAY_INFO_WATCH)
-    val viewer = createScreenshotViewer(screenshotImage, DeviceArtScreenshotPostprocessor())
+    val viewer = createScreenshotViewer(screenshotImage, DeviceArtScreenshotDecorator())
     val ui = FakeUi(viewer.rootPane)
 
     val clipComboBox = ui.getComponent<JComboBox<*>>()
@@ -223,7 +250,7 @@
   @Test
   fun testPlayCompatibleScreenshotIsNotAvailableWhenScreenshotIsNot1to1Ratio() {
     val screenshotImage = ScreenshotImage(createImage(384, 500), 0, DeviceType.WEAR, DISPLAY_INFO_WATCH)
-    val viewer = createScreenshotViewer(screenshotImage, DeviceArtScreenshotPostprocessor())
+    val viewer = createScreenshotViewer(screenshotImage, DeviceArtScreenshotDecorator())
     val ui = FakeUi(viewer.rootPane)
 
     val clipComboBox = ui.getComponent<JComboBox<*>>()
@@ -233,7 +260,7 @@
   @Test
   fun testPlayCompatibleScreenshot() {
     val screenshotImage = ScreenshotImage(createImage(384, 384), 0, DeviceType.WEAR, DISPLAY_INFO_WATCH)
-    val viewer = createScreenshotViewer(screenshotImage, DeviceArtScreenshotPostprocessor())
+    val viewer = createScreenshotViewer(screenshotImage, DeviceArtScreenshotDecorator())
     val ui = FakeUi(viewer.rootPane)
 
     val clipComboBox = ui.getComponent<JComboBox<*>>()
@@ -256,7 +283,7 @@
       UIManager.setLookAndFeel(DarculaLaf())
     }
     val screenshotImage = ScreenshotImage(createImage(384, 384), 0, DeviceType.WEAR, DISPLAY_INFO_WATCH)
-    val viewer = createScreenshotViewer(screenshotImage, DeviceArtScreenshotPostprocessor())
+    val viewer = createScreenshotViewer(screenshotImage, DeviceArtScreenshotDecorator())
     val ui = FakeUi(viewer.rootPane)
 
     val clipComboBox = ui.getComponent<JComboBox<*>>()
@@ -276,7 +303,7 @@
   @Test
   fun testComboBoxDefaultsToDisplayShapeIfAvailable() {
     val screenshotImage = ScreenshotImage(createImage(200, 180), 0, DeviceType.WEAR, DISPLAY_INFO_WATCH)
-    val viewer = createScreenshotViewer(screenshotImage, DeviceArtScreenshotPostprocessor())
+    val viewer = createScreenshotViewer(screenshotImage, DeviceArtScreenshotDecorator())
     val ui = FakeUi(viewer.rootPane)
 
     val clipComboBox = ui.getComponent<JComboBox<*>>()
@@ -286,7 +313,7 @@
   @Test
   fun testComboBoxDefaultsToPlayStoreCompatibleIfDisplayShapeIsNotAvailable() {
     val screenshotImage = ScreenshotImage(createImage(360, 360), 0, DeviceType.WEAR, DISPLAY_INFO_WATCH_SQUARE)
-    val viewer = createScreenshotViewer(screenshotImage, DeviceArtScreenshotPostprocessor())
+    val viewer = createScreenshotViewer(screenshotImage, DeviceArtScreenshotDecorator())
     val ui = FakeUi(viewer.rootPane)
 
     val clipComboBox = ui.getComponent<JComboBox<*>>()
@@ -295,8 +322,8 @@
 
   @Test
   fun testComboBoxDefaultsToRectangularIfPlayStoreCompatibleAndDisplayShapeAreNotAvailable() {
-    val screenshotImage = ScreenshotImage(createImage(360, 360), 0, DeviceType.PHONE, DISPLAY_INFO_PHONE)
-    val viewer = createScreenshotViewer(screenshotImage, DeviceArtScreenshotPostprocessor())
+    val screenshotImage = ScreenshotImage(createImage(360, 360), 0, DeviceType.HANDHELD, DISPLAY_INFO_PHONE)
+    val viewer = createScreenshotViewer(screenshotImage, DeviceArtScreenshotDecorator())
     val ui = FakeUi(viewer.rootPane)
 
     val clipComboBox = ui.getComponent<JComboBox<*>>()
@@ -305,8 +332,8 @@
 
   @Test
   fun testScreenshotUsageIsTracked_OkAction_Phone() {
-    val screenshotImage = ScreenshotImage(createImage(200, 180), 0, DeviceType.PHONE, DISPLAY_INFO_PHONE)
-    val viewer = createScreenshotViewer(screenshotImage, DeviceArtScreenshotPostprocessor())
+    val screenshotImage = ScreenshotImage(createImage(200, 180), 0, DeviceType.HANDHELD, DISPLAY_INFO_PHONE)
+    val viewer = createScreenshotViewer(screenshotImage, DeviceArtScreenshotDecorator())
     overrideSaveFileDialog()
 
     viewer.doOKAction()
@@ -323,8 +350,8 @@
 
   @Test
   fun testScreenshotUsageIsTracked_CopyClipboard_Phone() {
-    val screenshotImage = ScreenshotImage(createImage(200, 180), 0, DeviceType.PHONE, DISPLAY_INFO_PHONE)
-    val viewer = createScreenshotViewer(screenshotImage, DeviceArtScreenshotPostprocessor())
+    val screenshotImage = ScreenshotImage(createImage(200, 180), 0, DeviceType.HANDHELD, DISPLAY_INFO_PHONE)
+    val viewer = createScreenshotViewer(screenshotImage, DeviceArtScreenshotDecorator())
     val ui = FakeUi(viewer.rootPane)
     val copyClipboardButton = ui.getComponent<JButton> { it.text == "Copy to Clipboard" }
 
@@ -346,7 +373,7 @@
   @Test
   fun testScreenshotUsageIsTracked_OkAction_Wear() {
     val screenshotImage = ScreenshotImage(createImage(384, 384), 0, DeviceType.WEAR, DISPLAY_INFO_WATCH)
-    val viewer = createScreenshotViewer(screenshotImage, DeviceArtScreenshotPostprocessor())
+    val viewer = createScreenshotViewer(screenshotImage, DeviceArtScreenshotDecorator())
     val ui = FakeUi(viewer.rootPane)
     val clipComboBox = ui.getComponent<JComboBox<*>>()
     overrideSaveFileDialog()
@@ -364,11 +391,10 @@
     )
   }
 
-
   @Test
   fun testScreenshotUsageIsTracked_CopyClipboard_Wear() {
     val screenshotImage = ScreenshotImage(createImage(384, 384), 0, DeviceType.WEAR, DISPLAY_INFO_WATCH)
-    val viewer = createScreenshotViewer(screenshotImage, DeviceArtScreenshotPostprocessor())
+    val viewer = createScreenshotViewer(screenshotImage, DeviceArtScreenshotDecorator())
     val ui = FakeUi(viewer.rootPane)
     val copyClipboardButton = ui.getComponent<JButton> { it.text == "Copy to Clipboard" }
     val clipComboBox = ui.getComponent<JComboBox<*>>()
@@ -392,7 +418,7 @@
     ScreenshotViewer.PersistentState.getInstance(projectRule.project).frameScreenshot = true
 
     // test that no exceptions are thrown
-    createScreenshotViewer(screenshotImage, DeviceArtScreenshotPostprocessor(), framingOptions = listOf())
+    createScreenshotViewer(screenshotImage, DeviceArtScreenshotDecorator(), framingOptions = listOf())
   }
 
   private fun createImage(width: Int, height: Int): BufferedImage {
@@ -405,10 +431,12 @@
   }
 
   private fun createScreenshotViewer(screenshotImage: ScreenshotImage,
-                                     screenshotPostprocessor: ScreenshotPostprocessor,
+                                     screenshotDecorator: ScreenshotDecorator,
+                                     screenshotSupplier: ScreenshotSupplier? = null,
                                      framingOptions: List<FramingOption> = listOf(testFrame)): ScreenshotViewer {
-    val screenshotFile = FileUtil.createTempFile("screenshot", SdkConstants.DOT_PNG).toPath()
-    val viewer = ScreenshotViewer(projectRule.project, screenshotImage, screenshotFile, null, screenshotPostprocessor,
+    val backingFile = FileUtil.createTempFile("screenshot", SdkConstants.DOT_PNG).toPath()
+    val screenshotFile = LocalFileSystem.getInstance().refreshAndFindFileByNioFile(backingFile)!!
+    val viewer = ScreenshotViewer(projectRule.project, screenshotImage, screenshotFile, screenshotSupplier, screenshotDecorator,
                                   framingOptions, 0, EnumSet.of(ScreenshotViewer.Option.ALLOW_IMAGE_ROTATION))
     viewer.show()
     return viewer
diff --git a/android-common/src/com/android/tools/idea/flags/StudioFlags.java b/android-common/src/com/android/tools/idea/flags/StudioFlags.java
index 236457e..0746225 100644
--- a/android-common/src/com/android/tools/idea/flags/StudioFlags.java
+++ b/android-common/src/com/android/tools/idea/flags/StudioFlags.java
@@ -25,6 +25,7 @@
 import com.android.flags.FlagOverrides;
 import com.android.flags.Flags;
 import com.android.flags.IntFlag;
+import com.android.flags.LongFlag;
 import com.android.flags.StringFlag;
 import com.android.flags.overrides.DefaultFlagOverrides;
 import com.android.flags.overrides.PropertyOverrides;
@@ -221,7 +222,7 @@
   //region Design Tools
   private static final FlagGroup DESIGN_TOOLS = new FlagGroup(FLAGS, "design.tools", "Design Tools");
 
-  public static final Flag<Long> PROJECT_SYSTEM_CLASS_LOADER_CACHE_LIMIT = Flag.create(
+  public static final Flag<Long> PROJECT_SYSTEM_CLASS_LOADER_CACHE_LIMIT = new LongFlag(
     DESIGN_TOOLS,
     "project.system.class.loader.cache.max.size",
     "Configure the max size of the cache used by ProjectSystemClassLoader",
@@ -230,7 +231,7 @@
     20_000_000L
   );
 
-  public static final Flag<Long> GRADLE_CLASS_FINDER_CACHE_LIMIT = Flag.create(
+  public static final Flag<Long> GRADLE_CLASS_FINDER_CACHE_LIMIT = new LongFlag(
     DESIGN_TOOLS,
     "gradle.class.finder.cache.max.size",
     "Configure the max size of the cache used by GradleClassFileFinder",
@@ -242,27 +243,27 @@
   //region Layout Editor
   private static final FlagGroup NELE = new FlagGroup(FLAGS, "nele", "Layout Editor");
 
-  public static final Flag<Boolean> NELE_RENDER_DIAGNOSTICS = Flag.create(
+  public static final Flag<Boolean> NELE_RENDER_DIAGNOSTICS = new BooleanFlag(
     NELE, "diagnostics", "Enable rendering on-screen stats",
     "If enabled, the surface displays some debug information to diagnose performance",
     false);
 
-  public static final Flag<Boolean> NELE_LOG_ANDROID_FRAMEWORK = Flag.create(
+  public static final Flag<Boolean> NELE_LOG_ANDROID_FRAMEWORK = new BooleanFlag(
     NELE, "log.android.framework", "Log messages coming from Layoutlib Native.",
     "Log in the IDEA log the messages coming from Java and native code of Layoutlib Native.",
     false);
 
-  public static final Flag<Boolean> NELE_USE_CUSTOM_TRAFFIC_LIGHTS_FOR_RESOURCES = Flag.create(
+  public static final Flag<Boolean> NELE_USE_CUSTOM_TRAFFIC_LIGHTS_FOR_RESOURCES = new BooleanFlag(
     NELE, "use.custom.traffic.lights.for.resources", "Base traffic lights on the errors from the shared issue panel",
     "Use errors from the current file and qualifiers tab in the traffic light rendering for resource files.",
     true);
 
-  public static final Flag<Boolean> NELE_ASSET_REPOSITORY_INCLUDE_AARS_THROUGH_PROJECT_SYSTEM = Flag.create(
+  public static final Flag<Boolean> NELE_ASSET_REPOSITORY_INCLUDE_AARS_THROUGH_PROJECT_SYSTEM = new BooleanFlag(
     NELE, "asset.repository.include.aars.through.project.system", "Include AARs through project system",
     "Include resource directories from AARs found through project system.",
     false);
 
-  public static final Flag<Boolean> NELE_ATF_FOR_COMPOSE = Flag.create(
+  public static final Flag<Boolean> NELE_ATF_FOR_COMPOSE = new BooleanFlag(
     NELE, "atf.for.compose", "Enable ATF checks for Compose",
     "Allow running accessibility checks for Compose using ATF.",
     true);
@@ -277,20 +278,25 @@
     "Enable colorblind Check mode in UI Check Mode for Compose preview",
     ChannelDefault.of(false).withOverride(true, DEV, NIGHTLY, CANARY));
 
-  public static final Flag<Boolean> NELE_COMPOSE_VISUAL_LINT_RUN = Flag.create(
+  public static final Flag<Boolean> NELE_COMPOSE_VISUAL_LINT_RUN = new BooleanFlag(
     NELE, "compose.visual.lint.run", "Enable visual lint for Compose Preview",
     "Enable so that visual lint runs on previews in the Compose Preview.",
     true);
 
-  public static final Flag<Boolean> NELE_CLASS_PRELOADING_DIAGNOSTICS = Flag.create(
+  public static final Flag<Boolean> NELE_CLASS_PRELOADING_DIAGNOSTICS = new BooleanFlag(
     NELE, "preview.class.preloading.diagnostics", "Enable class preloading overlay",
     "If enabled, the surface displays background class preloading progress",
     false);
 
-  public static final Flag<Boolean> NELE_NEW_COMPONENT_TREE = Flag.create(
+  public static final Flag<Boolean> NELE_NEW_COMPONENT_TREE = new BooleanFlag(
     NELE, "use.component.tree.builder", "Use the Component Tree builder",
     "If enabled, use the Component Tree builder for the Nele component tree",
     true);
+
+  public static final Flag<Boolean> NELE_XML_TO_COMPOSE = new BooleanFlag(
+    NELE, "xml.to.compose", "Enable XML to Compose conversion",
+    "Enable an action that converts XML layouts to Compose using the Studio Bot backend",
+    false);
   //endregion
 
   //region Resource Repository
@@ -836,44 +842,44 @@
 
   //region Layout Inspector
   private static final FlagGroup LAYOUT_INSPECTOR = new FlagGroup(FLAGS, "layout.inspector", "Layout Inspector");
-  public static final Flag<Boolean> DYNAMIC_LAYOUT_INSPECTOR_USE_DEVBUILD_SKIA_SERVER = Flag.create(
+  public static final Flag<Boolean> DYNAMIC_LAYOUT_INSPECTOR_USE_DEVBUILD_SKIA_SERVER = new BooleanFlag(
     LAYOUT_INSPECTOR, "dynamic.layout.inspector.devbuild.skia", "Use the locally-built skia rendering server",
     "If enabled and this is a locally-built studio instance, use the locally-built skia server instead of one from the SDK.", false);
 
-  public static final Flag<Boolean> DYNAMIC_LAYOUT_INSPECTOR_AUTO_CONNECT_TO_FOREGROUND_PROCESS_ENABLED = Flag.create(
+  public static final Flag<Boolean> DYNAMIC_LAYOUT_INSPECTOR_AUTO_CONNECT_TO_FOREGROUND_PROCESS_ENABLED = new BooleanFlag(
     LAYOUT_INSPECTOR, "dynamic.layout.inspector.enable.auto.connect.foreground", "Enable automatically connecting to foreground process",
     "When this flag is enabled, LayoutInspector will automatically connect to whatever debuggable process is in the foreground on the phone.",
     true);
 
-  public static final Flag<Boolean> DYNAMIC_LAYOUT_INSPECTOR_IN_RUNNING_DEVICES_ENABLED = Flag.create(
+  public static final Flag<Boolean> DYNAMIC_LAYOUT_INSPECTOR_IN_RUNNING_DEVICES_ENABLED = new BooleanFlag(
     LAYOUT_INSPECTOR, "dynamic.layout.inspector.enable.running.devices", "Enable Layout Inspector in Running Devices",
     "When this flag is enabled, LayoutInspector be integrated in the Running Devices tool window, instead of in its own tool window.",
     true);
 
-  public static final Flag<Boolean> DYNAMIC_LAYOUT_INSPECTOR_THROW_UNEXPECTED_ERROR = Flag.create(
+  public static final Flag<Boolean> DYNAMIC_LAYOUT_INSPECTOR_THROW_UNEXPECTED_ERROR = new BooleanFlag(
     LAYOUT_INSPECTOR, "dynamic.layout.inspector.enable.throw.unexpected.error", "Throw exception when encountering an unexpected error",
     "When this flag is enabled, LayoutInspector will throw an exception when an unexpected error is being logged to the metrics.",
     StudioPathManager.isRunningFromSources());
 
-  public static final Flag<Boolean> DYNAMIC_LAYOUT_INSPECTOR_IGNORE_RECOMPOSITIONS_IN_FRAMEWORK = Flag.create(
+  public static final Flag<Boolean> DYNAMIC_LAYOUT_INSPECTOR_IGNORE_RECOMPOSITIONS_IN_FRAMEWORK = new BooleanFlag(
     LAYOUT_INSPECTOR, "dynamic.layout.inspector.ignore.framework.recompositions", "Ignore recompositions in compose framework",
     "When this flag is enabled, LayoutInspector will disregard all recomposition counts for framework composables, " +
     "such that the user can concentrate on their own code.",
     true);
 
-  public static final Flag<String> DYNAMIC_LAYOUT_INSPECTOR_COMPOSE_UI_INSPECTION_DEVELOPMENT_FOLDER = Flag.create(
+  public static final Flag<String> DYNAMIC_LAYOUT_INSPECTOR_COMPOSE_UI_INSPECTION_DEVELOPMENT_FOLDER = new StringFlag(
     LAYOUT_INSPECTOR, "dev.jar.location", "Location of prebuilt compose app inspection jar for development",
     "If APP_INSPECTION_USE_DEV_JAR is enabled use this location to load the inspector jar in development.",
     "prebuilts/tools/common/app-inspection/androidx/compose/ui/"
   );
 
-  public static final Flag<String> DYNAMIC_LAYOUT_INSPECTOR_COMPOSE_UI_INSPECTION_RELEASE_FOLDER = Flag.create(
+  public static final Flag<String> DYNAMIC_LAYOUT_INSPECTOR_COMPOSE_UI_INSPECTION_RELEASE_FOLDER = new StringFlag(
     LAYOUT_INSPECTOR, "rel.jar.location", "Location of prebuilt compose app inspection jar for releases",
     "If APP_INSPECTION_USE_DEV_JAR is enabled use this location to load the inspector jar in releases.",
     ""
   );
 
-  public static final Flag<Boolean> DYNAMIC_LAYOUT_INSPECTOR_EXTRA_LOGGING = Flag.create(
+  public static final Flag<Boolean> DYNAMIC_LAYOUT_INSPECTOR_EXTRA_LOGGING = new BooleanFlag(
     LAYOUT_INSPECTOR, "dynamic.layout.inspector.extra.logging", "Add extra logging for problem detection",
     "When this flag is enabled, LayoutInspector will add extra logging for detection of various problems.",
     false);
@@ -1202,26 +1208,26 @@
     "If enabled, Compose Preview Essentials Mode will be enabled.",
     ChannelDefault.of(false).withOverride(true, DEV, NIGHTLY, CANARY));
 
-  public static final Flag<Boolean> COMPOSE_PREVIEW_SCROLL_ON_CARET_MOVE = Flag.create(
+  public static final Flag<Boolean> COMPOSE_PREVIEW_SCROLL_ON_CARET_MOVE = new BooleanFlag(
     COMPOSE, "preview.scroll.on.caret.move", "Enable the Compose Preview scrolling when the caret moves",
     "If enabled, when moving the caret in the text editor, the Preview will show the preview currently under the cursor.",
     false);
 
-  public static final Flag<Boolean> COMPOSE_DEPLOY_LIVE_EDIT_ADVANCED_SETTINGS_MENU = Flag.create(
+  public static final Flag<Boolean> COMPOSE_DEPLOY_LIVE_EDIT_ADVANCED_SETTINGS_MENU = new BooleanFlag(
     COMPOSE, "deploy.live.edit.deploy.advanced.settings",
     "Enable live edit deploy settings menu",
     "If enabled, advanced Live Edit settings menu will be visible",
     false
   );
 
-  public static final Flag<Boolean> COMPOSE_DEPLOY_LIVE_EDIT_CLASS_DIFFER = Flag.create(
+  public static final Flag<Boolean> COMPOSE_DEPLOY_LIVE_EDIT_CLASS_DIFFER = new BooleanFlag(
     COMPOSE, "deploy.live.edit.deploy.differ",
     "LiveEdit: Resolve changed classes and group IDs with the class differ.",
     "If enabled, the class differ will be used inside of the LE compiler",
     true
   );
 
-  public static final Flag<Boolean> COMPOSE_DEPLOY_LIVE_EDIT_CONFINED_ANALYSIS = Flag.create(
+  public static final Flag<Boolean> COMPOSE_DEPLOY_LIVE_EDIT_CONFINED_ANALYSIS = new BooleanFlag(
     COMPOSE, "deploy.live.edit.deploy.confined.analysis",
     "LiveEdit: Limit compilation error analysis to only the current file",
     "If enabled, Live Edit will aggressively live update even if there are analysis errors " +
@@ -1229,7 +1235,7 @@
     false
   );
 
-  public static final Flag<Boolean> COMPOSE_DEPLOY_LIVE_EDIT_R8_DESUGAR = Flag.create(
+  public static final Flag<Boolean> COMPOSE_DEPLOY_LIVE_EDIT_R8_DESUGAR = new BooleanFlag(
     COMPOSE, "deploy.live.edit.deploy.desugar.r8",
     "LiveEdit: Desugar kotlinc outputs with R8",
     "If enabled, the outputs of kotlinc are desugared before being sent to LiveEdit engine. This improves " +
@@ -1237,121 +1243,121 @@
     true
   );
 
-  public static final Flag<Boolean> COMPOSE_DEPLOY_LIVE_EDIT_ALLOW_MULTIPLE_MIN_API_DEX_MARKERS_IN_APK = Flag.create(
+  public static final Flag<Boolean> COMPOSE_DEPLOY_LIVE_EDIT_ALLOW_MULTIPLE_MIN_API_DEX_MARKERS_IN_APK = new BooleanFlag(
     COMPOSE, "deploy.live.edit.allow.multiple.min.api.dex.markers.in.apk",
     "LiveEdit: Allow multiple min api dex markers in apk",
     "If enabled, apk may contain multiple min api dex markers and LiveEdit picks the lowest among them",
    false
   );
 
-  public static final Flag<Boolean> COMPOSE_DEPLOY_LIVE_EDIT_BUILD_SYSTEM_MIN_SDK_VERSION_FOR_DEXING = Flag.create(
+  public static final Flag<Boolean> COMPOSE_DEPLOY_LIVE_EDIT_BUILD_SYSTEM_MIN_SDK_VERSION_FOR_DEXING = new BooleanFlag(
     COMPOSE, "deploy.live.edit.build.system.min.sdk.version.for.dexing",
     "LiveEdit: Use Min SDK for Dexing from the build system",
     "If enabled, Live Edit uses the Min SDK information from the build system. Otherwise, use the information from the DEX marker",
     false
   );
 
-  public static final Flag<Boolean> COMPOSE_DEBUG_BOUNDS = Flag.create(
+  public static final Flag<Boolean> COMPOSE_DEBUG_BOUNDS = new BooleanFlag(
     COMPOSE, "preview.debug.bounds",
     "Enable the debug bounds switch controls",
     "If enabled, the user can enable/disable the painting of debug bounds",
     false
   );
 
-  public static final Flag<Boolean> COMPOSE_PREVIEW_ELEMENT_PICKER = Flag.create(
+  public static final Flag<Boolean> COMPOSE_PREVIEW_ELEMENT_PICKER = new BooleanFlag(
     COMPOSE, "preview.element.picker.enable",
     "Enable @Preview picker",
     "If enabled, the picker for @Preview elements will be available",
     true
   );
 
-  public static final Flag<Boolean> COMPOSE_SPRING_PICKER = Flag.create(
+  public static final Flag<Boolean> COMPOSE_SPRING_PICKER = new BooleanFlag(
     COMPOSE, "preview.spring.picker",
     "Enable the SpringSpec picker",
     "If enabled, a picker will be available in SpringSpec calls on the Editor gutter",
     false
   );
 
-  public static final Flag<Boolean> COMPOSE_VIEW_INSPECTOR = Flag.create(
+  public static final Flag<Boolean> COMPOSE_VIEW_INSPECTOR = new BooleanFlag(
     COMPOSE, "view.inspector",
     "Show the switch of view inspection tool in Compose",
     "If enabled, the user can toggle the mouse inspection tool in the dropdown menu of Compose Preview. The tools is disabled by default",
     false
   );
 
-  public static final Flag<Boolean> COMPOSE_VIEW_FILTER = Flag.create(
+  public static final Flag<Boolean> COMPOSE_VIEW_FILTER = new BooleanFlag(
     COMPOSE, "view.filter",
     "Support filter the previews in Compose",
     "If enabled, the user can find the filter actions to filter the visible previews in compose preview",
     false
   );
 
-  public static final Flag<Boolean> COMPOSE_ZOOM_CONTROLS_DROPDOWN = Flag.create(
+  public static final Flag<Boolean> COMPOSE_ZOOM_CONTROLS_DROPDOWN = new BooleanFlag(
     COMPOSE, "preview.zoom.controls.dropdown",
     "Include Zoom Controls in the Compose Preview dropdown action",
     "If enabled, the zoom controls will also be displayed in the Compose Preview dropdown action, located on the top-left corner",
     false
   );
 
-  public static final Flag<Integer> COMPOSE_INTERACTIVE_FPS_LIMIT = Flag.create(
+  public static final Flag<Integer> COMPOSE_INTERACTIVE_FPS_LIMIT = new IntFlag(
     COMPOSE, "preview.interactive.fps.limit",
     "Interactive Preview FPS limit",
     "Controls the maximum number of frames per second in Compose Interactive Preview",
     30
   );
 
-  public static final Flag<Boolean> COMPOSE_ANIMATION_PREVIEW_COORDINATION_DRAG = Flag.create(
+  public static final Flag<Boolean> COMPOSE_ANIMATION_PREVIEW_COORDINATION_DRAG = new BooleanFlag(
     COMPOSE, "preview.animation.coordination.drag",
     "Enable animation dragging in timeline for Animation Inspector",
     "If enabled, animation dragging will be available in Animation Inspector timeline.",
     false
   );
 
-  public static final Flag<Boolean> COMPOSE_FAST_PREVIEW_DAEMON_DEBUG = Flag.create(
+  public static final Flag<Boolean> COMPOSE_FAST_PREVIEW_DAEMON_DEBUG = new BooleanFlag(
     COMPOSE, "preview.fast.reload.debug.daemon", "Starts the Live Edit daemon in debug mode",
     "If enabled, the compiler daemon will wait for a debugger to be attached.",
     false);
 
-  public static final Flag<Boolean> COMPOSE_PREVIEW_GROUP_LAYOUT = Flag.create(
+  public static final Flag<Boolean> COMPOSE_PREVIEW_GROUP_LAYOUT = new BooleanFlag(
     COMPOSE, "preview.group.layout", "Enable organization of Compose Preview in groups",
     "If enabled, multiple previews associated with composable will be grouped. Please invalidates file caches after " +
     "enabling or disabling (File -> Invalidate Caches...)", false);
 
-  public static final Flag<Boolean> COMPOSE_PROJECT_USES_COMPOSE_OVERRIDE = Flag.create(
+  public static final Flag<Boolean> COMPOSE_PROJECT_USES_COMPOSE_OVERRIDE = new BooleanFlag(
     COMPOSE, "project.uses.compose.override", "Forces the Compose project detection",
     "If enabled, the project will be treated as a Compose project, showing Previews if available and enhancing the Compose editing",
     false);
 
-  public static final Flag<Boolean> COMPOSE_FAST_PREVIEW_AUTO_DISABLE = Flag.create(
+  public static final Flag<Boolean> COMPOSE_FAST_PREVIEW_AUTO_DISABLE = new BooleanFlag(
     COMPOSE, "fast.preview.auto.disable", "If enabled, Fast Preview can auto-disable",
     "If enabled, if fast preview finds a compiler problem, it will be auto disable until the user re-enables it",
     false);
 
-  public static final Flag<Boolean> COMPOSE_ALLOCATION_LIMITER = Flag.create(
+  public static final Flag<Boolean> COMPOSE_ALLOCATION_LIMITER = new BooleanFlag(
     COMPOSE, "allocation.limiter", "If enabled, limits allocations per render",
     "If enabled, limits the number of allocations that user code can do in a single render action",
     true);
-  public static final Flag<Boolean> COMPOSE_PREVIEW_SELECTION = Flag.create(
+  public static final Flag<Boolean> COMPOSE_PREVIEW_SELECTION = new BooleanFlag(
     COMPOSE, "compose.preview.selection", "Enable the select/deselect interaction with Previews",
     "If enabled, Previews will be selectable, and some interactions will only be enabled for selected Previews",
     true);
 
-  public static final Flag<Boolean> COMPOSE_PREVIEW_RENDER_QUALITY = Flag.create(
+  public static final Flag<Boolean> COMPOSE_PREVIEW_RENDER_QUALITY = new BooleanFlag(
     COMPOSE, "compose.preview.render.quality", "Enable the usage of a render quality management mechanism for Compose Preview",
     "If enabled, different Previews will be rendered with different qualities according to zoom level, layout and scroll position",
     true);
 
-  public static final Flag<Long> COMPOSE_PREVIEW_RENDER_QUALITY_DEBOUNCE_TIME = Flag.create(
+  public static final Flag<Long> COMPOSE_PREVIEW_RENDER_QUALITY_DEBOUNCE_TIME = new LongFlag(
     COMPOSE, "compose.preview.render.quality.debounce.time", "Render quality debounce time",
     "Milliseconds to wait before adjusting the quality of Previews, after a scroll or zoom change happens",
     100L);
 
-  public static final Flag<Integer> COMPOSE_PREVIEW_RENDER_QUALITY_VISIBILITY_THRESHOLD = Flag.create(
+  public static final Flag<Integer> COMPOSE_PREVIEW_RENDER_QUALITY_VISIBILITY_THRESHOLD = new IntFlag(
     COMPOSE, "compose.preview.render.quality.visibility.threshold", "Render quality zoom visibility threshold",
     "When the zoom level is lower than this value, all previews will be rendered at low quality",
     20);
 
-  public static final Flag<Boolean> COMPOSE_PREVIEW_RENDER_QUALITY_NOTIFY_REFRESH_TIME = Flag.create(
+  public static final Flag<Boolean> COMPOSE_PREVIEW_RENDER_QUALITY_NOTIFY_REFRESH_TIME = new BooleanFlag(
     COMPOSE, "compose.preview.render.quality.notify.time", "Notify refresh time for render quality refreshes",
     "If enabled, the time taken in render quality refreshes will be notified each time",
     false);
@@ -1601,7 +1607,7 @@
       "crashlytics.2023h2.ui",
       "Crashlytics UI changes for J",
       "Enabled Logs & Keys, Multi-event",
-      false
+      true
     );
 
   public static final Flag<Boolean> PLAY_VITALS_ENABLED =
@@ -1788,6 +1794,18 @@
                     "When enabled, shows the 'AI Actions' item in the editor popup menu along with allowing individual actions to be enabled.",
                     ChannelDefault.of(false).withOverride(true, DEV));
 
+  public static final Flag<Boolean> STUDIOBOT_CUSTOM_TRANSFORM_ENABLED =
+    new BooleanFlag(STUDIOBOT, "editor.ai.custom.transform.enabled",
+                    "Enable the custom transform action in the editor.",
+                    "When enabled, the custom transform action, which allows users to send custom prompts to modify and iterate on code, is enabled.",
+                    ChannelDefault.of(false).withOverride(true, CANARY));
+
+  public static final Flag<Boolean> STUDIOBOT_USE_FACTS_FOR_CONTEXT =
+    new BooleanFlag(STUDIOBOT, "chat.use.facts.for.context",
+                    "Use retrieval augmentation facts to attach context to queries.",
+                    "When enabled, project context is attached to queries using facts, instead of prepending them directly to the query string.",
+                    ChannelDefault.of(false).withOverride(true, CANARY));
+
   // endregion STUDIO_BOT
 
   // region EXPERIMENTAL_UI
diff --git a/android-kotlin/idea-android/common/src/org/jetbrains/kotlin/android/quickfix/CreateResourceQuickFixUtils.kt b/android-kotlin/idea-android/common/src/org/jetbrains/kotlin/android/quickfix/CreateResourceQuickFixUtils.kt
index df86268..1dbe149 100644
--- a/android-kotlin/idea-android/common/src/org/jetbrains/kotlin/android/quickfix/CreateResourceQuickFixUtils.kt
+++ b/android-kotlin/idea-android/common/src/org/jetbrains/kotlin/android/quickfix/CreateResourceQuickFixUtils.kt
@@ -20,6 +20,7 @@
 import com.android.tools.idea.projectsystem.getModuleSystem
 import com.android.tools.idea.res.ALL_VALUE_RESOURCE_TYPES
 import com.android.tools.idea.res.getReferredResourceOrManifestField
+import com.android.tools.idea.util.androidFacet
 import com.intellij.codeInsight.intention.IntentionAction
 import com.intellij.openapi.module.ModuleUtil
 import org.jetbrains.android.facet.AndroidFacet
@@ -40,14 +41,15 @@
     if (info == null || info.isFromManifest) return emptyList()
 
     val resourceType = ResourceType.fromClassName(info.className) ?: return emptyList()
+    val facetForQuickFix = info.resolvedModule?.androidFacet ?: facet
 
     return buildList {
         if (resourceType in ALL_VALUE_RESOURCE_TYPES) {
-            add(CreateValueResourceQuickFix(facet, resourceType, info.fieldName, contextFile))
+            add(CreateValueResourceQuickFix(facetForQuickFix, resourceType, info.fieldName, contextFile))
         }
 
         FolderTypeRelationship.getNonValuesRelatedFolder(resourceType)?.let {
-            add(CreateFileResourceQuickFix(facet, it, info.fieldName, contextFile, true))
+            add(CreateFileResourceQuickFix(facetForQuickFix, it, info.fieldName, contextFile, true))
         }
     }
 }
\ No newline at end of file
diff --git a/android-npw/src/com/android/tools/idea/npw/NpwUiUtils.kt b/android-npw/src/com/android/tools/idea/npw/NpwUiUtils.kt
index 0122ad2..db6980d 100644
--- a/android-npw/src/com/android/tools/idea/npw/NpwUiUtils.kt
+++ b/android-npw/src/com/android/tools/idea/npw/NpwUiUtils.kt
@@ -16,7 +16,6 @@
 package com.android.tools.idea.npw
 
 import com.android.tools.idea.gradle.plugin.AndroidPluginInfo
-import com.android.tools.idea.wizard.template.Category
 import com.intellij.openapi.application.ApplicationManager
 import com.intellij.openapi.application.ModalityState
 import com.intellij.openapi.project.Project
@@ -40,10 +39,11 @@
 // TODO: parentej needs to be updated to 4.0.0 when released
 internal const val COMPOSE_MIN_AGP_VERSION = "4.0.0-alpha02"
 
-internal fun hasComposeMinAgpVersion(project: Project?, category: Category): Boolean {
-  if (project == null || Category.Compose != category) {
-    return true
-  }
+/**
+ * Checks if the project's AGP version is new enough to support Compose. If we can't determine it,
+ * assume that it is.
+ */
+internal fun hasComposeMinAgpVersion(project: Project): Boolean {
   val androidPluginInfo = AndroidPluginInfo.findFromModel(project) ?: return true
   val agpVersion = androidPluginInfo.pluginVersion ?: return true
   return agpVersion >= COMPOSE_MIN_AGP_VERSION
diff --git a/android-npw/src/com/android/tools/idea/npw/actions/NewAndroidComponentAction.kt b/android-npw/src/com/android/tools/idea/npw/actions/NewAndroidComponentAction.kt
index c42cb1f..4f6cec9 100644
--- a/android-npw/src/com/android/tools/idea/npw/actions/NewAndroidComponentAction.kt
+++ b/android-npw/src/com/android/tools/idea/npw/actions/NewAndroidComponentAction.kt
@@ -103,7 +103,7 @@
         presentation.text = AndroidBundle.message("android.wizard.action.requires.androidx", templateName)
         presentation.isEnabled = false
       }
-      !hasComposeMinAgpVersion(module.project, category) -> {
+      templateConstraints.contains(TemplateConstraint.Compose) && !hasComposeMinAgpVersion(module.project) -> {
         presentation.text = AndroidBundle.message("android.wizard.action.requires.new.agp", templateName, COMPOSE_MIN_AGP_VERSION)
         presentation.isEnabled = false
       }
diff --git a/android-npw/src/com/android/tools/idea/npw/model/NewAndroidModuleModel.kt b/android-npw/src/com/android/tools/idea/npw/model/NewAndroidModuleModel.kt
index 1b1a3b8..23a649e 100644
--- a/android-npw/src/com/android/tools/idea/npw/model/NewAndroidModuleModel.kt
+++ b/android-npw/src/com/android/tools/idea/npw/model/NewAndroidModuleModel.kt
@@ -18,7 +18,7 @@
 import com.android.SdkConstants.DOT_KTS
 import com.android.annotations.concurrency.WorkerThread
 import com.android.ide.common.repository.AgpVersion
-import com.android.tools.idea.gradle.npw.project.GradleAndroidModuleTemplate.createSampleTemplate
+import com.android.tools.idea.npw.project.GradleAndroidModuleTemplate.createSampleTemplate
 import com.android.tools.idea.gradle.plugin.AgpVersions
 import com.android.tools.idea.gradle.plugin.AndroidPluginInfo
 import com.android.tools.idea.gradle.util.GradleProjectSystemUtil
diff --git a/android-npw/src/com/android/tools/idea/npw/model/NewProjectModuleModel.kt b/android-npw/src/com/android/tools/idea/npw/model/NewProjectModuleModel.kt
index 74ff732..617c088 100644
--- a/android-npw/src/com/android/tools/idea/npw/model/NewProjectModuleModel.kt
+++ b/android-npw/src/com/android/tools/idea/npw/model/NewProjectModuleModel.kt
@@ -16,8 +16,8 @@
 package com.android.tools.idea.npw.model
 
 import com.android.SdkConstants
-import com.android.tools.idea.gradle.npw.project.GradleAndroidModuleTemplate.createDefaultTemplateAt
-import com.android.tools.idea.gradle.npw.project.GradleAndroidModuleTemplate.createSampleTemplate
+import com.android.tools.idea.npw.project.GradleAndroidModuleTemplate.createDefaultTemplateAt
+import com.android.tools.idea.npw.project.GradleAndroidModuleTemplate.createSampleTemplate
 import com.android.tools.idea.npw.platform.AndroidVersionsInfo
 import com.android.tools.idea.npw.template.TemplateResolver
 import com.android.tools.idea.observable.core.BoolValueProperty
diff --git a/android-npw/src/com/android/tools/idea/npw/model/RenderTemplateModel.kt b/android-npw/src/com/android/tools/idea/npw/model/RenderTemplateModel.kt
index aeb018d..ba24904 100644
--- a/android-npw/src/com/android/tools/idea/npw/model/RenderTemplateModel.kt
+++ b/android-npw/src/com/android/tools/idea/npw/model/RenderTemplateModel.kt
@@ -147,6 +147,7 @@
           paths, projectLocation.get(), moduleName.get(), this@RenderTemplateModel.packageName.get()
         )
         category = newTemplate.category
+        isCompose = newTemplate.constraints.contains(TemplateConstraint.Compose)
         isMaterial3 = newTemplate.constraints.contains(TemplateConstraint.Material3)
         useGenericInstrumentedTests = newTemplate.useGenericInstrumentedTests
         useGenericLocalTests = newTemplate.useGenericLocalTests
diff --git a/android-npw/src/com/android/tools/idea/npw/module/ConfigureModuleStep.kt b/android-npw/src/com/android/tools/idea/npw/module/ConfigureModuleStep.kt
index 19d299b..b7cc294 100644
--- a/android-npw/src/com/android/tools/idea/npw/module/ConfigureModuleStep.kt
+++ b/android-npw/src/com/android/tools/idea/npw/module/ConfigureModuleStep.kt
@@ -29,7 +29,7 @@
 import com.android.tools.idea.concurrency.AndroidCoroutineScope
 import com.android.tools.idea.concurrency.AndroidDispatchers
 import com.android.tools.idea.flags.StudioFlags
-import com.android.tools.idea.gradle.npw.project.GradleAndroidModuleTemplate
+import com.android.tools.idea.npw.project.GradleAndroidModuleTemplate
 import com.android.tools.idea.npw.model.NewProjectModel.Companion.getSuggestedProjectPackage
 import com.android.tools.idea.npw.model.NewProjectModel.Companion.nameToJavaPackage
 import com.android.tools.idea.npw.model.ProjectModelData
@@ -46,7 +46,6 @@
 import com.android.tools.idea.observable.ListenerManager
 import com.android.tools.idea.observable.core.BoolProperty
 import com.android.tools.idea.observable.core.BoolValueProperty
-import com.android.tools.idea.observable.core.ObjectValueProperty
 import com.android.tools.idea.observable.core.ObservableBool
 import com.android.tools.idea.observable.core.OptionalValueProperty
 import com.android.tools.idea.observable.expressions.Expression
diff --git a/android-npw/src/com/android/tools/idea/npw/module/ModuleModel.kt b/android-npw/src/com/android/tools/idea/npw/module/ModuleModel.kt
index b8b720a..7836181 100644
--- a/android-npw/src/com/android/tools/idea/npw/module/ModuleModel.kt
+++ b/android-npw/src/com/android/tools/idea/npw/module/ModuleModel.kt
@@ -19,9 +19,9 @@
 import com.android.annotations.concurrency.UiThread
 import com.android.annotations.concurrency.WorkerThread
 import com.android.tools.idea.flags.StudioFlags
-import com.android.tools.idea.gradle.npw.project.GradleAndroidModuleTemplate.createDefaultModuleTemplate
-import com.android.tools.idea.gradle.npw.project.GradleAndroidModuleTemplate.createSampleTemplate
-import com.android.tools.idea.gradle.npw.project.GradleAndroidModuleTemplate.getModuleRootForNewModule
+import com.android.tools.idea.npw.project.GradleAndroidModuleTemplate.createDefaultModuleTemplate
+import com.android.tools.idea.npw.project.GradleAndroidModuleTemplate.createSampleTemplate
+import com.android.tools.idea.npw.project.GradleAndroidModuleTemplate.getModuleRootForNewModule
 import com.android.tools.idea.npw.model.ModuleModelData
 import com.android.tools.idea.npw.model.MultiTemplateRenderer
 import com.android.tools.idea.npw.model.NewAndroidModuleModel
diff --git a/android-npw/src/com/android/tools/idea/npw/module/recipes/androidModule/androidModuleRecipe.kt b/android-npw/src/com/android/tools/idea/npw/module/recipes/androidModule/androidModuleRecipe.kt
index e87912c..0506de7 100644
--- a/android-npw/src/com/android/tools/idea/npw/module/recipes/androidModule/androidModuleRecipe.kt
+++ b/android-npw/src/com/android/tools/idea/npw/module/recipes/androidModule/androidModuleRecipe.kt
@@ -43,6 +43,7 @@
   val useAndroidX = data.projectTemplateData.androidXSupport
   val addBackupRules = data.projectTemplateData.isNewProject && data.apis.targetApi.api >= 31
   val isMaterial3 = data.isMaterial3
+  check(data.category != Category.Compose || data.isCompose) { "Template in Compose category must have isCompose set" }
   generateCommonModule(
     data = data,
     appTitle = appTitle,
@@ -62,7 +63,7 @@
       androidModuleThemesNightMaterial3(data.themesData.main.name)
     else
       androidModuleThemesNight(useAndroidX, data.apis.minApi, data.themesData.main.name),
-    colorsXml = if (isMaterial3 && data.category != Category.Compose) androidModuleColorsMaterial3() else androidModuleColors(),
+    colorsXml = if (isMaterial3 && !data.isCompose) androidModuleColorsMaterial3() else androidModuleColors(),
     enableCpp = enableCpp,
     cppStandard = cppStandard,
     bytecodeLevel = bytecodeLevel,
@@ -70,11 +71,11 @@
   )
   val projectData = data.projectTemplateData
   val formFactorNames = projectData.includedFormFactorNames
-  if (data.category != Category.Compose) {
+  if (!data.isCompose) {
     addDependency("com.android.support:appcompat-v7:${data.apis.appCompatVersion}.+")
   }
 
-  if (data.projectTemplateData.androidXSupport && data.category != Category.Compose && !isMaterial3) {
+  if (data.projectTemplateData.androidXSupport && !data.isCompose && !isMaterial3) {
     // Though addDependency should not be called from a module recipe, adding this library because it's used for the default theme
     // (Theme.MaterialComponents.DayNight)
     addDependency("com.google.android.material:material:+")
diff --git a/android-npw/src/com/android/tools/idea/npw/module/recipes/baselineProfilesModule/buildGradle.kt b/android-npw/src/com/android/tools/idea/npw/module/recipes/baselineProfilesModule/buildGradle.kt
index b77289f..cf78a97 100644
--- a/android-npw/src/com/android/tools/idea/npw/module/recipes/baselineProfilesModule/buildGradle.kt
+++ b/android-npw/src/com/android/tools/idea/npw/module/recipes/baselineProfilesModule/buildGradle.kt
@@ -77,15 +77,18 @@
       "${useGmd.identifier}(ManagedVirtualDevice)"
     }
 
-    """
-    testOptions.managedDevices.devices {
-        $createGMD {
-            device = "${useGmd.deviceName}"
-            apiLevel = ${useGmd.apiLevel}
-            systemImageSource = "${useGmd.systemImageSource}"
-        }
+    buildString {
+      appendLine("    // This code creates the gradle managed device used to generate baseline profiles.")
+      appendLine("    // To use GMD please invoke generation through the command line:")
+      appendLine("    // ./gradlew $targetModuleGradlePath:generateBaselineProfile")
+      appendLine("    testOptions.managedDevices.devices {")
+      appendLine("        $createGMD {")
+      appendLine("            device = \"${useGmd.deviceName}\"")
+      appendLine("            apiLevel = ${useGmd.apiLevel}")
+      appendLine("            systemImageSource = \"${useGmd.systemImageSource}\"")
+      appendLine("        }")
+      appendLine("    }")
     }
-    """.trimIndent()
   }
 
   val pluginConfiguration = buildString {
diff --git a/android-npw/src/com/android/tools/idea/npw/module/recipes/commonModuleRecipe.kt b/android-npw/src/com/android/tools/idea/npw/module/recipes/commonModuleRecipe.kt
index 626e4f9..0b67495 100644
--- a/android-npw/src/com/android/tools/idea/npw/module/recipes/commonModuleRecipe.kt
+++ b/android-npw/src/com/android/tools/idea/npw/module/recipes/commonModuleRecipe.kt
@@ -120,7 +120,7 @@
     with(resOut.resolve(SdkConstants.FD_RES_VALUES)) {
       save(androidModuleStrings(appTitle!!), resolve("strings.xml"))
       // Common themes.xml isn't needed for Compose because theme is created in Composable.
-      if (themesXml != null && data.category != Category.Compose) {
+      if (themesXml != null && !data.isCompose) {
         save(themesXml, resolve("themes.xml"))
       }
       if (colorsXml != null) {
@@ -129,7 +129,7 @@
     }
     themesXmlNight?.let {
       // Common themes.xml isn't needed for Compose because theme is created in Composable.
-      if (data.category != Category.Compose) {
+      if (!data.isCompose) {
         save(it, resOut.resolve(SdkConstants.FD_RES_VALUES_NIGHT).resolve("themes.xml"))
       }
     }
diff --git a/android-npw/src/com/android/tools/idea/npw/project/AndroidGradleModuleUtils.kt b/android-npw/src/com/android/tools/idea/npw/project/AndroidGradleModuleUtils.kt
index 18cc139..2e0d8cf 100644
--- a/android-npw/src/com/android/tools/idea/npw/project/AndroidGradleModuleUtils.kt
+++ b/android-npw/src/com/android/tools/idea/npw/project/AndroidGradleModuleUtils.kt
@@ -34,7 +34,6 @@
 import com.intellij.openapi.util.SystemInfo
 import com.intellij.openapi.util.io.FileUtil
 import com.intellij.openapi.vfs.VfsUtil
-import org.jetbrains.kotlin.idea.compiler.configuration.KotlinPluginLayout
 import java.io.File
 import java.io.IOException
 
@@ -79,8 +78,8 @@
 /** Find the most appropriate Kotlin plugin version for the specified project. */
 @Slow
 fun determineKotlinVersion(project: Project, isNewProject: Boolean): String {
-  // See IdeaKotlinVersionProviderService.getKotlinVersionFromCompiler().
-  val defaultKotlinVersion = KotlinPluginLayout.standaloneCompilerVersion.artifactVersion
+  // TODO(b/322863175): Establish process/tests to ensure the default version gets updated.
+  val defaultKotlinVersion = "1.9.0"
   if (isNewProject) return defaultKotlinVersion
 
   val versionInUse = project.basePath?.let { GradleProjectSystemUtil.getKotlinVersionInUse(project, it) }
diff --git a/android-npw/src/com/android/tools/idea/npw/project/ConfigureAndroidProjectStep.java b/android-npw/src/com/android/tools/idea/npw/project/ConfigureAndroidProjectStep.java
index ed456be..ff139e8 100644
--- a/android-npw/src/com/android/tools/idea/npw/project/ConfigureAndroidProjectStep.java
+++ b/android-npw/src/com/android/tools/idea/npw/project/ConfigureAndroidProjectStep.java
@@ -337,7 +337,7 @@
 
   private static boolean hasValidSdkComposeVersion(VersionItem skdItem, @Nullable Template renderTemplate) {
     return renderTemplate == null ||
-           renderTemplate.getCategory() != Category.Compose ||
+           !renderTemplate.getConstraints().contains(TemplateConstraint.Compose) ||
            skdItem.getTargetApiLevel() >= AndroidVersion.VersionCodes.S;
   }
 
diff --git a/android/src/com/android/tools/idea/gradle/npw/project/GradleAndroidModuleTemplate.java b/android-npw/src/com/android/tools/idea/npw/project/GradleAndroidModuleTemplate.java
similarity index 98%
rename from android/src/com/android/tools/idea/gradle/npw/project/GradleAndroidModuleTemplate.java
rename to android-npw/src/com/android/tools/idea/npw/project/GradleAndroidModuleTemplate.java
index 59f2220..7a87e0d 100644
--- a/android/src/com/android/tools/idea/gradle/npw/project/GradleAndroidModuleTemplate.java
+++ b/android-npw/src/com/android/tools/idea/npw/project/GradleAndroidModuleTemplate.java
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.android.tools.idea.gradle.npw.project;
+package com.android.tools.idea.npw.project;
 
 import static com.android.SdkConstants.FD_AIDL;
 import static com.android.SdkConstants.FD_JAVA;
diff --git a/android-npw/src/com/android/tools/idea/npw/template/ChooseGalleryItemStep.kt b/android-npw/src/com/android/tools/idea/npw/template/ChooseGalleryItemStep.kt
index b2c75ef..e65bc9c 100644
--- a/android-npw/src/com/android/tools/idea/npw/template/ChooseGalleryItemStep.kt
+++ b/android-npw/src/com/android/tools/idea/npw/template/ChooseGalleryItemStep.kt
@@ -147,7 +147,9 @@
       renderModel.newTemplate.validate(moduleApiLevel, isNewModule, isAndroidxProject, renderModel.language.value, messageKeys)
     )
 
-    if (invalidParameterMessage.get() == "" && !hasComposeMinAgpVersion(project, renderModel.newTemplate.category)) {
+    if (invalidParameterMessage.get() == "" &&
+        renderModel.newTemplate.constraints.contains(TemplateConstraint.Compose) &&
+        !hasComposeMinAgpVersion(project)) {
       invalidParameterMessage.set(message("android.wizard.validate.module.needs.new.agp", COMPOSE_MIN_AGP_VERSION))
     }
   }
diff --git a/android-npw/src/com/android/tools/idea/npw/template/ModuleTemplateDataBuilder.kt b/android-npw/src/com/android/tools/idea/npw/template/ModuleTemplateDataBuilder.kt
index ae49523..0ac2055 100644
--- a/android-npw/src/com/android/tools/idea/npw/template/ModuleTemplateDataBuilder.kt
+++ b/android-npw/src/com/android/tools/idea/npw/template/ModuleTemplateDataBuilder.kt
@@ -18,12 +18,11 @@
 import com.android.AndroidProjectTypes.PROJECT_TYPE_DYNAMIC_FEATURE
 import com.android.SdkConstants.FD_TEST
 import com.android.SdkConstants.FD_UNIT_TEST
-import com.android.ide.common.repository.AgpVersion
 import com.android.sdklib.AndroidVersion.VersionCodes.P
 import com.android.sdklib.SdkVersionInfo.HIGHEST_KNOWN_STABLE_API
 import com.android.sdklib.SdkVersionInfo.LOWEST_ACTIVE_API
 import com.android.tools.idea.configurations.ConfigurationManager
-import com.android.tools.idea.gradle.npw.project.GradleAndroidModuleTemplate
+import com.android.tools.idea.npw.project.GradleAndroidModuleTemplate
 import com.android.tools.idea.gradle.plugin.AgpVersions
 import com.android.tools.idea.gradle.util.DynamicAppUtils
 import com.android.tools.idea.gradle.util.GradleProjectSystemUtil
@@ -84,6 +83,7 @@
   var baseFeature: BaseFeature? = null
   var apis: ApiTemplateData? = null
   var category: Category? = null
+  var isCompose: Boolean = false
   var isMaterial3: Boolean = false
   var useGenericLocalTests: Boolean = true
   var useGenericInstrumentedTests: Boolean = true
@@ -217,29 +217,33 @@
     }
   }
 
-  fun build() = ModuleTemplateData(
-    projectTemplateDataBuilder.build(),
-    srcDir!!,
-    resDir!!,
-    manifestDir!!,
-    testDir ?: srcDir!!.resolve(FD_TEST),
-    unitTestDir ?: srcDir!!.resolve(FD_UNIT_TEST),
-    aidlDir,
-    rootDir!!,
-    isNewModule,
-    name!!,
-    isLibrary!!,
-    packageName!!,
-    formFactor!!,
-    themesData ?: ThemesData(appName = getAppNameForTheme(projectTemplateDataBuilder.applicationName!!)),
-    baseFeature,
-    apis!!,
-    viewBindingSupport = viewBindingSupport,
-    category!!,
-    isMaterial3,
-    useGenericLocalTests = useGenericLocalTests,
-    useGenericInstrumentedTests = useGenericInstrumentedTests
-  )
+  fun build(): ModuleTemplateData {
+    check(category != Category.Compose || isCompose) { "Template in Compose category must have isCompose set" }
+    return ModuleTemplateData(
+      projectTemplateDataBuilder.build(),
+      srcDir!!,
+      resDir!!,
+      manifestDir!!,
+      testDir ?: srcDir!!.resolve(FD_TEST),
+      unitTestDir ?: srcDir!!.resolve(FD_UNIT_TEST),
+      aidlDir,
+      rootDir!!,
+      isNewModule,
+      name!!,
+      isLibrary!!,
+      packageName!!,
+      formFactor!!,
+      themesData ?: ThemesData(appName = getAppNameForTheme(projectTemplateDataBuilder.applicationName!!)),
+      baseFeature,
+      apis!!,
+      viewBindingSupport = viewBindingSupport,
+      category!!,
+      isCompose,
+      isMaterial3,
+      useGenericLocalTests = useGenericLocalTests,
+      useGenericInstrumentedTests = useGenericInstrumentedTests
+    )
+  }
 }
 
 fun getExistingModuleTemplateDataBuilder(module: Module): ModuleTemplateDataBuilder {
diff --git a/android-npw/src/com/android/tools/idea/npw/validator/ModuleValidator.kt b/android-npw/src/com/android/tools/idea/npw/validator/ModuleValidator.kt
index 64fb6f5..19521dd 100644
--- a/android-npw/src/com/android/tools/idea/npw/validator/ModuleValidator.kt
+++ b/android-npw/src/com/android/tools/idea/npw/validator/ModuleValidator.kt
@@ -18,7 +18,7 @@
 import com.android.tools.adtui.validation.Validator
 import com.android.tools.adtui.validation.Validator.Result
 import com.android.tools.adtui.validation.Validator.Severity
-import com.android.tools.idea.gradle.npw.project.GradleAndroidModuleTemplate.getModuleRootForNewModule
+import com.android.tools.idea.npw.project.GradleAndroidModuleTemplate.getModuleRootForNewModule
 import com.android.tools.idea.projectsystem.gradle.GradleHolderProjectPath
 import com.android.tools.idea.projectsystem.gradle.resolveIn
 import com.android.tools.idea.ui.validation.validators.PathValidator
diff --git a/android-npw/testSrc/com/android/tools/idea/npw/GradleModuleTemplateTest.java b/android-npw/testSrc/com/android/tools/idea/npw/GradleModuleTemplateTest.java
index 1542152..26cbea2 100644
--- a/android-npw/testSrc/com/android/tools/idea/npw/GradleModuleTemplateTest.java
+++ b/android-npw/testSrc/com/android/tools/idea/npw/GradleModuleTemplateTest.java
@@ -15,7 +15,7 @@
  */
 package com.android.tools.idea.npw;
 
-import static com.android.tools.idea.gradle.npw.project.GradleAndroidModuleTemplate.createDefaultTemplateAt;
+import static com.android.tools.idea.npw.project.GradleAndroidModuleTemplate.createDefaultTemplateAt;
 import static org.junit.Assert.assertEquals;
 
 import com.android.tools.idea.projectsystem.AndroidModulePaths;
diff --git a/android-npw/testSrc/com/android/tools/idea/npw/module/AddBaselineProfilesModuleTest.kt b/android-npw/testSrc/com/android/tools/idea/npw/module/AddBaselineProfilesModuleTest.kt
index 2f320ee..3c7faa0 100644
--- a/android-npw/testSrc/com/android/tools/idea/npw/module/AddBaselineProfilesModuleTest.kt
+++ b/android-npw/testSrc/com/android/tools/idea/npw/module/AddBaselineProfilesModuleTest.kt
@@ -47,7 +47,6 @@
 import kotlin.test.assertNull
 import kotlin.test.assertTrue
 
-@Ignore("TODO: http://b/315835415 AGP 8.4 is not supported")
 @RunWith(Parameterized::class)
 class AddBaselineProfilesModuleTest(
   private val useGradleKtsParam: Boolean,
diff --git a/android-npw/testSrc/com/android/tools/idea/npw/module/AddNewModulesToAppTest.kt b/android-npw/testSrc/com/android/tools/idea/npw/module/AddNewModulesToAppTest.kt
index ec7212f..ebdb814 100644
--- a/android-npw/testSrc/com/android/tools/idea/npw/module/AddNewModulesToAppTest.kt
+++ b/android-npw/testSrc/com/android/tools/idea/npw/module/AddNewModulesToAppTest.kt
@@ -17,7 +17,7 @@
 
 
 import com.android.sdklib.SdkVersionInfo.HIGHEST_KNOWN_STABLE_API
-import com.android.tools.idea.gradle.npw.project.GradleAndroidModuleTemplate.createDefaultModuleTemplate
+import com.android.tools.idea.npw.project.GradleAndroidModuleTemplate.createDefaultModuleTemplate
 import com.android.tools.idea.npw.dynamicapp.DynamicFeatureModel
 import com.android.tools.idea.npw.model.NewAndroidModuleModel
 import com.android.tools.idea.npw.model.ProjectSyncInvoker
diff --git a/android-npw/testSrc/com/android/tools/idea/npw/module/GenerateBaselineProfileModuleTest.kt b/android-npw/testSrc/com/android/tools/idea/npw/module/GenerateBaselineProfileModuleTest.kt
index c99c64d..45de5de 100644
--- a/android-npw/testSrc/com/android/tools/idea/npw/module/GenerateBaselineProfileModuleTest.kt
+++ b/android-npw/testSrc/com/android/tools/idea/npw/module/GenerateBaselineProfileModuleTest.kt
@@ -206,6 +206,7 @@
       viewBindingSupport = ViewBindingSupport.NOT_SUPPORTED,
       category = Category.Application,
       isMaterial3 = true,
+      isCompose = false,
       useGenericLocalTests = true,
       useGenericInstrumentedTests = true,
     )
@@ -296,14 +297,17 @@
 
     targetProjectPath = ":app"
 
+    // This code creates the gradle managed device used to generate baseline profiles.
+    // To use GMD please invoke generation through the command line:
+    // ./gradlew :app:generateBaselineProfile
     testOptions.managedDevices.devices {
-    create<ManagedVirtualDevice>("pixel6Api34") {
-        device = "Pixel 6"
-        apiLevel = 34
-        systemImageSource = "google"
+        create<ManagedVirtualDevice>("pixel6Api34") {
+            device = "Pixel 6"
+            apiLevel = 34
+            systemImageSource = "google"
+        }
     }
 }
-}
 
 // This is the configuration block for the Baseline Profile plugin.
 // You can specify to run the generators on a managed devices or connected devices.
@@ -706,14 +710,17 @@
 
     targetProjectPath = ":app"
 
+    // This code creates the gradle managed device used to generate baseline profiles.
+    // To use GMD please invoke generation through the command line:
+    // ./gradlew :app:generateBaselineProfile
     testOptions.managedDevices.devices {
-    create<ManagedVirtualDevice>("pixel6Api34") {
-        device = "Pixel 6"
-        apiLevel = 34
-        systemImageSource = "google"
+        create<ManagedVirtualDevice>("pixel6Api34") {
+            device = "Pixel 6"
+            apiLevel = 34
+            systemImageSource = "google"
+        }
     }
 }
-}
 
 // This is the configuration block for the Baseline Profile plugin.
 // You can specify to run the generators on a managed devices or connected devices.
diff --git a/android-npw/testSrc/com/android/tools/idea/npw/project/AndroidLibraryTest.java b/android-npw/testSrc/com/android/tools/idea/npw/project/AndroidLibraryTest.java
index d7b303a..49a4f18 100644
--- a/android-npw/testSrc/com/android/tools/idea/npw/project/AndroidLibraryTest.java
+++ b/android-npw/testSrc/com/android/tools/idea/npw/project/AndroidLibraryTest.java
@@ -24,7 +24,6 @@
 import static com.google.common.truth.Truth.assertThat;
 import static com.google.wireless.android.sdk.stats.AndroidStudioEvent.TemplatesUsage.TemplateComponent.WizardUiContext.NEW_MODULE;
 
-import com.android.tools.idea.gradle.npw.project.GradleAndroidModuleTemplate;
 import com.android.tools.idea.gradle.project.sync.snapshots.AndroidCoreTestProject;
 import com.android.tools.idea.npw.model.ProjectSyncInvoker;
 import com.android.tools.idea.npw.model.RenderTemplateModel;
diff --git a/android-templates/src/com/android/tools/idea/templates/recipe/DefaultRecipeExecutor.kt b/android-templates/src/com/android/tools/idea/templates/recipe/DefaultRecipeExecutor.kt
index 52fcc5b..8ac578d 100644
--- a/android-templates/src/com/android/tools/idea/templates/recipe/DefaultRecipeExecutor.kt
+++ b/android-templates/src/com/android/tools/idea/templates/recipe/DefaultRecipeExecutor.kt
@@ -140,6 +140,12 @@
     applyPlugin(plugin, revision.toString(), null)
   }
 
+  override fun addPlugin(plugin: String, classpath: String) {
+    referencesExecutor.addPlugin(plugin, classpath)
+    val buildModel = moduleGradleBuildModel ?: return
+
+    applyPluginToProjectAndModule(plugin, classpath, buildModel)
+  }
 
   override fun applyPluginInModule(plugin: String, module: Module, revision: String?, minRev: String?) {
     referencesExecutor.applyPluginInModule(plugin, module, revision, minRev)
@@ -152,6 +158,12 @@
     applyPluginInModule(plugin, module, revision.toString(), null)
   }
 
+  private fun applyPluginToProjectAndModule(plugin: String, classpath: String, buildModel: GradleBuildModel) {
+    val projectModel = projectBuildModel ?: return
+    val dependenciesHelper = DependenciesHelper.withModel(projectModel)
+    dependenciesHelper.addPlugin(plugin, classpath, buildModel)
+  }
+
   private fun applyPluginInBuildModel(plugin: String, buildModel: GradleBuildModel, revision: String?, minRev: String?) {
     val projectModel = projectBuildModel ?: return
     val dependenciesHelper = DependenciesHelper.withModel(projectModel)
@@ -225,16 +237,18 @@
     val baseFeature = context.moduleTemplateData?.baseFeature
 
     val buildModel = when {
-      moduleDir != null -> {
-        projectBuildModel?.getModuleBuildModel(moduleDir)
-      }
-      baseFeature == null || !toBase -> {
-        moduleGradleBuildModel
-      }
-      else -> {
-        projectBuildModel?.getModuleBuildModel(baseFeature.dir)
-      }
-    } ?: return
+                       moduleDir != null -> {
+                         projectBuildModel?.getModuleBuildModel(moduleDir)
+                       }
+
+                       baseFeature == null || !toBase -> {
+                         moduleGradleBuildModel
+                       }
+
+                       else -> {
+                         projectBuildModel?.getModuleBuildModel(baseFeature.dir)
+                       }
+                     } ?: return
 
     val resolvedMavenCoordinate =
       when {
@@ -247,8 +261,9 @@
     // If a Library (e.g. Google Maps) Manifest references its own resources, it needs to be added to the Base, otherwise aapt2 will fail
     // during linking. Since we don't know the libraries Manifest references, we declare this libraries in the base as "api" dependencies.
     val resolvedConfiguration = if (baseFeature != null && toBase && configuration == GRADLE_IMPLEMENTATION_CONFIGURATION) {
-        GRADLE_API_CONFIGURATION
-    } else configuration
+      GRADLE_API_CONFIGURATION
+    }
+    else configuration
 
     projectBuildModel?.let {
       DependenciesHelper.withModel(it).addDependency(resolvedConfiguration,
@@ -301,6 +316,7 @@
       target.exists() -> if (!sourceFile.contentEquals(target)) {
         addFileAlreadyExistWarning(target)
       }
+
       else -> {
         val document = FileDocumentManager.getInstance().getDocument(sourceFile)
         if (document != null) {
@@ -394,7 +410,7 @@
     return property.valueAsString() ?: valueIfNotFound
   }
 
-  override fun getClasspathDependencyVarName(mavenCoordinate: String, valueIfNotFound: String) : String {
+  override fun getClasspathDependencyVarName(mavenCoordinate: String, valueIfNotFound: String): String {
     val mavenDependency = ArtifactDependencySpec.create(mavenCoordinate)
     check(mavenDependency != null) { "$mavenCoordinate is not a valid classpath dependency" }
 
@@ -411,7 +427,7 @@
     return valueIfNotFound
   }
 
-  override fun getDependencyVarName(mavenCoordinate: String, valueIfNotFound: String) : String {
+  override fun getDependencyVarName(mavenCoordinate: String, valueIfNotFound: String): String {
     val mavenDependency = ArtifactDependencySpec.create(mavenCoordinate)
     check(mavenDependency != null) { "$mavenCoordinate is not a valid dependency" }
 
diff --git a/android-templates/src/com/android/tools/idea/templates/recipe/FindReferencesRecipeExecutor.kt b/android-templates/src/com/android/tools/idea/templates/recipe/FindReferencesRecipeExecutor.kt
index 0609539..2315c77 100644
--- a/android-templates/src/com/android/tools/idea/templates/recipe/FindReferencesRecipeExecutor.kt
+++ b/android-templates/src/com/android/tools/idea/templates/recipe/FindReferencesRecipeExecutor.kt
@@ -66,6 +66,11 @@
     context.plugins.add(plugin)
   }
 
+  override fun addPlugin(plugin: String, classpath: String) {
+    context.plugins.add(plugin)
+    context.classpathEntries.add(classpath)
+  }
+
   override fun applyPluginInModule(plugin: String, module: Module, revision: String?, minRev: String?) {
     context.plugins.add(plugin)
   }
diff --git a/android-templates/testSrc/com/android/tools/idea/templates/FolderTemplatesTest.kt b/android-templates/testSrc/com/android/tools/idea/templates/FolderTemplatesTest.kt
index 343821d..33e76b7 100644
--- a/android-templates/testSrc/com/android/tools/idea/templates/FolderTemplatesTest.kt
+++ b/android-templates/testSrc/com/android/tools/idea/templates/FolderTemplatesTest.kt
@@ -15,7 +15,7 @@
  */
 package com.android.tools.idea.templates
 
-import com.android.tools.idea.gradle.npw.project.GradleAndroidModuleTemplate
+import com.android.tools.idea.npw.project.GradleAndroidModuleTemplate
 import com.android.tools.idea.npw.model.render
 import com.android.tools.idea.npw.template.TemplateResolver
 import com.android.tools.idea.templates.recipe.DefaultRecipeExecutor
diff --git a/android-templates/testSrc/com/android/tools/idea/templates/KotlinBomPlatformDependencyTest.kt b/android-templates/testSrc/com/android/tools/idea/templates/KotlinBomPlatformDependencyTest.kt
index 45bdc4c..0ace03c 100644
--- a/android-templates/testSrc/com/android/tools/idea/templates/KotlinBomPlatformDependencyTest.kt
+++ b/android-templates/testSrc/com/android/tools/idea/templates/KotlinBomPlatformDependencyTest.kt
@@ -17,7 +17,7 @@
 
 import com.android.sdklib.SdkVersionInfo
 import com.android.testutils.MockitoKt
-import com.android.tools.idea.gradle.npw.project.GradleAndroidModuleTemplate
+import com.android.tools.idea.npw.project.GradleAndroidModuleTemplate
 import com.android.tools.idea.gradle.plugin.AgpVersions
 import com.android.tools.idea.lint.common.getModuleDir
 import com.android.tools.idea.npw.model.NewAndroidModuleModel
@@ -27,7 +27,6 @@
 import com.android.tools.idea.npw.template.ProjectTemplateDataBuilder
 import com.android.tools.idea.templates.recipe.DefaultRecipeExecutor
 import com.android.tools.idea.templates.recipe.RenderingContext
-import com.android.tools.idea.testing.AgpVersionSoftwareEnvironmentDescriptor
 import com.android.tools.idea.testing.AgpVersionSoftwareEnvironmentDescriptor.Companion.AGP_CURRENT
 import com.android.tools.idea.testing.AndroidGradleProjectRule
 import com.android.tools.idea.testing.TestProjectPaths
diff --git a/android-templates/testSrc/com/android/tools/idea/templates/TemplateTestUtils.kt b/android-templates/testSrc/com/android/tools/idea/templates/TemplateTestUtils.kt
index 9fef0cb..640059c 100644
--- a/android-templates/testSrc/com/android/tools/idea/templates/TemplateTestUtils.kt
+++ b/android-templates/testSrc/com/android/tools/idea/templates/TemplateTestUtils.kt
@@ -20,7 +20,7 @@
 
 import com.android.sdklib.AndroidVersion
 import com.android.sdklib.SdkVersionInfo
-import com.android.tools.idea.gradle.npw.project.GradleAndroidModuleTemplate.createDefaultModuleTemplate
+import com.android.tools.idea.npw.project.GradleAndroidModuleTemplate.createDefaultModuleTemplate
 import com.android.tools.idea.gradle.plugin.AgpVersions
 import com.android.tools.idea.npw.template.ModuleTemplateDataBuilder
 import com.android.tools.idea.npw.template.ProjectTemplateDataBuilder
@@ -92,6 +92,7 @@
       isLibrary = false
       formFactor = template.formFactor
       category = template.category
+      isCompose = template.constraints.contains(TemplateConstraint.Compose)
       isMaterial3 = template.constraints.contains(TemplateConstraint.Material3)
       themesData = ThemesData("App")
       apis =
diff --git a/android-templates/testSrc/com/android/tools/idea/templates/diff/ProjectRenderer.kt b/android-templates/testSrc/com/android/tools/idea/templates/diff/ProjectRenderer.kt
index a26e3f7..4eadf60 100644
--- a/android-templates/testSrc/com/android/tools/idea/templates/diff/ProjectRenderer.kt
+++ b/android-templates/testSrc/com/android/tools/idea/templates/diff/ProjectRenderer.kt
@@ -17,7 +17,7 @@
 
 import com.android.SdkConstants
 import com.android.testutils.TestUtils
-import com.android.tools.idea.gradle.npw.project.GradleAndroidModuleTemplate
+import com.android.tools.idea.npw.project.GradleAndroidModuleTemplate
 import com.android.tools.idea.npw.model.render
 import com.android.tools.idea.npw.module.recipes.androidModule.generateAndroidModule
 import com.android.tools.idea.npw.module.recipes.automotiveModule.generateAutomotiveModule
diff --git a/android-templates/testSrc/com/android/tools/idea/templates/diff/TemplateDiffTest.kt b/android-templates/testSrc/com/android/tools/idea/templates/diff/TemplateDiffTest.kt
index f84960b..dea3842 100644
--- a/android-templates/testSrc/com/android/tools/idea/templates/diff/TemplateDiffTest.kt
+++ b/android-templates/testSrc/com/android/tools/idea/templates/diff/TemplateDiffTest.kt
@@ -17,7 +17,7 @@
 
 import com.android.testutils.TestUtils
 import com.android.tools.idea.flags.StudioFlags
-import com.android.tools.idea.gradle.npw.project.GradleAndroidModuleTemplate
+import com.android.tools.idea.npw.project.GradleAndroidModuleTemplate
 import com.android.tools.idea.npw.model.RenderTemplateModel
 import com.android.tools.idea.npw.template.ModuleTemplateDataBuilder
 import com.android.tools.idea.npw.template.ProjectTemplateDataBuilder
diff --git a/android-test-framework/intellij.android.testFramework.iml b/android-test-framework/intellij.android.testFramework.iml
index 6d9e89d..a20112d 100644
--- a/android-test-framework/intellij.android.testFramework.iml
+++ b/android-test-framework/intellij.android.testFramework.iml
@@ -39,4 +39,4 @@
     <orderEntry type="module" module-name="android.sdktools.analytics-testing" scope="TEST" />
     <orderEntry type="module" module-name="analytics-tracker" scope="TEST" />
   </component>
-</module>
\ No newline at end of file
+</module>
diff --git a/android-test-framework/testSrc/com/android/tools/idea/testing/AndroidGradleTestUtils.kt b/android-test-framework/testSrc/com/android/tools/idea/testing/AndroidGradleTestUtils.kt
index 52f0815..33bc2cf 100644
--- a/android-test-framework/testSrc/com/android/tools/idea/testing/AndroidGradleTestUtils.kt
+++ b/android-test-framework/testSrc/com/android/tools/idea/testing/AndroidGradleTestUtils.kt
@@ -716,6 +716,7 @@
     transitiveRClasses = true,
     usesCompose = false,
     mlModelBindingEnabled = mlModelBindingEnabled,
+    androidResourcesEnabled = true,
     unifiedTestPlatformEnabled = true,
     useAndroidX = false,
   )
@@ -764,6 +765,7 @@
         multiDexEnabled = null,
         isDebuggable = true,
         isJniDebuggable = true,
+        isPseudoLocalesEnabled = false,
         isRenderscriptDebuggable = true,
         renderscriptOptimLevel = 1,
         isMinifyEnabled = false,
@@ -792,6 +794,7 @@
         multiDexEnabled = null,
         isDebuggable = false,
         isJniDebuggable = false,
+        isPseudoLocalesEnabled = false,
         isRenderscriptDebuggable = false,
         renderscriptOptimLevel = 1,
         isMinifyEnabled = true,
diff --git a/android-test-framework/testSrc/com/android/tools/idea/testing/KotlinPluginRule.kt b/android-test-framework/testSrc/com/android/tools/idea/testing/KotlinPluginRule.kt
new file mode 100644
index 0000000..9b0c915
--- /dev/null
+++ b/android-test-framework/testSrc/com/android/tools/idea/testing/KotlinPluginRule.kt
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.tools.idea.testing
+
+import org.jetbrains.kotlin.idea.base.plugin.KotlinPluginKind
+import org.jetbrains.kotlin.idea.base.plugin.checkKotlinPluginKind
+import org.junit.rules.ExternalResource
+
+class KotlinPluginRule(private val pluginKind: KotlinPluginKind) : ExternalResource() {
+  private var oldPropertyValue: String? = null
+  override fun before() {
+    oldPropertyValue = System.getProperty(PROPERTY_NAME)
+    System.setProperty(PROPERTY_NAME, (pluginKind == KotlinPluginKind.FIR_PLUGIN).toString())
+  }
+
+  override fun after() {
+    checkKotlinPluginKind(pluginKind)
+
+    val value = oldPropertyValue
+    if (value != null) {
+      System.setProperty(PROPERTY_NAME, value)
+    } else {
+      System.clearProperty(PROPERTY_NAME)
+    }
+    oldPropertyValue = null
+  }
+
+  companion object {
+    private const val PROPERTY_NAME = "idea.kotlin.plugin.use.k2"
+  }
+}
\ No newline at end of file
diff --git a/android-test-framework/testSrc/com/android/tools/idea/testing/TestProjectPaths.java b/android-test-framework/testSrc/com/android/tools/idea/testing/TestProjectPaths.java
index a61e2de..d782ff9 100644
--- a/android-test-framework/testSrc/com/android/tools/idea/testing/TestProjectPaths.java
+++ b/android-test-framework/testSrc/com/android/tools/idea/testing/TestProjectPaths.java
@@ -102,12 +102,11 @@
   public static final String SIMPLE_AIDL = "projects/simpleAidl";
   public static final String SIMPLE_APPLICATION = "projects/simpleApplication";
   public static final String SIMPLE_APPLICATION_PLUGINS_DSL = "projects/simpleApplicationPluginsDsl";
-  public static final String SIMPLE_APPLICATION_PLUGIN_MANAGEMENT_DSL = "projects/simpleApplicationPluginManagementDsl";
   public static final String SIMPLE_APPLICATION_VERSION_CATALOG = "projects/simpleApplicationVersionCatalog";
+  public static final String MINIMAL_CATALOG_APPLICATION = "projects/minimalCatalogProject";
   public static final String SIMPLE_APPLICATION_MULTI_VERSION_CATALOG = "projects/simpleApplicationMultiVersionCatalog";
   public static final String SIMPLE_APPLICATION_VERSION_CATALOG_KTS = "projects/simpleApplicationVersionCatalogKts";
   public static final String SIMPLE_APPLICATION_WITH_DUPLICATES = "projects/simpleApplicationWithDuplicates";
-  public static final String SIMPLE_APPLICATION_UNRESOLVED_DEPENDENCY = "projects/simpleApplicationUnresolvedDependency";
   public static final String SIMPLE_APP_WITH_OLDER_SUPPORT_LIB = "projects/simpleAppWithOlderSupportLib";
   public static final String SPLIT_BUILD_FILES = "projects/splitBuildFiles";
   public static final String SYNC_MULTIPROJECT = "projects/sync/multiproject";
diff --git a/android-uitests/BUILD b/android-uitests/BUILD
index 74b6114..5a4b536 100644
--- a/android-uitests/BUILD
+++ b/android-uitests/BUILD
@@ -1031,6 +1031,7 @@
 
 java_test(
     name = "CreateDefaultActivityTest",
+    size = "large",
     data = COMMON_DATA + [
         "//prebuilts/studio/layoutlib/data:framework_res.jar",
     ] + glob([
@@ -1091,6 +1092,7 @@
 
 java_test(
     name = "CreateNewLibraryModuleWithDefaultsTest",
+    size = "large",
     data = COMMON_DATA + glob([
         "testData/SimpleApplication/**",
     ]),
diff --git a/android-uitests/testSrc/com/android/tools/idea/tests/gui/gradle/CreateNewLibraryModuleWithDefaultsTest.java b/android-uitests/testSrc/com/android/tools/idea/tests/gui/gradle/CreateNewLibraryModuleWithDefaultsTest.java
index 1e9428c..936bab9 100644
--- a/android-uitests/testSrc/com/android/tools/idea/tests/gui/gradle/CreateNewLibraryModuleWithDefaultsTest.java
+++ b/android-uitests/testSrc/com/android/tools/idea/tests/gui/gradle/CreateNewLibraryModuleWithDefaultsTest.java
@@ -33,7 +33,7 @@
 @RunWith(GuiTestRemoteRunner.class)
 public class CreateNewLibraryModuleWithDefaultsTest {
 
-  @Rule public final GuiTestRule guiTest = new GuiTestRule().withTimeout(5, TimeUnit.MINUTES);
+  @Rule public final GuiTestRule guiTest = new GuiTestRule().withTimeout(15, TimeUnit.MINUTES);
 
   /**
    * Verifies addition of new library module to application.
diff --git a/android-uitests/testSrc/com/android/tools/idea/tests/gui/kotlin/LinkProjectWithKotlinTest.java b/android-uitests/testSrc/com/android/tools/idea/tests/gui/kotlin/LinkProjectWithKotlinTest.java
index d846111..36cf355 100644
--- a/android-uitests/testSrc/com/android/tools/idea/tests/gui/kotlin/LinkProjectWithKotlinTest.java
+++ b/android-uitests/testSrc/com/android/tools/idea/tests/gui/kotlin/LinkProjectWithKotlinTest.java
@@ -17,6 +17,7 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import com.android.testutils.TestUtils;
 import com.android.tools.idea.tests.gui.framework.GuiTestRule;
 import com.android.tools.idea.tests.gui.framework.GuiTests;
 import com.android.tools.idea.tests.gui.framework.RunIn;
@@ -152,10 +153,9 @@
       .open("build.gradle")
       .getCurrentFileContents();
 
-    KotlinVersion kotlinVersion = KotlinPluginLayout.getInstance().getStandaloneCompilerVersion().getKotlinVersion();
     String newBuildGradleContents = buildGradleContents.replaceAll(
         "kotlin_version.*=.*",
-        "kotlin_version = '" + kotlinVersion + '\'')
+        "kotlin_version = '" + TestUtils.KOTLIN_VERSION_FOR_TESTS + '\'')
       .replaceAll(
         "mavenCentral\\(\\)",
         ""
diff --git a/android-uitests/testSrc/com/android/tools/idea/tests/gui/npw/CreateDefaultActivityTest.java b/android-uitests/testSrc/com/android/tools/idea/tests/gui/npw/CreateDefaultActivityTest.java
index 30817d3..134611c 100644
--- a/android-uitests/testSrc/com/android/tools/idea/tests/gui/npw/CreateDefaultActivityTest.java
+++ b/android-uitests/testSrc/com/android/tools/idea/tests/gui/npw/CreateDefaultActivityTest.java
@@ -45,7 +45,7 @@
   private static final String DEFAULT_ACTIVITY_NAME = "MainActivity";
   private static final String DEFAULT_LAYOUT_NAME = "activity_main";
 
-  @Rule public final GuiTestRule guiTest = new GuiTestRule().withTimeout(10, TimeUnit.MINUTES);
+  @Rule public final GuiTestRule guiTest = new GuiTestRule().withTimeout(15, TimeUnit.MINUTES);
 
   private EditorFixture myEditor;
   private NewActivityWizardFixture myDialog;
diff --git a/android/agpIntegrationTestSrc/com/android/tools/idea/res/TestRClassesTest.kt b/android/agpIntegrationTestSrc/com/android/tools/idea/res/TestRClassesTest.kt
index 27aa6b9..b7d3c67 100644
--- a/android/agpIntegrationTestSrc/com/android/tools/idea/res/TestRClassesTest.kt
+++ b/android/agpIntegrationTestSrc/com/android/tools/idea/res/TestRClassesTest.kt
@@ -37,7 +37,6 @@
 import com.intellij.testFramework.PlatformTestUtil
 import com.intellij.testFramework.VfsTestUtil.createFile
 import com.intellij.testFramework.fixtures.CodeInsightTestUtil
-import org.junit.Ignore
 import java.io.File
 
 /**
@@ -255,6 +254,76 @@
       selectedEditor.document.text.substring(selectedEditor.caretModel.offset)
     assertThat(textAfterCaret).startsWith("app_name\">projectWithAppandLib</string>")
   }
+
+  protected fun setAndroidResourcesEnablementInLibAndSync(androidResourcesEnabled: Boolean) {
+    val gradleFile = File(projectRootDirectory.toIoFile(), "lib/build.gradle")
+    val gradleFileText = gradleFile.readText()
+
+    val searchString = "buildFeatures {"
+    val insertionIndex = gradleFileText.indexOf("buildFeatures {") + searchString.length
+
+    val updatedGradleFileText =
+      """${gradleFileText.substring(0, insertionIndex)}
+          androidResources ${if (androidResourcesEnabled) "true" else "false"}
+      ${gradleFileText.substring(insertionIndex)}
+      """.trimIndent()
+
+    gradleFile.writeText(updatedGradleFileText)
+
+    requestSyncAndWait()
+  }
+
+  fun doTestLibAndroidResourcesEnabled() {
+    setAndroidResourcesEnablementInLibAndSync(androidResourcesEnabled = true)
+
+    val file = createFile(
+      projectRootDirectory,
+      "lib/src/main/java/com/example/projectwithappandlib/lib/RClassInLib.java",
+      // language=java
+      """
+      package com.example.projectwithappandlib.lib;
+
+      public class RClassInLib {
+          void useResources() {
+             int[] id = new int[] {
+              com.example.projectwithappandlib.lib.R.string.libResource,
+              // The string that isn't in strings.xml should be highlighted as an error.
+              com.example.projectwithappandlib.lib.R.string.${"resource_that_does_not_exist" highlightedAs ERROR},
+             };
+          }
+      }
+      """.trimIndent()
+    )
+
+    myFixture.configureFromExistingVirtualFile(file)
+    myFixture.checkHighlighting()
+  }
+
+  fun doTestLibAndroidResourcesDisabled() {
+    setAndroidResourcesEnablementInLibAndSync(androidResourcesEnabled = false)
+
+    val file = createFile(
+      projectRootDirectory,
+      "lib/src/main/java/com/example/projectwithappandlib/lib/RClassInLib.java",
+      // language=java
+      """
+      package com.example.projectwithappandlib.lib;
+
+      public class RClassInLib {
+          void useResources() {
+             int[] id = new int[] {
+              // Since resources are disabled for the library, the `R` class should be highlighted as an error.
+              com.example.projectwithappandlib.lib.${"R" highlightedAs ERROR}.string.libResource,
+              com.example.projectwithappandlib.lib.${"R" highlightedAs ERROR}.string.resource_that_does_not_exist,
+             };
+          }
+      }
+      """.trimIndent()
+    )
+
+    myFixture.configureFromExistingVirtualFile(file)
+    myFixture.checkHighlighting()
+  }
 }
 
 /**
@@ -387,6 +456,14 @@
     assertThat(myFixture.lookupElementStrings).doesNotContain("abc_action_bar_home_description")
   }
 
+  fun testLibAndroidResourcesEnabled() {
+    doTestLibAndroidResourcesEnabled()
+  }
+
+  fun testLibAndroidResourcesDisabled() {
+    doTestLibAndroidResourcesDisabled()
+  }
+
   fun testResolveScope() {
     val unitTest = createFile(
       projectRootDirectory,
@@ -610,6 +687,14 @@
     assertThat(myFixture.lookupElementStrings).containsExactly("libTestResource", "anotherLibTestResource", "class")
   }
 
+  fun testLibAndroidResourcesEnabled() {
+    doTestLibAndroidResourcesEnabled()
+  }
+
+  fun testLibAndroidResourcesDisabled() {
+    doTestLibAndroidResourcesDisabled()
+  }
+
   fun testNavigateToDefinitionJavaToAppTestResource() {
     doTestNavigateToDefinitionJavaToAppTestResource()
   }
diff --git a/android/diagnostics/testSrc/com/android/tools/idea/diagnostics/AndroidStudioSystemHealthMonitorTest.java b/android/diagnostics/testSrc/com/android/tools/idea/diagnostics/AndroidStudioSystemHealthMonitorTest.java
index 7486c50..cf859d2 100644
--- a/android/diagnostics/testSrc/com/android/tools/idea/diagnostics/AndroidStudioSystemHealthMonitorTest.java
+++ b/android/diagnostics/testSrc/com/android/tools/idea/diagnostics/AndroidStudioSystemHealthMonitorTest.java
@@ -71,11 +71,6 @@
     getApplication().registerService(ExceptionDataCollection.class, exceptionDataCollectionMock);
     when(notificationGroupManagerMock.getNotificationGroup(any(String.class))).thenReturn(notificationGroupMock);
     androidStudioSystemHealthMonitor = spy(new AndroidStudioSystemHealthMonitor(studioReportDatabaseMock));
-
-    // When this method is invoked more than once (side-effect of running androidStudioSystemHealthMonitor.start())
-    // across different tests, we see the initial listener that is registered being preserved. This causes an exception
-    // to be thrown.
-    doNothing().when(androidStudioSystemHealthMonitor).registerPlatformEventsListener();
   }
 
   @Test
diff --git a/android/diagnostics/testSrc/com/android/tools/idea/diagnostics/AndroidStudioSystemHealthMonitorUtilitiesTest.java b/android/diagnostics/testSrc/com/android/tools/idea/diagnostics/AndroidStudioSystemHealthMonitorUtilitiesTest.java
index bcfcb5f..6b953b7 100644
--- a/android/diagnostics/testSrc/com/android/tools/idea/diagnostics/AndroidStudioSystemHealthMonitorUtilitiesTest.java
+++ b/android/diagnostics/testSrc/com/android/tools/idea/diagnostics/AndroidStudioSystemHealthMonitorUtilitiesTest.java
@@ -18,28 +18,28 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import com.android.tools.idea.diagnostics.error.AndroidStudioErrorReportSubmitter;
-import com.intellij.ExtensionPoints;
 import com.intellij.diagnostic.IdeErrorsDialog;
 import com.intellij.openapi.actionSystem.AnAction;
 import com.intellij.openapi.actionSystem.AnActionEvent;
 import com.intellij.openapi.actionSystem.Presentation;
 import com.intellij.openapi.extensions.PluginId;
-import com.intellij.testFramework.PlatformTestCase;
+import com.intellij.testFramework.LightPlatformTestCase;
+import org.jetbrains.annotations.NotNull;
 
-public class AndroidStudioSystemHealthMonitorUtilitiesTest extends PlatformTestCase {
+public class AndroidStudioSystemHealthMonitorUtilitiesTest extends LightPlatformTestCase {
 
   public void testGetActionName() {
     // normal class in our packages should yield simple name
-    assertEquals("AndroidStudioSystemHealthMonitorTest", AndroidStudioSystemHealthMonitor.getActionName(AndroidStudioSystemHealthMonitorTest.class, new Presentation("foo")));
+    assertEquals("AndroidStudioSystemHealthMonitorTest", AndroidStudioSystemHealthMonitor.getActionName(AndroidStudioSystemHealthMonitorTest.class, new Presentation("Foo")));
     // ExecutorAction class should yield simple name plus presentation text.
     assertEquals("ExecutorAction#Run", AndroidStudioSystemHealthMonitor.getActionName(ExecutorAction.class, new Presentation("Run")));
     // Anonymous inner-class should yield name of enclosing class.
     assertEquals("AnAction@AndroidStudioSystemHealthMonitorUtilitiesTest", AndroidStudioSystemHealthMonitor.getActionName(new AnAction(){
       @Override
-      public void actionPerformed(AnActionEvent e) {
+      public void actionPerformed(@NotNull AnActionEvent e) {
 
       }
-    }.getClass(), new Presentation("foo")));
+    }.getClass(), new Presentation("Foo")));
     // class outside of our packages should yield full class name.
     assertEquals("java.lang.String", AndroidStudioSystemHealthMonitor.getActionName(String.class, new Presentation("Foo")));
   }
@@ -47,7 +47,7 @@
   // Regression test for b/130834409.
   public void testAndroidErrorSubmitter() {
     // Our error submitter should be registered.
-    assertThat(ExtensionPoints.ERROR_HANDLER_EP.findExtension(AndroidStudioErrorReportSubmitter.class)).isNotNull();
+    assertThat(IdeErrorsDialog.ERROR_HANDLER_EP.findExtension(AndroidStudioErrorReportSubmitter.class)).isNotNull();
     // Platform exceptions should be handled by our error submitter.
     RuntimeException exception = new RuntimeException();
     assertThat(IdeErrorsDialog.getSubmitter(exception, /*pluginId*/ null)).isInstanceOf(AndroidStudioErrorReportSubmitter.class);
@@ -57,7 +57,5 @@
   }
 }
 
-/**
- * Class needed for {@link #testGetActionName()}.
- */
-class ExecutorAction {}
\ No newline at end of file
+/** Class needed for testGetActionName(). */
+class ExecutorAction {}
diff --git a/android/editors/testSrc/com/android/tools/idea/editors/liveedit/ui/LiveEditTest.kt b/android/editors/testSrc/com/android/tools/idea/editors/liveedit/ui/LiveEditTest.kt
deleted file mode 100644
index a7f43aa..0000000
--- a/android/editors/testSrc/com/android/tools/idea/editors/liveedit/ui/LiveEditTest.kt
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (C) 2022 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.tools.idea.editors.liveedit.ui
-
-class LiveEditTest {
-  //lateinit var project: Project
-  //lateinit var service: LiveEditService
-  //lateinit var presentation: Presentation
-  //lateinit var device: IDevice
-  //
-  //@Before
-  //fun setup() {
-  //  project = MockitoKt.mock()
-  //  service = MockitoKt.mock()
-  //  presentation = Presentation()
-  //  device = MockitoKt.mock()
-  //}
-  //
-  //@Test
-  //fun testInitialState() {
-  //  `when`(project.getService(LiveEditService::class.java)).thenReturn(service)
-  //  `when`(service.editStatus(device)).thenReturn(LiveEditStatus.Disabled)
-  //
-  //  val action = LiveEditAction(null)
-  //  LiveEditAction.registerProject(project, object: LiveEditAction.DeviceGetter {
-  //    override fun serial(dataContext: DataContext): String {
-  //      return "serial"
-  //    }
-  //
-  //    override fun device(dataContext: DataContext): IDevice {
-  //      return device
-  //    }
-  //
-  //    override fun devices(): List<IDevice> {
-  //      return Collections.singletonList(device)
-  //    }
-  //  })
-  //  action.update(project, presentation, DataContext.EMPTY_CONTEXT)
-  //  assertThat(presentation.isEnabledAndVisible).isFalse()
-  //}
-  //
-  //@Test
-  //fun testUpdateIcon() {
-  //  val action = LiveEditAction(null)
-  //  val indicator = action.createCustomComponent(presentation, RUNNING_DEVICES_TOOL_WINDOW_ID) as ActionButtonWithText
-  //  presentation.putClientProperty(LiveEditAction.LIVE_EDIT_STATUS, LiveEditStatus.UpToDate)
-  //  indicator.updateIcon()
-  //  assertThat(indicator.icon).isEqualTo(LiveEditStatus.UpToDate.icon)
-  //}
-  //
-  //@Test
-  //fun testUpdateEditStatus() {
-  //  `when`(project.getService(LiveEditService::class.java)).thenReturn(service)
-  //  `when`(service.editStatus(device)).thenReturn(LiveEditStatus.UpToDate)
-  //  val action = LiveEditAction(null)
-  //  presentation.putClientProperty(LiveEditAction.LIVE_EDIT_STATUS, LiveEditStatus.UpToDate)
-  //  LiveEditAction.registerProject(project, object: LiveEditAction.DeviceGetter {
-  //    override fun serial(dataContext: DataContext): String {
-  //      return "serial"
-  //    }
-  //
-  //    override fun device(dataContext: DataContext): IDevice {
-  //      return device
-  //    }
-  //
-  //    override fun devices(): List<IDevice> {
-  //      return Collections.singletonList(device)
-  //    }
-  //  })
-  //  action.update(project, presentation, DataContext.EMPTY_CONTEXT)
-  //  assertThat(presentation.icon).isEqualTo(LiveEditStatus.UpToDate.icon)
-  //  assertThat(presentation.isEnabledAndVisible).isTrue()
-  //}
-}
\ No newline at end of file
diff --git a/android/gradle.project.sync/testSrc/com/android/tools/idea/gradle/project/sync/issues/SyncIssueUsageReporterTest.kt b/android/gradle.project.sync/testSrc/com/android/tools/idea/gradle/project/sync/issues/SyncIssueUsageReporterTest.kt
index 7a41834..2823416 100644
--- a/android/gradle.project.sync/testSrc/com/android/tools/idea/gradle/project/sync/issues/SyncIssueUsageReporterTest.kt
+++ b/android/gradle.project.sync/testSrc/com/android/tools/idea/gradle/project/sync/issues/SyncIssueUsageReporterTest.kt
@@ -16,6 +16,7 @@
 package com.android.tools.idea.gradle.project.sync.issues
 
 import com.android.builder.model.SyncIssue
+import com.android.tools.idea.gradle.model.IdeSyncIssue
 import com.android.tools.idea.gradle.project.sync.issues.SyncIssueUsageReporter.Companion.toGradleSyncIssueType
 import com.android.tools.idea.testing.AndroidGradleTestCase
 import com.google.common.truth.Truth.assertThat
@@ -34,4 +35,16 @@
         .isNotNull()
     }
   }
+
+  /**
+   * Test that SyncIssues and IdeSyncIssues match.
+   */
+  @Test
+  fun testSyncIssuesMatchIdeSyncIssues() {
+    val syncIssues =
+      SyncIssue::class.java.fields.filter { it.name.startsWith("TYPE_") }.map { Pair(it.name, it.getInt(SyncIssue::class.java)) }
+    val ideSyncIssues =
+      IdeSyncIssue::class.java.fields.filter { it.name.startsWith("TYPE_") }.map { Pair(it.name, it.getInt(IdeSyncIssue::class.java)) }
+    assertThat(syncIssues).containsExactlyElementsIn(ideSyncIssues)
+  }
 }
diff --git a/android/gradle/BUILD b/android/gradle/BUILD
index 6cab672..3995e38 100644
--- a/android/gradle/BUILD
+++ b/android/gradle/BUILD
@@ -10,6 +10,7 @@
     test_data = [
         "//prebuilts/studio/jdk:jdk_1_8",
         "//prebuilts/studio/jdk/jdk11",
+        "//prebuilts/studio/jdk/jdk17:jdk17_runtime_files",
         "//prebuilts/studio/sdk:build-tools/latest",
         "//prebuilts/studio/sdk:platforms/latest",
         "//tools/adt/idea/android:test_deps",
diff --git a/android/integration/testSrc/com/android/tools/idea/LiveEditTest.kt b/android/integration/testSrc/com/android/tools/idea/LiveEditTest.kt
index 4b2a045..f9a6d9f 100644
--- a/android/integration/testSrc/com/android/tools/idea/LiveEditTest.kt
+++ b/android/integration/testSrc/com/android/tools/idea/LiveEditTest.kt
@@ -20,6 +20,7 @@
 import com.android.tools.asdriver.tests.Emulator
 import com.android.tools.asdriver.tests.MavenRepo
 import com.android.tools.asdriver.tests.MemoryDashboardNameProviderWatcher
+import org.junit.Ignore
 import org.junit.Rule
 import org.junit.Test
 import java.io.IOException
@@ -58,6 +59,7 @@
     Files.writeString(filetypePaths, filetypeContents, StandardCharsets.UTF_8)
   }
 
+  @Ignore("b/323239076")
   @Test
   fun liveEditTest() {
     val project = AndroidProject("tools/adt/idea/android/integration/testData/liveedit")
diff --git a/android/jetbrains/testSrc/org/jetbrains/android/util/DisposableUtilsTest.kt b/android/jetbrains/testSrc/org/jetbrains/android/util/DisposableUtilsTest.kt
new file mode 100644
index 0000000..e09a2c0
--- /dev/null
+++ b/android/jetbrains/testSrc/org/jetbrains/android/util/DisposableUtilsTest.kt
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.jetbrains.android.util
+
+import com.android.tools.idea.testing.DisposerExplorer
+import com.google.common.truth.Truth.assertThat
+import com.intellij.openapi.Disposable
+import com.intellij.openapi.util.Disposer
+import com.intellij.testFramework.DisposableRule
+import org.junit.Rule
+import org.junit.Test
+
+/** Tests for [MultiParentDisposable] and [runOnDisposalOfAnyOf]. */
+class DisposableUtilsTest {
+
+  @get:Rule val disposableRule = DisposableRule()
+
+  /** Checks that [MultiParentDisposable] is disposed when any of its parents are disposed. */
+  @Test
+  fun testParentDisposal() {
+    val d1 = createDisposable()
+    val d2 = createDisposable()
+    val d3 = createDisposable()
+    val multiParentDisposable = object : MultiParentDisposable(d1, d2, d3) {
+      var isDisposed = false
+
+      override fun dispose() {
+        isDisposed = true
+      }
+    }
+    Disposer.dispose(d2)
+    assertThat(multiParentDisposable.isDisposed).isTrue()
+    assertThat(DisposerExplorer.getChildren(d1)).isEmpty()
+    assertThat(DisposerExplorer.getChildren(d3)).isEmpty()
+  }
+
+  /** Checks that the [Disposer] tree remains clean after [MultiParentDisposable] is disposed. */
+  @Test
+  fun testDisposal() {
+    val d1 = createDisposable()
+    val d2 = createDisposable()
+    val d3 = createDisposable()
+    val multiParentDisposable = object : MultiParentDisposable(d1, d2, d3) {
+      var isDisposed = false
+
+      override fun dispose() {
+        isDisposed = true
+      }
+    }
+    Disposer.dispose(multiParentDisposable)
+    assertThat(DisposerExplorer.getChildren(d1)).isEmpty()
+    assertThat(DisposerExplorer.getChildren(d2)).isEmpty()
+    assertThat(DisposerExplorer.getChildren(d3)).isEmpty()
+  }
+
+  /** Checks that unintended use of [MultiParentDisposable] triggers an [IllegalArgumentException]. */
+  @Test(expected = IllegalArgumentException::class)
+  fun testUnintendedUse() {
+    MultiParentDisposable(Disposer.newDisposable())
+  }
+
+  /** Checks [runOnDisposalOfAnyOf]. */
+  @Test
+  fun testRunOnDisposalOfAnyOf() {
+    val d1 = createDisposable()
+    val d2 = createDisposable()
+    val d3 = createDisposable()
+    var executed = false
+    runOnDisposalOfAnyOf(d1, d2, d3) {
+      executed = true
+    }
+    Disposer.dispose(d3)
+    assertThat(executed).isTrue()
+    assertThat(DisposerExplorer.getChildren(d1)).isEmpty()
+    assertThat(DisposerExplorer.getChildren(d2)).isEmpty()
+    assertThat(DisposerExplorer.getChildren(d3)).isEmpty()
+  }
+
+  private fun createDisposable(): Disposable =
+      Disposer.newDisposable().also { Disposer.register(disposableRule.disposable, it) }
+}
diff --git a/android/res/testSrc/com/android/tools/idea/res/StudioResourceRepositoryManagerTest.java b/android/res/testSrc/com/android/tools/idea/res/StudioResourceRepositoryManagerTest.java
index fc1f013..a37fd7c 100644
--- a/android/res/testSrc/com/android/tools/idea/res/StudioResourceRepositoryManagerTest.java
+++ b/android/res/testSrc/com/android/tools/idea/res/StudioResourceRepositoryManagerTest.java
@@ -38,6 +38,7 @@
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.concurrent.TimeUnit;
 import org.jetbrains.android.AndroidTestCase;
 import org.jetbrains.android.facet.AndroidFacet;
 import org.jetbrains.annotations.NotNull;
@@ -119,7 +120,7 @@
       addModuleWithAndroidFacet(projectBuilder, modules, "myLibrary", AndroidProjectTypes.PROJECT_TYPE_LIBRARY);
     }
 
-    public void testDependentModuleReset() {
+    public void testDependentModuleReset() throws Exception {
       // Regression test for b/313309846
       // StudioResourceRepositoryManager.resetResources() causes the contained repositories to be disposed.
       // Any other modules' StudioResourceRepositoryManagers that reference those disposed repositories need to
@@ -143,8 +144,19 @@
       assertChildrenNotDisposed(mainModuleTestResources);
       assertChildrenNotDisposed(mainModuleModuleResources);
 
+      // Get one of the library facet's repositories, so we can ensure it's been reset and disposed.
+      LocalResourceRepository<VirtualFile> libraryModuleAppResources = libraryFacetManager.getAppResources();
+
       // Resetting the resources will cause the library's repositories to become disposed.
       libraryFacetManager.resetResources();
+      assertThat(
+        StudioResourceRepositoryManager.DisposeAndRefreshService.getInstance()
+          .waitForRunningTasks(10000, TimeUnit.MILLISECONDS)).isTrue();
+
+      // Verify that the library module's repositories have been updated, and the old ones disposed.
+      LocalResourceRepository<VirtualFile> libraryModuleAppResourcesAfterReset = libraryFacetManager.getAppResources();
+      assertThat(libraryModuleAppResourcesAfterReset).isNotSameAs(libraryModuleAppResources);
+      assertThat(Disposer.isDisposed((Disposable)libraryModuleAppResources)).isTrue();
 
       // The main module's repositories should still be the same objects; but their children (including the
       // library module's repositories) should have changed and should not be disposed.
diff --git a/android/run/OWNERS b/android/run/OWNERS
new file mode 100644
index 0000000..1ce682d
--- /dev/null
+++ b/android/run/OWNERS
@@ -0,0 +1,4 @@
+# Route bugs created from test failures to L2 triage.
+# Bug template url: http://b/new?component=327883
+# See go/studio-test-owners for more.
+include platform/tools/base:/owners/deploy_OWNERS
diff --git a/android/src/META-INF/android-plugin-androidstudio.xml b/android/src/META-INF/android-plugin-androidstudio.xml
index fd37aa7..64950c3 100644
--- a/android/src/META-INF/android-plugin-androidstudio.xml
+++ b/android/src/META-INF/android-plugin-androidstudio.xml
@@ -20,7 +20,6 @@
     <registryKey key="ide.slow.operations.assertion.generic" defaultValue="false" description="Flag for generic activities and code in `SlowOperations#allowSlowOperations`"/>
     <applicationInitializedListener id="Startup.AndroidStudioInitializer" implementation="com.android.tools.idea.startup.AndroidStudioInitializer" />
     <actionConfigurationCustomizer id="Startup.AndroidStudioActionCustomizer" implementation="com.android.tools.idea.startup.AndroidStudioActionCustomizer"/>
-    <applicationInitializedListener implementation="com.android.tools.idea.startup.AndroidSdkInitializer" order="last"/>
     <applicationInitializedListener implementation="com.android.tools.idea.instrumentation.threading.ThreadingChecker" />
     <applicationService serviceInterface="com.intellij.platform.ide.customization.ExternalProductResourceUrls"
                         serviceImplementation="com.android.tools.idea.AndroidStudioResourceUrls"
@@ -30,6 +29,14 @@
                         serviceImplementation="com.android.tools.idea.AndroidStudioUpdateStrategyCustomization"
                         overrides="true"/>
 
+    <!--suppress PluginXmlValidity (this service is intentionally registered outside the module of the interface class) -->
+    <applicationService serviceInterface="com.intellij.analytics.AndroidStudioAnalytics"
+                        serviceImplementation="com.android.tools.idea.startup.AndroidStudioAnalyticsImpl"/>
+
+    <!--suppress PluginXmlValidity (this service is intentionally registered outside the module of the interface class) -->
+    <applicationService serviceInterface="com.intellij.ide.AndroidStudioSystemHealthMonitorAdapter$EventsListener"
+                        serviceImplementation="com.android.tools.idea.diagnostics.AndroidStudioSystemHealthMonitor$MyEventsListener"/>
+
     <!-- overrides UTM-tracking implementation included from JavaIdePlugin.xml: -->
     <applicationService serviceImplementation="com.intellij.openapi.application.IdeUrlTrackingParametersProvider"
                         overrides="true"/>
diff --git a/android/src/META-INF/android-plugin.xml b/android/src/META-INF/android-plugin.xml
index 3b66b24..7c7f8c8 100644
--- a/android/src/META-INF/android-plugin.xml
+++ b/android/src/META-INF/android-plugin.xml
@@ -192,7 +192,6 @@
     <projectService serviceImplementation="com.android.tools.idea.res.ResourceNotificationManager" />
     <projectService serviceImplementation="com.android.tools.idea.startup.ClearResourceCacheAfterFirstBuild" />
     <postStartupActivity implementation="com.android.tools.idea.startup.ClearResourceCacheAfterFirstBuild$MyStartupActivity"/>
-    <ApplicationLoadListener implementation="com.android.tools.idea.startup.AndroidPluginInitializer" id="AndroidPlugingInitializer"/>
     <applicationInitializedListener implementation="com.android.tools.idea.progress.StudioProgressManagerAdapter$Installer" />
     <fileBasedIndex implementation="com.android.tools.idea.model.AndroidManifestIndex"/>
     <applicationService serviceImplementation="com.android.tools.idea.imports.MavenClassRegistryManager" />
diff --git a/android/src/com/android/tools/idea/avdmanager/DeviceDefinitionList.java b/android/src/com/android/tools/idea/avdmanager/DeviceDefinitionList.java
index 3eaa1a3..2158ae5 100644
--- a/android/src/com/android/tools/idea/avdmanager/DeviceDefinitionList.java
+++ b/android/src/com/android/tools/idea/avdmanager/DeviceDefinitionList.java
@@ -19,6 +19,7 @@
 import com.android.tools.adtui.common.ColoredIconGenerator;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Multimap;
 import com.google.common.collect.MultimapBuilder;
 import com.google.common.collect.Multimaps;
 import com.google.common.collect.SortedSetMultimap;
@@ -167,7 +168,7 @@
   private @NotNull Device first(@NotNull Category category) {
     // This should not happen and, yet, here we are
 
-    Logger.getInstance(DeviceDefinitionList.class).warn(
+    Logger.getInstance(DeviceDefinitionList.class).error(
       "Did not find default " + category.getDefaultDefinitionId() + ' ' + toString(category) + " in " + mapDefinitionsToIds(category));
 
     return myCategoryToDefinitionMultimap.get(category).first();
@@ -225,6 +226,11 @@
     setSelectedDevice(myDefaultDevice);
   }
 
+  @VisibleForTesting
+  @NotNull Multimap<Category, Device> getCategoryToDefinitionMultimap() {
+    return myCategoryToDefinitionMultimap;
+  }
+
   @Nullable
   @Override
   public Project getProject() {
diff --git a/android/src/com/android/tools/idea/avdmanager/NameComparator.java b/android/src/com/android/tools/idea/avdmanager/NameComparator.java
index 5cd84e9..6ad444e 100644
--- a/android/src/com/android/tools/idea/avdmanager/NameComparator.java
+++ b/android/src/com/android/tools/idea/avdmanager/NameComparator.java
@@ -39,7 +39,8 @@
 final class NameComparator implements Comparator<Device> {
   @NotNull
   private static final Comparator<Device> COMPARATOR = Comparator.comparing(SortKey::valueOfDevice)
-    .thenComparing(Device::getDisplayName, Collator.getInstance(ULocale.ROOT).reversed());
+    .thenComparing(Device::getDisplayName, Collator.getInstance(ULocale.ROOT).reversed())
+    .thenComparing(Device::getId);
 
   private enum SortKey {
     SMALL_PHONE,
diff --git a/android/src/com/android/tools/idea/configurations/ThemeUtils.kt b/android/src/com/android/tools/idea/configurations/ThemeUtils.kt
index 65ddaf5..d515e7d 100644
--- a/android/src/com/android/tools/idea/configurations/ThemeUtils.kt
+++ b/android/src/com/android/tools/idea/configurations/ThemeUtils.kt
@@ -36,6 +36,7 @@
 import com.android.tools.idea.model.queryApplicationThemeFromManifestIndex
 import com.android.tools.idea.model.queryIsMainManifestIndexReady
 import com.android.tools.idea.run.activity.DefaultActivityLocator
+import com.android.tools.idea.util.uiSafeRunReadActionInSmartMode
 import com.android.tools.module.AndroidModuleInfo
 import com.intellij.openapi.module.Module
 import com.intellij.openapi.project.DumbService
@@ -69,7 +70,7 @@
   try {
     val facet = AndroidFacet.getInstance(this)
     if (facet != null) {
-      return DumbService.getInstance(this.project).runReadActionInSmartMode(Computable {
+      return uiSafeRunReadActionInSmartMode(this.project, Computable {
         SlowOperations.allowSlowOperations(ThrowableComputable {
           if (!facet.queryIsMainManifestIndexReady()) throw MainManifestIndexNotReadyException()
           facet.queryApplicationThemeFromManifestIndex()
@@ -135,7 +136,7 @@
   try {
     val facet = AndroidFacet.getInstance(this)
     if (facet != null) {
-      return DumbService.getInstance(this.project).runReadActionInSmartMode(Computable {
+      return uiSafeRunReadActionInSmartMode(this.project, Computable {
         SlowOperations.allowSlowOperations(ThrowableComputable {
           if (!facet.queryIsMainManifestIndexReady()) throw MainManifestIndexNotReadyException()
           manifestIndexQueryAction.invoke(facet)
diff --git a/android/src/com/android/tools/idea/diagnostics/AndroidStudioSystemHealthMonitor.java b/android/src/com/android/tools/idea/diagnostics/AndroidStudioSystemHealthMonitor.java
index 60d49a8..3c14959 100644
--- a/android/src/com/android/tools/idea/diagnostics/AndroidStudioSystemHealthMonitor.java
+++ b/android/src/com/android/tools/idea/diagnostics/AndroidStudioSystemHealthMonitor.java
@@ -460,7 +460,6 @@
   public void startInternal() {
     assert myGroup != null;
     Application application = ApplicationManager.getApplication();
-    registerPlatformEventsListener();
 
     application.executeOnPooledThread(this::checkRuntime);
 
@@ -635,20 +634,16 @@
     }
   }
 
-  protected void registerPlatformEventsListener() {
-    AndroidStudioSystemHealthMonitorAdapter.EventsListener listener = new AndroidStudioSystemHealthMonitorAdapter.EventsListener() {
+  public static class MyEventsListener implements AndroidStudioSystemHealthMonitorAdapter.EventsListener {
+    @Override
+    public void countActionInvocation(AnAction anAction, Presentation presentation, AnActionEvent event) {
+      AndroidStudioSystemHealthMonitor.countActionInvocation(anAction, presentation, event);
+    }
 
-      @Override
-      public void countActionInvocation(AnAction anAction, Presentation presentation, AnActionEvent event) {
-        AndroidStudioSystemHealthMonitor.countActionInvocation(anAction, presentation, event);
-      }
-
-      @Override
-      public boolean handleExceptionEvent(IdeaLoggingEvent event, VMOptions.MemoryKind memoryKind) {
-        return AndroidStudioSystemHealthMonitor.this.handleExceptionEvent(event, memoryKind);
-      }
-    };
-    AndroidStudioSystemHealthMonitorAdapter.registerEventsListener(listener);
+    @Override
+    public boolean handleExceptionEvent(IdeaLoggingEvent event, VMOptions.MemoryKind memoryKind) {
+      return AndroidStudioSystemHealthMonitor.getInstance().handleExceptionEvent(event, memoryKind);
+    }
   }
 
   private AtomicBoolean ourOomOccurred = new AtomicBoolean(false);
diff --git a/android/src/com/android/tools/idea/editors/liveedit/ui/LiveEditActionProvider.kt b/android/src/com/android/tools/idea/editors/liveedit/ui/LiveEditActionProvider.kt
index d0c5ae6..19f190f 100644
--- a/android/src/com/android/tools/idea/editors/liveedit/ui/LiveEditActionProvider.kt
+++ b/android/src/com/android/tools/idea/editors/liveedit/ui/LiveEditActionProvider.kt
@@ -15,6 +15,7 @@
  */
 package com.android.tools.idea.editors.liveedit.ui
 
+import com.android.tools.idea.util.CommonAndroidUtil
 import com.intellij.openapi.actionSystem.AnAction
 import com.intellij.openapi.editor.Editor
 import com.intellij.openapi.editor.markup.InspectionWidgetActionProvider
@@ -23,8 +24,9 @@
 
 class LiveEditActionProvider : InspectionWidgetActionProvider {
   override fun createAction(editor: Editor): AnAction? {
-    val project: Project? = editor.project
+    val project: Project = editor.project ?: return null
+    if (!CommonAndroidUtil.getInstance().isAndroidProject(project)) return null
     val file = FileDocumentManager.getInstance().getFile(editor.document)
-    return if (project == null || project.isDefault || file == null || !file.exists()) null else LiveEditNotificationGroup()
+    return if (project.isDefault || file == null || !file.exists()) null else LiveEditNotificationGroup()
   }
 }
\ No newline at end of file
diff --git a/android/src/com/android/tools/idea/log/IJLogger.kt b/android/src/com/android/tools/idea/log/IJLogger.kt
index 3113056..321287f 100644
--- a/android/src/com/android/tools/idea/log/IJLogger.kt
+++ b/android/src/com/android/tools/idea/log/IJLogger.kt
@@ -24,6 +24,8 @@
 
   override fun error(message: String, throwable: Throwable?) = delegate.error(message, throwable)
 
+  override fun info(message: String, throwable: Throwable?) = delegate.info(message, throwable)
+
   override fun debug(message: String, throwable: Throwable?) = delegate.debug(message, throwable)
 
   override val isDebugEnabled: Boolean
diff --git a/android/src/com/android/tools/idea/model/StudioAndroidModuleInfo.java b/android/src/com/android/tools/idea/model/StudioAndroidModuleInfo.java
index cb2997b..2e2c2e1 100644
--- a/android/src/com/android/tools/idea/model/StudioAndroidModuleInfo.java
+++ b/android/src/com/android/tools/idea/model/StudioAndroidModuleInfo.java
@@ -18,6 +18,7 @@
 import static com.android.AndroidProjectTypes.PROJECT_TYPE_INSTANTAPP;
 import static com.android.tools.idea.instantapp.InstantApps.findBaseFeature;
 import static com.android.tools.idea.model.AndroidManifestIndexQueryUtils.queryMinSdkAndTargetSdkFromManifestIndex;
+import static com.android.tools.idea.util.DumbServiceUtilKt.uiSafeRunReadActionInSmartMode;
 
 import com.android.sdklib.AndroidVersion;
 import com.android.tools.idea.projectsystem.ProjectSystemUtil;
@@ -157,8 +158,8 @@
     }
 
     try {
-      return DumbService.getInstance(facet.getModule().getProject())
-        .runReadActionInSmartMode(() -> queryMinSdkAndTargetSdkFromManifestIndex(facet).getMinSdk());
+      return uiSafeRunReadActionInSmartMode(facet.getModule().getProject(),
+                                            () -> queryMinSdkAndTargetSdkFromManifestIndex(facet).getMinSdk());
     }
     catch (IndexNotReadyException e) {
       // TODO(147116755): runReadActionInSmartMode doesn't work if we already have read access.
@@ -185,8 +186,8 @@
     }
 
     try {
-      return DumbService.getInstance(facet.getModule().getProject())
-        .runReadActionInSmartMode(() -> queryMinSdkAndTargetSdkFromManifestIndex(facet).getTargetSdk());
+      return uiSafeRunReadActionInSmartMode(facet.getModule().getProject(),
+                                            () -> queryMinSdkAndTargetSdkFromManifestIndex(facet).getTargetSdk());
     }
     catch (IndexNotReadyException e) {
       // TODO(147116755): runReadActionInSmartMode doesn't work if we already have read access.
diff --git a/android/src/com/android/tools/idea/project/DefaultModuleSystem.kt b/android/src/com/android/tools/idea/project/DefaultModuleSystem.kt
index f671e9b..3bec512 100644
--- a/android/src/com/android/tools/idea/project/DefaultModuleSystem.kt
+++ b/android/src/com/android/tools/idea/project/DefaultModuleSystem.kt
@@ -53,6 +53,7 @@
 import com.android.tools.idea.util.androidFacet
 import com.android.tools.idea.util.toIoFile
 import com.android.tools.idea.util.toPathString
+import com.android.tools.idea.util.uiSafeRunReadActionInSmartMode
 import com.android.tools.module.ModuleDependencies
 import com.android.utils.reflection.qualifiedName
 import com.google.common.collect.ImmutableList
@@ -277,12 +278,12 @@
   override val isDebuggable: Boolean
     get() {
       try {
-        return DumbService.getInstance(module.project)
-          .runReadActionInSmartMode<Boolean?> {
-            val queryIndex =
-              ThrowableComputable<Boolean?, IndexNotReadyException> { module.androidFacet?.queryApplicationDebuggableFromManifestIndex() }
-            SlowOperations.allowSlowOperations(queryIndex)
-          } ?: false
+        return uiSafeRunReadActionInSmartMode(module.project
+        ) {
+          val queryIndex =
+            ThrowableComputable<Boolean?, IndexNotReadyException> { module.androidFacet?.queryApplicationDebuggableFromManifestIndex() }
+          SlowOperations.allowSlowOperations(queryIndex)
+        } ?: false
       } catch (e: IndexNotReadyException) {
         // TODO(147116755): runReadActionInSmartMode doesn't work if we already have read access.
         //  We need to refactor the callers of this to require a *smart*
@@ -329,8 +330,8 @@
   // Reading from indexes may be slow and in non-blocking read actions we prefer to give priority to
   // write actions.
   ProgressManager.checkCanceled()
-  return DumbService.getInstance(module.project).runReadActionInSmartMode(Computable { getPackageNameFromIndex(facet) })
-    ?: getPackageNameByParsingPrimaryManifest(facet)
+  return uiSafeRunReadActionInSmartMode(module.project) { getPackageNameFromIndex(facet) }
+         ?: getPackageNameByParsingPrimaryManifest(facet)
 }
 
 private fun getPackageNameFromIndex(facet: AndroidFacet): String? {
diff --git a/android/src/com/android/tools/idea/res/DynamicValueResourceRepository.java b/android/src/com/android/tools/idea/res/DynamicValueResourceRepository.java
index eb818e7..6656d0c 100644
--- a/android/src/com/android/tools/idea/res/DynamicValueResourceRepository.java
+++ b/android/src/com/android/tools/idea/res/DynamicValueResourceRepository.java
@@ -30,7 +30,6 @@
 import com.google.common.collect.LinkedListMultimap;
 import com.google.common.collect.ListMultimap;
 import com.intellij.openapi.Disposable;
-import com.intellij.openapi.application.ReadAction;
 import com.intellij.openapi.util.Disposer;
 import com.intellij.openapi.vfs.VirtualFile;
 import java.util.EnumMap;
@@ -180,7 +179,7 @@
   @NotNull
   private Map<ResourceType, ListMultimap<String, ResourceItem>> getResourceTable() {
     if (myResourceTable.isEmpty()) {
-      AndroidModel androidModel = ReadAction.compute(() -> AndroidModel.get(myFacet.getModule()));
+      AndroidModel androidModel = AndroidModel.get(myFacet.getModule());
       if (androidModel != null) {
         addValues(androidModel.getResValues());
       }
diff --git a/android/src/com/android/tools/idea/res/ProjectLightResourceClassService.kt b/android/src/com/android/tools/idea/res/ProjectLightResourceClassService.kt
index 421b4ea..f822596 100644
--- a/android/src/com/android/tools/idea/res/ProjectLightResourceClassService.kt
+++ b/android/src/com/android/tools/idea/res/ProjectLightResourceClassService.kt
@@ -40,14 +40,17 @@
 import com.google.common.collect.Multimap
 import com.google.common.collect.Multimaps
 import com.intellij.facet.ProjectFacetManager
+import com.intellij.openapi.application.ApplicationManager
 import com.intellij.openapi.application.invokeAndWaitIfNeeded
 import com.intellij.openapi.module.Module
 import com.intellij.openapi.module.ModuleUtilCore
 import com.intellij.openapi.project.Project
 import com.intellij.openapi.roots.ProjectRootManager
 import com.intellij.openapi.roots.libraries.Library
-import com.intellij.openapi.roots.libraries.LibraryTable
 import com.intellij.openapi.roots.libraries.LibraryTablesRegistrar
+import com.intellij.platform.backend.workspace.WorkspaceModelChangeListener
+import com.intellij.platform.backend.workspace.WorkspaceModelTopics
+import com.intellij.platform.workspace.storage.VersionedStorageChange
 import com.intellij.psi.PsiClass
 import com.intellij.psi.PsiManager
 import com.intellij.psi.PsiPackage
@@ -148,26 +151,34 @@
         )
 
     // Light classes for AARs store a reference to the Library in UserData. These Library instances
-    // can become stale during sync, which
-    // confuses Kotlin (consumer of the information in UserData). Invalidate the AAR R classes cache
-    // when the library table changes.
-    LibraryTablesRegistrar.getInstance()
-      .getLibraryTable(project)
-      .addListener(
-        object : LibraryTable.Listener {
-          override fun afterLibraryAdded(newLibrary: Library) = dropAarClassesCache()
+    // can become stale during sync, which confuses Kotlin (consumer of the information in
+    // UserData). Invalidate the AAR R classes cache when the library table changes.
+    connection.subscribe(
+      WorkspaceModelTopics.CHANGED,
+      object : WorkspaceModelChangeListener {
+        var invalidationScheduled = false
 
-          override fun afterLibraryRenamed(library: Library, oldName: String?) =
-            dropAarClassesCache()
-
-          override fun afterLibraryRemoved(library: Library) = dropAarClassesCache()
-
-          private fun dropAarClassesCache() {
+        override fun beforeChanged(event: VersionedStorageChange) {
+          // There are already plenty of cache invalidation handlers listening on workspace model
+          // change events even in base IntelliJ, and they have ordering interdependencies, so
+          // don't try to dropPsiCaches until the state has settled. Otherwise, invalidating
+          // some cache could make it access another cache that has already been invalidated
+          // by the event that we're handling right now.
+          if (invalidationScheduled) return
+          invalidationScheduled = true // should already be on the EDT, no atomics required
+          ApplicationManager.getApplication().invokeLater {
+            invalidationScheduled = false
+            if (project.isDisposed) return@invokeLater
+            // TODO? can actually extract affected libraries from the event for more granularity.
+            //   It's easier to do by listening on `LibraryInfoListener.TOPIC` instead, which is
+            //   emitted when LibraryInfoCache is partially invalidated, and contains a list of
+            //   invalidated `LibraryInfo`s - just have to reverse `findIdeaLibrary` on them.
             aarClassesCache.invalidateAll()
             PsiManager.getInstance(project).dropPsiCaches()
           }
         }
-      )
+      },
+    )
   }
 
   override fun getLightRClasses(qualifiedName: String, scope: GlobalSearchScope): List<PsiClass> {
@@ -254,6 +265,8 @@
 
       val module = facet.module
       val moduleSystem = module.getModuleSystem()
+      if (!moduleSystem.supportsAndroidResources) return@getAndUnwrap ResourceClasses.Empty
+
       val transitivity =
         if (moduleSystem.isRClassTransitive) Transitivity.TRANSITIVE
         else Transitivity.NON_TRANSITIVE
diff --git a/android/src/com/android/tools/idea/res/PsiResourceItem.java b/android/src/com/android/tools/idea/res/PsiResourceItem.java
index 65806d7..f1dc666 100644
--- a/android/src/com/android/tools/idea/res/PsiResourceItem.java
+++ b/android/src/com/android/tools/idea/res/PsiResourceItem.java
@@ -213,10 +213,6 @@
     mySourceFile = sourceFile;
   }
 
-  /**
-   * GETTER WITH SIDE EFFECTS that registers we have taken an interest in this value
-   * so that if the value changes we will get a resource changed event fire.
-   */
   @Override
   @Nullable
   public ResourceValue getResourceValue() {
diff --git a/android/src/com/android/tools/idea/res/StudioResourceRepositoryManager.java b/android/src/com/android/tools/idea/res/StudioResourceRepositoryManager.java
index b401511..c737c7f 100644
--- a/android/src/com/android/tools/idea/res/StudioResourceRepositoryManager.java
+++ b/android/src/com/android/tools/idea/res/StudioResourceRepositoryManager.java
@@ -45,7 +45,7 @@
 import com.google.common.util.concurrent.UncheckedExecutionException;
 import com.intellij.openapi.Disposable;
 import com.intellij.openapi.application.ApplicationManager;
-import com.intellij.openapi.application.ReadAction;
+import com.intellij.openapi.components.Service;
 import com.intellij.openapi.module.Module;
 import com.intellij.openapi.module.ModuleUtilCore;
 import com.intellij.openapi.progress.ProcessCanceledException;
@@ -67,12 +67,17 @@
 import java.util.SortedSet;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
 import java.util.function.Function;
 import org.jetbrains.android.facet.AndroidFacet;
 import org.jetbrains.android.sdk.AndroidPlatforms;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
+import org.jetbrains.annotations.TestOnly;
+import org.jetbrains.annotations.VisibleForTesting;
 
 public final class StudioResourceRepositoryManager implements Disposable, ResourceRepositoryManager {
   private static final Key<StudioResourceRepositoryManager> KEY = Key.create(StudioResourceRepositoryManager.class.getName());
@@ -589,22 +594,25 @@
       }
     }
 
-    for (LocalResourceRepository<VirtualFile> repository : removedRepositories) {
-      // Reset is done separately from disposal, since reset isn't needed in all disposal scenarios. Specifically,
-      // there are ways these repositories can be disposed:
-      //  1. This reset method.
-      //  2. When the owning facet is disposed.
-      // In the second case, a "roots updated" notification will be sent to any dependent modules, which will cause
-      // them to recalculate their children and remove any outdated references. So only the first case (this reset
-      // method) requires explicitly notifying those same parent repositories that their children are out of date and
-      // need to be refreshed.
-      if (StudioFlags.RESOURCE_REPOSITORY_NOTIFY_PARENT_ON_DISPOSE.get()) {
-        // Notifying parents is flagged in case this new change has any unexpected side effects.
-        repository.notifyParentsOfReset();
+    // Reset is done separately from disposal, since reset isn't needed in all disposal scenarios. Specifically,
+    // there are ways these repositories can be disposed:
+    //  1. This reset method.
+    //  2. When the owning facet is disposed.
+    // In the second case, a "roots updated" notification will be sent to any dependent modules, which will cause
+    // them to recalculate their children and remove any outdated references. So only the first case (this reset
+    // method) requires explicitly notifying those same parent repositories that their children are out of date and
+    // need to be refreshed.
+    if (StudioFlags.RESOURCE_REPOSITORY_NOTIFY_PARENT_ON_DISPOSE.get()) {
+      // Notifying parents is flagged in case this new change has any unexpected side effects.
+      DisposeAndRefreshService disposeAndRefreshService = DisposeAndRefreshService.getInstance();
+      for (LocalResourceRepository<VirtualFile> repository : removedRepositories) {
+        disposeAndRefreshService.disposeAndNotifyParents(repository);
       }
-
-      if (repository instanceof Disposable disposable) {
-        Disposer.dispose(disposable);
+    } else {
+      for (LocalResourceRepository<VirtualFile> repository : removedRepositories) {
+        if (repository instanceof Disposable disposable) {
+          Disposer.dispose(disposable);
+        }
       }
     }
   }
@@ -686,7 +694,7 @@
       return ResourceNamespace.RES_AUTO;
     }
 
-    String packageName = ReadAction.compute(() -> ProjectSystemUtil.getModuleSystem(myFacet).getPackageName());
+    String packageName = ProjectSystemUtil.getModuleSystem(myFacet).getPackageName();
     if (packageName == null) {
       return ResourceNamespace.RES_AUTO;
     }
@@ -853,4 +861,54 @@
 
   private record LocalesAndLanguages(@NotNull ImmutableList<Locale> locales, @NotNull ImmutableSortedSet<String> languages) {
   }
+
+  /**
+   * Service responsible for disposing repositories that have been reset and notifying their parents, so that the
+   * parents can refresh themselves.
+   * <p>
+   * Disposal and notification is done on a single background thread to ensure that various repositories aren't
+   * resetting concurrently, which may lead to deadlock. The service is APP-level rather than SERVICE-level since many
+   * of the locks involved are static objects, and thus application-wide.
+   */
+  @Service
+  @VisibleForTesting
+  final static class DisposeAndRefreshService implements Disposable {
+
+    private final ExecutorService executor = Executors.newSingleThreadExecutor();
+
+    @Override
+    public void dispose() {
+      executor.shutdown();
+    }
+
+    public void disposeAndNotifyParents(LocalResourceRepository<VirtualFile> repository) {
+      if (repository instanceof Disposable disposable) {
+        // Take over ownership of the disposable.
+        Disposer.register(this, disposable);
+      }
+
+      // Store the repository and schedule cleanup.
+      executor.submit(() -> doDisposeAndNotify(repository));
+    }
+
+    private void doDisposeAndNotify(LocalResourceRepository<VirtualFile> repository) {
+      if (repository instanceof Disposable disposable) {
+        Disposer.dispose(disposable);
+      }
+
+      repository.notifyParentsOfReset();
+    }
+
+    @TestOnly
+    public boolean waitForRunningTasks(long timeout, TimeUnit unit) throws InterruptedException {
+      Semaphore semaphore = new Semaphore(0);
+      executor.submit((Runnable)semaphore::release);
+
+      return semaphore.tryAcquire(timeout, unit);
+    }
+
+    public static DisposeAndRefreshService getInstance() {
+      return ApplicationManager.getApplication().getService(DisposeAndRefreshService.class);
+    }
+  }
 }
diff --git a/android/src/com/android/tools/idea/run/OWNERS b/android/src/com/android/tools/idea/run/OWNERS
new file mode 100644
index 0000000..ecc3417
--- /dev/null
+++ b/android/src/com/android/tools/idea/run/OWNERS
@@ -0,0 +1 @@
+include platform/tools/base:/owners/deploy_OWNERS
diff --git a/android/src/com/android/tools/idea/run/PreferGradleMake.kt b/android/src/com/android/tools/idea/run/PreferGradleMake.kt
index c45b960..af8538c 100644
--- a/android/src/com/android/tools/idea/run/PreferGradleMake.kt
+++ b/android/src/com/android/tools/idea/run/PreferGradleMake.kt
@@ -15,9 +15,6 @@
  */
 package com.android.tools.idea.run
 
-import com.android.tools.idea.gradle.project.build.invoker.TestCompileType
-
 // Gradle-aware Make marker interface
 interface PreferGradleMake {
-  val testCompileMode: TestCompileType get() = TestCompileType.NONE
 }
\ No newline at end of file
diff --git a/android/src/com/android/tools/idea/run/activity/DefaultActivityLocator.java b/android/src/com/android/tools/idea/run/activity/DefaultActivityLocator.java
index fe08e47..000098a 100644
--- a/android/src/com/android/tools/idea/run/activity/DefaultActivityLocator.java
+++ b/android/src/com/android/tools/idea/run/activity/DefaultActivityLocator.java
@@ -89,6 +89,7 @@
    * Retrieves the list of activities from the merged manifest of the Android module
    * corresponding to the given facet.
    */
+  @WorkerThread
   @VisibleForTesting
   public static List<ActivityWrapper> getActivitiesFromMergedManifest(@NotNull final AndroidFacet facet) {
     return DumbService.getInstance(facet.getModule().getProject()).runReadActionInSmartMode(() -> getActivitiesFromManifestIndex(facet));
diff --git a/android/src/com/android/tools/idea/run/deployment/liveedit/OWNERS b/android/src/com/android/tools/idea/run/deployment/liveedit/OWNERS
deleted file mode 100644
index f28ef6d..0000000
--- a/android/src/com/android/tools/idea/run/deployment/liveedit/OWNERS
+++ /dev/null
@@ -1,8 +0,0 @@
-acleung@google.com
-dunno@google.com
-noahz@google.com
-sanglardf@google.com
-
-# IntelliJ Platform SDK merges
-gharrma@google.com
-ralucas@google.com
diff --git a/android/src/com/android/tools/idea/run/deployment/selector/DeploymentTargetDevicesService.kt b/android/src/com/android/tools/idea/run/deployment/selector/DeploymentTargetDevicesService.kt
index 5592e65..45946da 100644
--- a/android/src/com/android/tools/idea/run/deployment/selector/DeploymentTargetDevicesService.kt
+++ b/android/src/com/android/tools/idea/run/deployment/selector/DeploymentTargetDevicesService.kt
@@ -18,9 +18,8 @@
 import com.android.ddmlib.AndroidDebugBridge
 import com.android.sdklib.deviceprovisioner.DeviceHandle
 import com.android.sdklib.deviceprovisioner.DeviceId
+import com.android.sdklib.deviceprovisioner.DeviceState
 import com.android.sdklib.deviceprovisioner.DeviceTemplate
-import com.android.sdklib.deviceprovisioner.SetChange
-import com.android.sdklib.deviceprovisioner.trackSetChanges
 import com.android.tools.idea.concurrency.AndroidCoroutineScope
 import com.android.tools.idea.deviceprovisioner.DeviceProvisionerService
 import com.android.tools.idea.run.DeviceHandleAndroidDevice
@@ -100,24 +99,23 @@
 
   override fun dispose() {}
 
-  private val connectionTimes = ConcurrentHashMap<DeviceId, Instant>()
+  /** The flattened state of a DeviceHandle that is needed to create a DeploymentTargetDevice. */
+  private data class DeviceHandleState(
+    val handle: DeviceHandle,
+    val state: DeviceState,
+    val connectionTime: Instant?,
+  )
 
-  private fun deviceHandleFlow(
-    ddmlibDeviceLookup: DdmlibDeviceLookup,
-    launchCompatibilityChecker: LaunchCompatibilityChecker,
-  ): Flow<List<DeploymentTargetDevice>> = channelFlow {
-    val handles = ConcurrentHashMap<DeviceHandle, Optional<DeploymentTargetDevice>>()
-    // Immediately send empty list, since if the actual list is empty, there will be no Add,
-    // and we don't want to be stuck in the Loading state.
-    send(emptyList())
-    devicesFlow
-      .map { it.toSet() }
-      .trackSetChanges()
-      .collect {
-        when (it) {
-          is SetChange.Add -> {
-            val handle = it.value
-            // Create a slot for the handle, to be filled in by a coroutine tracking the handle
+  /** A StateFlow that tracks DeviceHandles to build [DeviceHandleState]s. */
+  private val deviceStateFlow: StateFlow<List<DeviceHandleState>> =
+    channelFlow {
+        val connectionTimes = ConcurrentHashMap<DeviceId, Instant>()
+        val handles = ConcurrentHashMap<DeviceHandle, Optional<DeviceHandleState>>()
+        devicesFlow.collect { newHandles ->
+          val removed = handles.keys - newHandles
+          val added = newHandles - handles.keys
+          for (handle in added) {
+            // Create a slot for the handle, to be filled in by the coroutine tracking the handle
             handles[handle] = Optional.empty()
             handle.scope.launch {
               handle.stateFlow.collect { state ->
@@ -128,29 +126,43 @@
                     connectionTimes.remove(handle.id)
                     null
                   }
-                // Don't update the handle if it has already been removed. (We can reach this point
-                // after processing SetChange.Remove, and must not undo the remove.)
+                // Don't update the handle if it has already been removed. (We can reach this
+                // point after the removal, and must not undo the remove.)
                 if (handles.containsKey(handle)) {
-                  val targetDevice =
-                    DeploymentTargetDevice.create(
-                      DeviceHandleAndroidDevice(ddmlibDeviceLookup, handle, state),
-                      connectionTime,
-                      launchCompatibilityChecker,
-                    )
-                  handles.computeIfPresent(handle) { _, _ -> Optional.of(targetDevice) }
+                  handles.computeIfPresent(handle) { _, _ ->
+                    Optional.of(DeviceHandleState(handle, state, connectionTime))
+                  }
+                  send(handles.values.mapNotNull { it.orNull() })
                 }
-                send(handles.values.mapNotNull { it.orNull() })
               }
             }
           }
-          is SetChange.Remove -> {
-            handles.remove(it.value)
-            connectionTimes.remove(it.value.id)
-            send(handles.values.mapNotNull { it.orNull() })
+          for (handle in removed) {
+            handles.remove(handle)
+            connectionTimes.remove(handle.id)
           }
+          send(handles.values.mapNotNull { it.orNull() })
         }
       }
-  }
+      .stateIn(scope = coroutineScope, SharingStarted.Eagerly, emptyList())
+
+  /**
+   * Provides a flow of DeploymentTargetDevice based on DeviceHandles, by combining the
+   * deviceStateFlow with the current ADB and LaunchCompatibilityChecker.
+   */
+  private fun deviceHandleFlow(
+    ddmlibDeviceLookup: DdmlibDeviceLookup,
+    launchCompatibilityChecker: LaunchCompatibilityChecker,
+  ): Flow<List<DeploymentTargetDevice>> =
+    deviceStateFlow.map {
+      it.map {
+        DeploymentTargetDevice.create(
+          DeviceHandleAndroidDevice(ddmlibDeviceLookup, it.handle, it.state),
+          it.connectionTime,
+          launchCompatibilityChecker,
+        )
+      }
+    }
 
   private fun deviceTemplateFlow(
     ddmlibDeviceLookup: DdmlibDeviceLookup,
diff --git a/android/src/com/android/tools/idea/sdk/SdkWritingAccessProvider.kt b/android/src/com/android/tools/idea/sdk/SdkWritingAccessProvider.kt
index a2c3b35..894673b 100644
--- a/android/src/com/android/tools/idea/sdk/SdkWritingAccessProvider.kt
+++ b/android/src/com/android/tools/idea/sdk/SdkWritingAccessProvider.kt
@@ -16,18 +16,25 @@
 package com.android.tools.idea.sdk
 
 import com.intellij.openapi.project.Project
+import com.intellij.openapi.util.ThrowableComputable
 import com.intellij.openapi.vfs.VirtualFile
 import com.intellij.openapi.vfs.WritingAccessProvider
+import com.intellij.util.SlowOperations
 
 /** Marks Android SDK sources as read-only to prevent accidental edits. */
 class SdkWritingAccessProvider(private val project: Project) : WritingAccessProvider() {
 
   override fun requestWriting(files: Collection<VirtualFile>): Collection<VirtualFile> {
-    return files.filter { file -> AndroidSdks.getInstance().isInAndroidSdk(project, file) }
+    return files.filter(::isInAndroidSdk)
   }
 
   override fun isPotentiallyWritable(file: VirtualFile): Boolean {
-    return !AndroidSdks.getInstance().isInAndroidSdk(project, file)
+    return !isInAndroidSdk(file)
+  }
+
+  private fun isInAndroidSdk(file: VirtualFile): Boolean {
+    return SlowOperations.allowSlowOperations(ThrowableComputable {
+      AndroidSdks.getInstance().isInAndroidSdk(project, file)
+    })
   }
 }
-
diff --git a/android/src/com/android/tools/idea/startup/AndroidPluginInitializer.java b/android/src/com/android/tools/idea/startup/AndroidPluginInitializer.java
deleted file mode 100644
index ab9c223..0000000
--- a/android/src/com/android/tools/idea/startup/AndroidPluginInitializer.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2020 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.tools.idea.startup;
-
-import com.intellij.analytics.AndroidStudioAnalytics;
-import com.intellij.ide.ApplicationLoadListener;
-import com.intellij.openapi.application.Application;
-import java.nio.file.Path;
-import org.jetbrains.annotations.NotNull;
-
-/**
- * Initialization code common between Android Studio and Android plugin in IntelliJ.
- */
-@SuppressWarnings("UnstableApiUsage")
-public class AndroidPluginInitializer implements ApplicationLoadListener {
-  @Override
-  public void beforeApplicationLoaded(@NotNull Application application, @NotNull Path configPath) {
-    AndroidStudioAnalytics.initialize(new AndroidStudioAnalyticsImpl());
-  }
-}
diff --git a/android/src/com/android/tools/idea/startup/AndroidSdkInitializer.kt b/android/src/com/android/tools/idea/startup/AndroidSdkInitializer.kt
deleted file mode 100644
index 99e3928..0000000
--- a/android/src/com/android/tools/idea/startup/AndroidSdkInitializer.kt
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.tools.idea.startup
-
-import com.android.tools.idea.flags.StudioFlags
-import com.android.tools.idea.sdk.IdeSdks
-import com.intellij.ide.ApplicationInitializedListener
-import com.intellij.openapi.application.invokeLater
-import com.intellij.openapi.diagnostic.thisLogger
-import kotlinx.coroutines.CoroutineScope
-import org.jetbrains.android.sdk.AndroidSdkUtils
-import java.util.Locale
-
-class AndroidSdkInitializer : ApplicationInitializedListener {
-  override suspend fun execute(asyncScope: CoroutineScope) {
-    val androidPlatformToCreate = StudioFlags.ANDROID_PLATFORM_TO_AUTOCREATE.get()
-    if (androidPlatformToCreate == 0) return
-
-    val androidSdkPath = IdeSdks.getInstance().androidSdkPath ?: return
-
-    thisLogger().info("Automatically creating an Android platform using SDK path $androidSdkPath and SDK version $androidPlatformToCreate")
-    invokeLater {
-      AndroidSdkUtils.createNewAndroidPlatform(androidSdkPath.toString())
-    }
-  }
-}
diff --git a/android/src/com/android/tools/idea/startup/AndroidStudioInitializer.java b/android/src/com/android/tools/idea/startup/AndroidStudioInitializer.java
deleted file mode 100644
index 4fb5447..0000000
--- a/android/src/com/android/tools/idea/startup/AndroidStudioInitializer.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.tools.idea.startup;
-
-import com.android.prefs.AndroidLocationsSingleton;
-import com.android.sdklib.repository.AndroidSdkHandler;
-import com.android.tools.adtui.webp.WebpMetadata;
-import com.android.tools.analytics.UsageTracker;
-import com.android.tools.idea.analytics.IdeBrandProviderKt;
-import com.android.tools.idea.analytics.SystemInfoStatsMonitor;
-import com.android.tools.idea.diagnostics.AndroidStudioSystemHealthMonitor;
-import com.android.tools.idea.res.StudioCodeVersionAdapter;
-import com.android.tools.idea.sdk.IdeSdks;
-import com.android.tools.idea.stats.AndroidStudioUsageTracker;
-import com.android.tools.idea.stats.ConsentDialog;
-import com.intellij.analytics.AndroidStudioAnalytics;
-import com.intellij.concurrency.JobScheduler;
-import com.intellij.ide.ApplicationInitializedListenerJavaShim;
-import com.intellij.openapi.application.ApplicationInfo;
-import com.intellij.openapi.application.ApplicationManager;
-
-/**
- * Performs Android Studio specific initialization tasks that are build-system-independent.
- * <p>
- * <strong>Note:</strong> Do not add any additional tasks unless it is proven that the tasks are common to all IDEs. Use
- * {@link GradleSpecificInitializer} instead.
- * </p>
- */
-public class AndroidStudioInitializer extends ApplicationInitializedListenerJavaShim {
-
-  @Override
-  public void componentsInitialized() {
-    setupAnalytics();
-
-    // Initialize System Health Monitor after Analytics.
-    ApplicationManager.getApplication().executeOnPooledThread(() -> {
-      AndroidStudioSystemHealthMonitor.getInstance().start();
-    });
-
-    // TODO: Remove this once the issue has been properly fixed in the IntelliJ platform
-    //  see https://youtrack.jetbrains.com/issue/IDEA-316037
-    // Automatic registration of WebP support through the WebP plugin can fail
-    // because of a race condition in the creation of IIORegistry.
-    // Trying again here ensures that the WebP support is correctly registered.
-    WebpMetadata.ensureWebpRegistered();
-
-    if (IdeSdks.getInstance().getAndroidSdkPath() != null) {
-      AndroidSdkHandler handler =
-        AndroidSdkHandler.getInstance(AndroidLocationsSingleton.INSTANCE, IdeSdks.getInstance().getAndroidSdkPath().toPath());
-      // We need to start the system info monitoring even in case when user never
-      // runs a single emulator instance: e.g., incompatible hypervisor might be
-      // the reason why emulator is never run, and that's exactly the data
-      // SystemInfoStatsMonitor collects
-      new SystemInfoStatsMonitor().start();
-    }
-
-    StudioCodeVersionAdapter.initialize();
-  }
-
-  /** Sets up collection of Android Studio specific analytics. */
-  private static void setupAnalytics() {
-    AndroidStudioAnalytics.getInstance().initializeAndroidStudioUsageTrackerAndPublisher();
-
-    ConsentDialog.showConsentDialogIfNeeded();
-
-    ApplicationInfo application = ApplicationInfo.getInstance();
-    UsageTracker.setVersion(application.getStrictVersion());
-    UsageTracker.setIdeBrand(IdeBrandProviderKt.currentIdeBrand());
-    if (ApplicationManager.getApplication().isInternal()) {
-      UsageTracker.setIdeaIsInternal(true);
-    }
-    AndroidStudioUsageTracker.setup(JobScheduler.getScheduler());
-  }
-}
diff --git a/android/src/com/android/tools/idea/startup/AndroidStudioInitializer.kt b/android/src/com/android/tools/idea/startup/AndroidStudioInitializer.kt
new file mode 100644
index 0000000..50af121
--- /dev/null
+++ b/android/src/com/android/tools/idea/startup/AndroidStudioInitializer.kt
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2015 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.tools.idea.startup
+
+import com.android.prefs.AndroidLocationsSingleton
+import com.android.sdklib.repository.AndroidSdkHandler
+import com.android.tools.adtui.webp.WebpMetadata
+import com.android.tools.analytics.UsageTracker
+import com.android.tools.idea.analytics.SystemInfoStatsMonitor
+import com.android.tools.idea.analytics.currentIdeBrand
+import com.android.tools.idea.diagnostics.AndroidStudioSystemHealthMonitor
+import com.android.tools.idea.flags.StudioFlags
+import com.android.tools.idea.res.StudioCodeVersionAdapter
+import com.android.tools.idea.sdk.IdeSdks
+import com.android.tools.idea.stats.AndroidStudioUsageTracker
+import com.android.tools.idea.stats.ConsentDialog
+import com.intellij.analytics.AndroidStudioAnalytics
+import com.intellij.concurrency.JobScheduler
+import com.intellij.ide.ApplicationInitializedListener
+import com.intellij.openapi.application.ApplicationInfo
+import com.intellij.openapi.application.ApplicationManager
+import com.intellij.openapi.application.invokeLater
+import com.intellij.openapi.diagnostic.thisLogger
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.launch
+import org.jetbrains.android.sdk.AndroidSdkUtils
+
+/**
+ * Performs Android Studio specific initialization tasks that are build-system-independent.
+ *
+ * **Note:** Do not add any additional tasks unless it is proven that the tasks are common to all IDEs. Use
+ * GradleSpecificInitializer instead.
+ */
+class AndroidStudioInitializer : ApplicationInitializedListener {
+
+  // Note: this code runs quite early during IDE startup and directly impacts startup time. If possible,
+  // prefer to initialize later (e.g. during first project open) or lazily (upon first access to your service).
+  override suspend fun execute(asyncScope: CoroutineScope) {
+    setupAnalytics()
+
+    // Initialize System Health Monitor after Analytics.
+    asyncScope.launch {
+      AndroidStudioSystemHealthMonitor.getInstance().start()
+    }
+
+    // TODO: Remove this once the issue has been properly fixed in the IntelliJ platform
+    //  see https://youtrack.jetbrains.com/issue/IDEA-316037
+    // Automatic registration of WebP support through the WebP plugin can fail
+    // because of a race condition in the creation of IIORegistry.
+    // Trying again here ensures that the WebP support is correctly registered.
+    WebpMetadata.ensureWebpRegistered()
+
+    // We need to start the system info monitoring even in case when user never
+    // runs a single emulator instance: e.g., incompatible hypervisor might be
+    // the reason why emulator is never run, and that's exactly the data
+    // SystemInfoStatsMonitor collects
+    SystemInfoStatsMonitor().start()
+
+    StudioCodeVersionAdapter.initialize()
+
+    setupAndroidSdkForTests()
+  }
+
+  /** Sets up collection of Android Studio specific analytics.  */
+  private fun setupAnalytics() {
+    AndroidStudioAnalytics.getInstance().initializeAndroidStudioUsageTrackerAndPublisher()
+
+    ConsentDialog.showConsentDialogIfNeeded()
+
+    UsageTracker.version = ApplicationInfo.getInstance().strictVersion
+    UsageTracker.ideBrand = currentIdeBrand()
+    if (ApplicationManager.getApplication().isInternal) {
+      UsageTracker.ideaIsInternal = true
+    }
+    AndroidStudioUsageTracker.setup(JobScheduler.getScheduler())
+  }
+
+  private fun setupAndroidSdkForTests() {
+    val androidPlatformToCreate = StudioFlags.ANDROID_PLATFORM_TO_AUTOCREATE.get()
+    if (androidPlatformToCreate == 0) return
+
+    val androidSdkPath = IdeSdks.getInstance().androidSdkPath ?: return
+
+    thisLogger().info("Automatically creating an Android platform using SDK path $androidSdkPath and SDK version $androidPlatformToCreate")
+    invokeLater {
+      AndroidSdkUtils.createNewAndroidPlatform(androidSdkPath.toString())
+    }
+  }
+}
diff --git a/android/src/com/android/tools/idea/testartifacts/instrumented/AndroidTestRunConfiguration.java b/android/src/com/android/tools/idea/testartifacts/instrumented/AndroidTestRunConfiguration.java
index b545982..a2f7498 100644
--- a/android/src/com/android/tools/idea/testartifacts/instrumented/AndroidTestRunConfiguration.java
+++ b/android/src/com/android/tools/idea/testartifacts/instrumented/AndroidTestRunConfiguration.java
@@ -24,7 +24,6 @@
 import static com.intellij.openapi.util.text.StringUtil.isEmptyOrSpaces;
 import static com.intellij.openapi.util.text.StringUtil.isNotEmpty;
 
-import com.android.tools.idea.gradle.project.build.invoker.TestCompileType;
 import com.android.tools.idea.model.AndroidModel;
 import com.android.tools.idea.model.TestExecutionOption;
 import com.android.tools.idea.model.TestOptions;
@@ -251,12 +250,6 @@
     return true;
   }
 
-  @NotNull
-  @Override
-  public TestCompileType getTestCompileMode() {
-    return TestCompileType.ANDROID_TESTS;
-  }
-
   private List<ValidationError> checkTestMethod() {
     JavaRunConfigurationModule configurationModule = getConfigurationModule();
     final PsiClass testClass;
diff --git a/android/src/com/android/tools/idea/util/DumbServiceUtil.kt b/android/src/com/android/tools/idea/util/DumbServiceUtil.kt
new file mode 100644
index 0000000..9876836
--- /dev/null
+++ b/android/src/com/android/tools/idea/util/DumbServiceUtil.kt
@@ -0,0 +1,43 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.tools.idea.util
+
+import com.intellij.openapi.application.ApplicationManager
+import com.intellij.openapi.application.runReadAction
+import com.intellij.openapi.project.DumbService
+import com.intellij.openapi.project.Project
+import com.intellij.openapi.util.Computable
+
+/**
+ * This is a workaround to a problem introduced by the Intellij 2023.3 merge. After the merge, with the new threading model, the UI thread
+ * might not have the read lock. When invoking [DumbService#runReadActionInSmartMode] from the UI thread, if it does not have the read lock, the method
+ * might decide to wait for smart mode in the UI thread causing a deadlock.
+ * [DumbService#runReadActionInSmartMode] checks if the thread has the read lock to avoid a deadlock, but it does not check if the call is
+ * happening from the UI thread.
+ * Calling [DumbService#runReadActionInSmartMode] from the UI thread should never happen, but we have a number of places where this does happen
+ * and freezes the IDE.
+ * This method is a workaround to the problem and should not have NEW usages.
+ */
+@Deprecated("Do not use this method, you should call DumbService.runReadActionInSmartMode from a worker thread instead")
+fun <T> uiSafeRunReadActionInSmartMode(project: Project, computable: Computable<T>): T {
+  if (ApplicationManager.getApplication().isDispatchThread && !ApplicationManager.getApplication().isReadAccessAllowed) {
+    return runReadAction {
+      DumbService.getInstance(project).runReadActionInSmartMode(computable)
+    }
+  }
+
+  return DumbService.getInstance(project).runReadActionInSmartMode(computable)
+}
\ No newline at end of file
diff --git a/android/src/org/jetbrains/android/actions/CreateXmlResourcePanelImpl.java b/android/src/org/jetbrains/android/actions/CreateXmlResourcePanelImpl.java
index 61fb3ac..312fe16 100644
--- a/android/src/org/jetbrains/android/actions/CreateXmlResourcePanelImpl.java
+++ b/android/src/org/jetbrains/android/actions/CreateXmlResourcePanelImpl.java
@@ -22,6 +22,8 @@
 import com.android.resources.ResourceFolderType;
 import com.android.resources.ResourceType;
 import com.android.tools.adtui.font.FontUtil;
+import com.android.tools.idea.projectsystem.AndroidModuleSystem;
+import com.android.tools.idea.projectsystem.ProjectSystemService;
 import com.android.tools.idea.res.AndroidDependenciesCache;
 import com.android.tools.idea.res.IdeResourceNameValidator;
 import com.android.tools.idea.res.IdeResourcesUtil;
@@ -157,8 +159,19 @@
     final Set<Module> modulesSet = new HashSet<>();
     modulesSet.add(module);
 
-    for (AndroidFacet depFacet : AndroidDependenciesCache.getAllAndroidDependencies(module, true)) {
-      modulesSet.add(depFacet.getModule());
+    AndroidModuleSystem moduleSystem =
+      ProjectSystemService.getInstance(module.getProject()).getProjectSystem().getModuleSystem(module);
+    if (moduleSystem.isRClassTransitive()) {
+      // If the module's R class is transitive, it makes sense that the resource can be created in a dependent module.
+      // If it's not, then the resource must be created only on the module defining the R class.
+      for (AndroidFacet depFacet : AndroidDependenciesCache.getAllAndroidDependencies(module, true)) {
+        Module depModule = depFacet.getModule();
+        AndroidModuleSystem depModuleSystem =
+          ProjectSystemService.getInstance(module.getProject()).getProjectSystem().getModuleSystem(depModule);
+        if (depModuleSystem.getSupportsAndroidResources()) {
+          modulesSet.add(depModule);
+        }
+      }
     }
 
     assert !modulesSet.isEmpty();
diff --git a/android/src/org/jetbrains/android/uipreview/EditorUtil.kt b/android/src/org/jetbrains/android/uipreview/EditorUtil.kt
index faf0d58..0c23613 100644
--- a/android/src/org/jetbrains/android/uipreview/EditorUtil.kt
+++ b/android/src/org/jetbrains/android/uipreview/EditorUtil.kt
@@ -21,8 +21,10 @@
 import com.intellij.openapi.fileEditor.FileEditorManager
 import com.intellij.openapi.fileEditor.OpenFileDescriptor
 import com.intellij.openapi.project.Project
+import com.intellij.openapi.util.ThrowableComputable
 import com.intellij.openapi.vfs.VirtualFile
 import com.intellij.psi.PsiManager
+import com.intellij.util.SlowOperations
 
 object EditorUtil {
   /**
@@ -50,6 +52,8 @@
     val psiFile = PsiManager.getInstance(project).findFile(file) ?: return
     val currentPane = ProjectView.getInstance(project).currentProjectViewPane ?: return
 
-    ProjectViewSelectInPaneTarget(project, currentPane, true).select(psiFile, false)
+    SlowOperations.allowSlowOperations(
+      ThrowableComputable { ProjectViewSelectInPaneTarget(project, currentPane, true).select(psiFile, false) }
+    )
   }
 }
\ No newline at end of file
diff --git a/android/src/org/jetbrains/android/util/DisposableUtils.kt b/android/src/org/jetbrains/android/util/DisposableUtils.kt
new file mode 100644
index 0000000..9bf04c6
--- /dev/null
+++ b/android/src/org/jetbrains/android/util/DisposableUtils.kt
@@ -0,0 +1,80 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+@file:JvmName("DisposableUtils")
+package org.jetbrains.android.util
+
+import com.intellij.openapi.Disposable
+import com.intellij.openapi.util.Disposer
+import com.intellij.util.containers.ContainerUtil
+import java.util.concurrent.atomic.AtomicBoolean
+
+/** Disposable that gets disposed when any of its parents is disposed. */
+open class MultiParentDisposable(vararg parents: Disposable) : Disposable {
+
+  private val parentAdapters = ContainerUtil.createLockFreeCopyOnWriteList<ParentAdapter>()
+  private val disposing = AtomicBoolean()
+
+  init {
+    require(parents.size >= 2) { "Use of this class with less than two disposable parents is a waste of resources" }
+    Disposer.register(this, Cleaner(parentAdapters))
+    for (parent in parents) {
+      parentAdapters.add(ParentAdapter(parent))
+    }
+  }
+
+  override fun dispose() {
+  }
+
+  private fun triggerDisposal() {
+    if (!disposing.getAndSet(true)) {
+      Disposer.dispose(this)
+    }
+  }
+
+  private inner class ParentAdapter(parent: Disposable) : Disposable {
+
+    init {
+      Disposer.register(parent, this)
+    }
+
+    override fun dispose() {
+      parentAdapters.remove(this)
+      triggerDisposal()
+    }
+  }
+
+  private class Cleaner(val disposables: List<Disposable>) : Disposable {
+
+    override fun dispose() {
+      while (disposables.isNotEmpty()) {
+        Disposer.dispose(disposables[0])
+      }
+    }
+  }
+}
+
+/**
+ * Executes [runnable] exactly once when the first of [disposables] is disposed. To avoid a memory
+ * leak, it is important to provide all disposables that on disposal should either trigger
+ * [runnable] or allow it to be garbage collected.
+ */
+fun runOnDisposalOfAnyOf(vararg disposables: Disposable, runnable: Runnable) {
+  object : MultiParentDisposable(*disposables) {
+    override fun dispose() {
+      runnable.run()
+    }
+  }
+}
diff --git a/android/testData/projects/minimalCatalogProject/app/build.gradle b/android/testData/projects/minimalCatalogProject/app/build.gradle
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/android/testData/projects/minimalCatalogProject/app/build.gradle
diff --git a/android/testData/projects/minimalCatalogProject/build.gradle b/android/testData/projects/minimalCatalogProject/build.gradle
new file mode 100644
index 0000000..09158f6
--- /dev/null
+++ b/android/testData/projects/minimalCatalogProject/build.gradle
@@ -0,0 +1,10 @@
+buildscript {
+  repositories {
+    // This will be populated by AndroidGradleTestCase
+  }
+}
+allprojects {
+  repositories {
+    // This will be populated by AndroidGradleTestCase
+  }
+}
diff --git a/android/testData/projects/minimalCatalogProject/gradle/libs.versions.toml b/android/testData/projects/minimalCatalogProject/gradle/libs.versions.toml
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/android/testData/projects/minimalCatalogProject/gradle/libs.versions.toml
diff --git a/android/testData/projects/simpleApplicationUnresolvedDependency/settings.gradle b/android/testData/projects/minimalCatalogProject/settings.gradle
similarity index 92%
rename from android/testData/projects/simpleApplicationUnresolvedDependency/settings.gradle
rename to android/testData/projects/minimalCatalogProject/settings.gradle
index e7b4def..9d495b3 100644
--- a/android/testData/projects/simpleApplicationUnresolvedDependency/settings.gradle
+++ b/android/testData/projects/minimalCatalogProject/settings.gradle
@@ -1 +1 @@
-include ':app'
+include ':app'
\ No newline at end of file
diff --git a/android/testData/projects/projectWithAppandLib/lib/build.gradle b/android/testData/projects/projectWithAppandLib/lib/build.gradle
index db4880e..030c99e 100644
--- a/android/testData/projects/projectWithAppandLib/lib/build.gradle
+++ b/android/testData/projects/projectWithAppandLib/lib/build.gradle
@@ -15,6 +15,8 @@
         proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
       }
     }
+    buildFeatures {
+    }
 }
 
 dependencies {
diff --git a/android/testData/projects/psdSample/Groovy/app/build.gradle b/android/testData/projects/psdSample/Groovy/app/build.gradle
index f851689..b551118 100644
--- a/android/testData/projects/psdSample/Groovy/app/build.gradle
+++ b/android/testData/projects/psdSample/Groovy/app/build.gradle
@@ -72,6 +72,9 @@
             matchingFallbacks = ['release', 'debug']
             versionNameSuffix "vnsSpecial"
         }
+        debug {
+            pseudoLocalesEnabled = true
+        }
     }
     flavorDimensions 'foo', 'bar'
     productFlavors {
diff --git a/android/testData/projects/psdSample/Kotlin/app/build.gradle.kts b/android/testData/projects/psdSample/Kotlin/app/build.gradle.kts
index b34abb9..d5d75f7 100644
--- a/android/testData/projects/psdSample/Kotlin/app/build.gradle.kts
+++ b/android/testData/projects/psdSample/Kotlin/app/build.gradle.kts
@@ -56,6 +56,9 @@
             setMatchingFallbacks(listOf("release", "debug"))
             versionNameSuffix = "vnsSpecial"
         }
+        debug {
+            isPseudoLocalesEnabled = true
+        }
     }
     flavorDimensions("foo", "bar")
     productFlavors {
diff --git a/android/testData/projects/simpleApplicationPluginManagementDsl/.gitignore b/android/testData/projects/simpleApplicationPluginManagementDsl/.gitignore
deleted file mode 100644
index 633eda8..0000000
--- a/android/testData/projects/simpleApplicationPluginManagementDsl/.gitignore
+++ /dev/null
@@ -1,16 +0,0 @@
-.gradle
-/gradle
-/local.properties
-/.idea/copyright
-/.idea/scopes
-/.idea/libraries
-/.idea/compiler.xml
-/.idea/encodings.xml
-/.idea/gradle.xml
-/.idea/misc.xml
-/.idea/vcs.xml
-/.idea/workspace.xml
-.DS_Store
-/build
-gradlew
-gradlew.bat
diff --git a/android/testData/projects/simpleApplicationPluginManagementDsl/app/.gitignore b/android/testData/projects/simpleApplicationPluginManagementDsl/app/.gitignore
deleted file mode 100644
index 796b96d..0000000
--- a/android/testData/projects/simpleApplicationPluginManagementDsl/app/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/build
diff --git a/android/testData/projects/simpleApplicationPluginManagementDsl/app/build.gradle b/android/testData/projects/simpleApplicationPluginManagementDsl/app/build.gradle
deleted file mode 100644
index f0ba0a4..0000000
--- a/android/testData/projects/simpleApplicationPluginManagementDsl/app/build.gradle
+++ /dev/null
@@ -1,35 +0,0 @@
-plugins {
-  id 'com.android.application'
-}
-
-android {
-    compileSdkVersion 23
-    useLibrary 'org.apache.http.legacy'
-
-    defaultConfig {
-        applicationId "google.simpleapplication"
-        minSdkVersion 19
-        targetSdkVersion 23
-        versionCode 1
-        versionName "1.0"
-    }
-    buildTypes {
-        release {
-            minifyEnabled false
-            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
-        }
-    }
-    lintOptions {
-        abortOnError false
-    }
-}
-
-dependencies {
-    api fileTree(dir: 'libs', include: ['*.jar'])
-    api 'com.android.support:appcompat-v7:+'
-    api 'com.google.guava:guava:19.0'
-    api 'com.android.support.constraint:constraint-layout:1.0.2'
-    testImplementation 'junit:junit:4.12'
-    androidTestImplementation 'com.android.support.test:runner:+'
-    androidTestImplementation 'com.android.support.test.espresso:espresso-core:+'
-}
diff --git a/android/testData/projects/simpleApplicationPluginManagementDsl/app/proguard-rules.pro b/android/testData/projects/simpleApplicationPluginManagementDsl/app/proguard-rules.pro
deleted file mode 100644
index e2f6a3d..0000000
--- a/android/testData/projects/simpleApplicationPluginManagementDsl/app/proguard-rules.pro
+++ /dev/null
@@ -1,17 +0,0 @@
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in /Applications/adt-bundle-mac-x86_64-20131030/sdk/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the proguardFiles
-# directive in build.gradle.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
diff --git a/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/androidTest/java/google/simpleapplication/ApplicationTest.java b/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/androidTest/java/google/simpleapplication/ApplicationTest.java
deleted file mode 100644
index 0b16c57..0000000
--- a/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/androidTest/java/google/simpleapplication/ApplicationTest.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package google.simpleapplication;
-
-import android.support.test.runner.AndroidJUnit4;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-/**
- * <a href="http://d.android.com/tools/testing/testing_android.html">Testing Fundamentals</a>
- */
-@RunWith(AndroidJUnit4.class)
-public class ApplicationTest {
-    @Test
-    public void exampleTest() {
-    }
-}
\ No newline at end of file
diff --git a/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/AndroidManifest.xml b/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/AndroidManifest.xml
deleted file mode 100644
index 71da665..0000000
--- a/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="google.simpleapplication" >
-
-    <application
-        android:allowBackup="true"
-        android:icon="@drawable/ic_launcher"
-        android:label="@string/app_name"
-        android:theme="@style/AppTheme" >
-        <activity
-            android:name=".MyActivity"
-            android:exported="true"
-            android:label="@string/app_name"
-            android:theme="@style/AppTheme" >
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
-    </application>
-
-</manifest>
diff --git a/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/java/google/simpleapplication/MyActivity.java b/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/java/google/simpleapplication/MyActivity.java
deleted file mode 100644
index 490b137..0000000
--- a/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/java/google/simpleapplication/MyActivity.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package google.simpleapplication;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.view.Menu;
-import android.view.MenuItem;
-
-
-public class MyActivity extends Activity {
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.activity_my);
-    }
-
-
-    @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        // Inflate the menu; this adds items to the action bar if it is present.
-        getMenuInflater().inflate(R.menu.my, menu);
-        return true;
-    }
-
-    @Override
-    public boolean onOptionsItemSelected(MenuItem item) {
-        // Handle action bar item clicks here. The action bar will
-        // automatically handle clicks on the Home/Up button, so long
-        // as you specify a parent activity in AndroidManifest.xml.
-        int id = item.getItemId();
-        if (id == R.id.action_settings) {
-            return true;
-        }
-        return super.onOptionsItemSelected(item);
-    }
-}
diff --git a/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/res/drawable/ic_launcher.xml b/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/res/drawable/ic_launcher.xml
deleted file mode 100644
index bebd983..0000000
--- a/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/res/drawable/ic_launcher.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<color xmlns:android="http://schemas.android.com/apk/res/android" android:color="#ff0000" />
diff --git a/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/res/layout/absolute.xml b/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/res/layout/absolute.xml
deleted file mode 100644
index a4c567a..0000000
--- a/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/res/layout/absolute.xml
+++ /dev/null
@@ -1,63 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:paddingLeft="16dp"
-    android:paddingRight="16dp"
-    android:paddingTop="16dp"
-    android:paddingBottom="16dp"
-    android:layout_width="match_parent" android:layout_height="match_parent">
-
-    <Button
-        android:text="Button"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_x="3dp"
-        android:layout_y="2dp"
-        android:id="@+id/button" />
-
-    <Button
-        android:text="Button"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_x="6dp"
-        android:layout_y="50dp"
-        android:id="@+id/button2" />
-
-    <EditText
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:inputType="textPersonName"
-        android:text="Name"
-        android:ems="10"
-        android:layout_x="108dp"
-        android:layout_y="206dp"
-        android:id="@+id/editText" />
-
-    <LinearLayout
-        android:layout_width="359dp"
-        android:layout_height="89dp"
-        android:layout_x="17dp"
-        android:layout_y="416dp">
-
-        <Button
-            android:text="Button"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:id="@+id/button3"
-            android:layout_weight="1" />
-
-        <Button
-            android:text="Button"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:id="@+id/button5"
-            android:layout_weight="1" />
-
-        <Button
-            android:text="Button"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:id="@+id/button6"
-            android:layout_weight="1" />
-    </LinearLayout>
-</AbsoluteLayout>
-
diff --git a/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/res/layout/activity_my.xml b/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/res/layout/activity_my.xml
deleted file mode 100644
index c17166f..0000000
--- a/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/res/layout/activity_my.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:paddingLeft="@dimen/activity_horizontal_margin"
-    android:paddingRight="@dimen/activity_horizontal_margin"
-    android:paddingTop="@dimen/activity_vertical_margin"
-    android:paddingBottom="@dimen/activity_vertical_margin"
-    tools:context=".MyActivity">
-
-    <TextView
-        android:text="@string/hello_world"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content" />
-
-</RelativeLayout>
diff --git a/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/res/layout/frames.xml b/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/res/layout/frames.xml
deleted file mode 100644
index 985fa0c..0000000
--- a/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/res/layout/frames.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:orientation="vertical">
-
-    <TextView
-        android:id="@+id/title"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="Welcome"  />
-
-    <FrameLayout
-        android:id="@+id/attending_remotely"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:foreground="?android:selectableItemBackground">
-
-        <ImageView
-            android:layout_width="100dp"
-            android:layout_height="100dp"
-            android:adjustViewBounds="true"
-            android:scaleType="centerInside" />
-
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_gravity="bottom|end|right"
-            android:text="Remotely" />
-
-    </FrameLayout>
-
-    <FrameLayout
-        android:id="@+id/attending_in_person"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:foreground="?android:selectableItemBackground">
-
-        <ImageView
-            android:layout_width="100dp"
-            android:layout_height="100dp"
-            android:adjustViewBounds="true"
-            android:scaleType="centerInside" />
-
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_gravity="bottom|end|right"
-            android:text="In Person" />
-
-    </FrameLayout>
-
-</LinearLayout>
diff --git a/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/res/menu/my.xml b/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/res/menu/my.xml
deleted file mode 100644
index bea58cc..0000000
--- a/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/res/menu/my.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<menu xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    tools:context=".MyActivity" >
-    <item android:id="@+id/action_settings"
-        android:title="@string/action_settings"
-        android:orderInCategory="100"
-        android:showAsAction="never" />
-</menu>
diff --git a/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/res/values-en-rGB/strings.xml b/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/res/values-en-rGB/strings.xml
deleted file mode 100644
index 35986fa..0000000
--- a/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/res/values-en-rGB/strings.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2014 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<resources>
-
-    <string name="app_name">Simple Application</string>
-    <string name="hello_world">Hello world!</string>
-
-</resources>
diff --git a/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/res/values-en/strings.xml b/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/res/values-en/strings.xml
deleted file mode 100644
index d13ac5f..0000000
--- a/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/res/values-en/strings.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-
-    <string name="app_name">Simple Application</string>
-    <string name="hello_world">Hello world!</string>
-    <string name="action_settings">Settings</string>
-
-</resources>
diff --git a/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/res/values-ta/strings.xml b/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/res/values-ta/strings.xml
deleted file mode 100644
index d13ac5f..0000000
--- a/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/res/values-ta/strings.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-
-    <string name="app_name">Simple Application</string>
-    <string name="hello_world">Hello world!</string>
-    <string name="action_settings">Settings</string>
-
-</resources>
diff --git a/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/res/values-v19/styles.xml b/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/res/values-v19/styles.xml
deleted file mode 100644
index de742eb..0000000
--- a/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/res/values-v19/styles.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<resources>
-
-    <style name="PreviewTheme" parent="android:Theme.Holo">
-    </style>
-
-</resources>
diff --git a/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/res/values-v20/styles.xml b/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/res/values-v20/styles.xml
deleted file mode 100644
index de742eb..0000000
--- a/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/res/values-v20/styles.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<resources>
-
-    <style name="PreviewTheme" parent="android:Theme.Holo">
-    </style>
-
-</resources>
diff --git a/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/res/values-w820dp/dimens.xml b/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/res/values-w820dp/dimens.xml
deleted file mode 100644
index 63fc816..0000000
--- a/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/res/values-w820dp/dimens.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<resources>
-    <!-- Example customization of dimensions originally defined in res/values/dimens.xml
-         (such as screen margins) for screens with more than 820dp of available width. This
-         would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
-    <dimen name="activity_horizontal_margin">64dp</dimen>
-</resources>
diff --git a/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/res/values-zh-rCN/strings.xml b/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/res/values-zh-rCN/strings.xml
deleted file mode 100644
index 100d85e..0000000
--- a/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/res/values-zh-rCN/strings.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2014 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<resources>
-    <string name="app_name">谷歌 I/O</string>
-    <string name="hello_world">Hello world!</string>
-    <string name="action_settings">Settings</string>
-    <string name="cancel">取消</string>
-</resources>
diff --git a/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/res/values/dimens.xml b/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/res/values/dimens.xml
deleted file mode 100644
index 47c8224..0000000
--- a/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/res/values/dimens.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<resources>
-    <!-- Default screen margins, per the Android Design guidelines. -->
-    <dimen name="activity_horizontal_margin">16dp</dimen>
-    <dimen name="activity_vertical_margin">16dp</dimen>
-</resources>
diff --git a/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/res/values/strings.xml b/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/res/values/strings.xml
deleted file mode 100644
index d13ac5f..0000000
--- a/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/res/values/strings.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-
-    <string name="app_name">Simple Application</string>
-    <string name="hello_world">Hello world!</string>
-    <string name="action_settings">Settings</string>
-
-</resources>
diff --git a/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/res/values/styles.xml b/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/res/values/styles.xml
deleted file mode 100644
index fdc045e..0000000
--- a/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/main/res/values/styles.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<resources>
-
-    <!-- Base application theme. -->
-    <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
-        <!-- Customize your theme here. -->
-    </style>
-
-    <style name="PreviewTheme" parent="android:Theme.Holo.Light.DarkActionBar">
-    </style>
-
-    <style name="NotATheme">
-    </style>
-</resources>
diff --git a/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/test/java/google/simpleapplication/UnitTest.java b/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/test/java/google/simpleapplication/UnitTest.java
deleted file mode 100644
index 767acad..0000000
--- a/android/testData/projects/simpleApplicationPluginManagementDsl/app/src/test/java/google/simpleapplication/UnitTest.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package google.simpleapplication;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-import java.lang.Deprecated;
-
-/**
- * A unit test to be executed on the local vm.
- */
-public class UnitTest {
-  @Test
-  public void passingTest() throws Exception {
-    Assert.assertEquals(2, 1 + 1);
-  }
-
-  @Test
-  public void failingTest() throws Exception {
-    Assert.assertEquals(5, 2 + 2);
-  }
-}
\ No newline at end of file
diff --git a/android/testData/projects/simpleApplicationPluginManagementDsl/build.gradle b/android/testData/projects/simpleApplicationPluginManagementDsl/build.gradle
deleted file mode 100644
index 8239270..0000000
--- a/android/testData/projects/simpleApplicationPluginManagementDsl/build.gradle
+++ /dev/null
@@ -1,13 +0,0 @@
-// Top-level build file where you can add configuration options common to all sub-projects/modules.
-
-buildscript {
-    repositories {
-        // This will be populated by AndroidGradleTestCase
-    }
-}
-
-allprojects {
-    repositories {
-        // This will be populated by AndroidGradleTestCase
-    }
-}
diff --git a/android/testData/projects/simpleApplicationPluginManagementDsl/settings.gradle b/android/testData/projects/simpleApplicationPluginManagementDsl/settings.gradle
deleted file mode 100644
index 51582a2..0000000
--- a/android/testData/projects/simpleApplicationPluginManagementDsl/settings.gradle
+++ /dev/null
@@ -1,9 +0,0 @@
-pluginManagement {
-  plugins {
-    id 'com.android.application' version '1.5.0'
-  }
-  repositories {
-    // This will be populated by AndroidGradleTestCase
-  }
-}
-include ':app'
diff --git a/android/testData/projects/simpleApplicationUnresolvedDependency/.gitignore b/android/testData/projects/simpleApplicationUnresolvedDependency/.gitignore
deleted file mode 100644
index 6cb14b0..0000000
--- a/android/testData/projects/simpleApplicationUnresolvedDependency/.gitignore
+++ /dev/null
@@ -1,17 +0,0 @@
-.gradle
-/gradle
-/local.properties
-/.idea/copyright
-/.idea/scopes
-/.idea/libraries
-/.idea/compiler.xml
-/.idea/encodings.xml
-/.idea/gradle.xml
-/.idea/misc.xml
-/.idea/vcs.xml
-/.idea/workspace.xml
-.DS_Store
-/build
-gradlew
-gradlew.bat
-gradle.properties
diff --git a/android/testData/projects/simpleApplicationUnresolvedDependency/app/.gitignore b/android/testData/projects/simpleApplicationUnresolvedDependency/app/.gitignore
deleted file mode 100644
index 796b96d..0000000
--- a/android/testData/projects/simpleApplicationUnresolvedDependency/app/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/build
diff --git a/android/testData/projects/simpleApplicationUnresolvedDependency/app/build.gradle b/android/testData/projects/simpleApplicationUnresolvedDependency/app/build.gradle
deleted file mode 100644
index 1510e87..0000000
--- a/android/testData/projects/simpleApplicationUnresolvedDependency/app/build.gradle
+++ /dev/null
@@ -1,34 +0,0 @@
-apply plugin: 'com.android.application'
-
-android {
-    compileSdkVersion 23
-    useLibrary 'org.apache.http.legacy'
-
-    defaultConfig {
-        applicationId "google.simpleapplication"
-        minSdkVersion 19
-        targetSdkVersion 23
-        versionCode 1
-        versionName "1.0"
-    }
-    buildTypes {
-        release {
-            minifyEnabled false
-            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
-        }
-    }
-    lintOptions {
-        abortOnError false
-    }
-}
-
-dependencies {
-    api fileTree(dir: 'libs', include: ['*.jar'])
-    implementation "unresolved:dependency:99.9"
-    api 'com.android.support:appcompat-v7:+'
-    api 'com.google.guava:guava:19.0'
-    api 'com.android.support.constraint:constraint-layout:1.0.2'
-    testImplementation 'junit:junit:4.12'
-    androidTestImplementation 'com.android.support.test:runner:+'
-    androidTestImplementation 'com.android.support.test.espresso:espresso-core:+'
-}
diff --git a/android/testData/projects/simpleApplicationUnresolvedDependency/app/proguard-rules.pro b/android/testData/projects/simpleApplicationUnresolvedDependency/app/proguard-rules.pro
deleted file mode 100644
index e2f6a3d..0000000
--- a/android/testData/projects/simpleApplicationUnresolvedDependency/app/proguard-rules.pro
+++ /dev/null
@@ -1,17 +0,0 @@
-# Add project specific ProGuard rules here.
-# By default, the flags in this file are appended to flags specified
-# in /Applications/adt-bundle-mac-x86_64-20131030/sdk/tools/proguard/proguard-android.txt
-# You can edit the include path and order by changing the proguardFiles
-# directive in build.gradle.
-#
-# For more details, see
-#   http://developer.android.com/guide/developing/tools/proguard.html
-
-# Add any project specific keep options here:
-
-# If your project uses WebView with JS, uncomment the following
-# and specify the fully qualified class name to the JavaScript interface
-# class:
-#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
-#   public *;
-#}
diff --git a/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/androidTest/java/google/simpleapplication/ApplicationTest.java b/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/androidTest/java/google/simpleapplication/ApplicationTest.java
deleted file mode 100644
index 0b16c57..0000000
--- a/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/androidTest/java/google/simpleapplication/ApplicationTest.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package google.simpleapplication;
-
-import android.support.test.runner.AndroidJUnit4;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-/**
- * <a href="http://d.android.com/tools/testing/testing_android.html">Testing Fundamentals</a>
- */
-@RunWith(AndroidJUnit4.class)
-public class ApplicationTest {
-    @Test
-    public void exampleTest() {
-    }
-}
\ No newline at end of file
diff --git a/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/AndroidManifest.xml b/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/AndroidManifest.xml
deleted file mode 100644
index ae1ece3..0000000
--- a/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="google.simpleapplication" >
-
-    <application
-        android:allowBackup="true"
-        android:icon="@drawable/ic_launcher"
-        android:label="@string/app_name"
-        android:theme="@style/AppTheme" >
-        <activity
-            android:name=".MyActivity"
-            android:label="@string/app_name" >
-            <intent-filter>
-                <action android:name="android.intent.action.MAIN" />
-
-                <category android:name="android.intent.category.LAUNCHER" />
-            </intent-filter>
-        </activity>
-    </application>
-
-</manifest>
diff --git a/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/java/google/simpleapplication/MyActivity.java b/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/java/google/simpleapplication/MyActivity.java
deleted file mode 100644
index 490b137..0000000
--- a/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/java/google/simpleapplication/MyActivity.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package google.simpleapplication;
-
-import android.app.Activity;
-import android.os.Bundle;
-import android.view.Menu;
-import android.view.MenuItem;
-
-
-public class MyActivity extends Activity {
-
-    @Override
-    protected void onCreate(Bundle savedInstanceState) {
-        super.onCreate(savedInstanceState);
-        setContentView(R.layout.activity_my);
-    }
-
-
-    @Override
-    public boolean onCreateOptionsMenu(Menu menu) {
-        // Inflate the menu; this adds items to the action bar if it is present.
-        getMenuInflater().inflate(R.menu.my, menu);
-        return true;
-    }
-
-    @Override
-    public boolean onOptionsItemSelected(MenuItem item) {
-        // Handle action bar item clicks here. The action bar will
-        // automatically handle clicks on the Home/Up button, so long
-        // as you specify a parent activity in AndroidManifest.xml.
-        int id = item.getItemId();
-        if (id == R.id.action_settings) {
-            return true;
-        }
-        return super.onOptionsItemSelected(item);
-    }
-}
diff --git a/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/res/drawable/ic_launcher.xml b/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/res/drawable/ic_launcher.xml
deleted file mode 100644
index bebd983..0000000
--- a/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/res/drawable/ic_launcher.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<color xmlns:android="http://schemas.android.com/apk/res/android" android:color="#ff0000" />
diff --git a/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/res/layout/absolute.xml b/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/res/layout/absolute.xml
deleted file mode 100644
index a4c567a..0000000
--- a/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/res/layout/absolute.xml
+++ /dev/null
@@ -1,63 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:paddingLeft="16dp"
-    android:paddingRight="16dp"
-    android:paddingTop="16dp"
-    android:paddingBottom="16dp"
-    android:layout_width="match_parent" android:layout_height="match_parent">
-
-    <Button
-        android:text="Button"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_x="3dp"
-        android:layout_y="2dp"
-        android:id="@+id/button" />
-
-    <Button
-        android:text="Button"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_x="6dp"
-        android:layout_y="50dp"
-        android:id="@+id/button2" />
-
-    <EditText
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:inputType="textPersonName"
-        android:text="Name"
-        android:ems="10"
-        android:layout_x="108dp"
-        android:layout_y="206dp"
-        android:id="@+id/editText" />
-
-    <LinearLayout
-        android:layout_width="359dp"
-        android:layout_height="89dp"
-        android:layout_x="17dp"
-        android:layout_y="416dp">
-
-        <Button
-            android:text="Button"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:id="@+id/button3"
-            android:layout_weight="1" />
-
-        <Button
-            android:text="Button"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:id="@+id/button5"
-            android:layout_weight="1" />
-
-        <Button
-            android:text="Button"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:id="@+id/button6"
-            android:layout_weight="1" />
-    </LinearLayout>
-</AbsoluteLayout>
-
diff --git a/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/res/layout/activity_my.xml b/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/res/layout/activity_my.xml
deleted file mode 100644
index c17166f..0000000
--- a/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/res/layout/activity_my.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:paddingLeft="@dimen/activity_horizontal_margin"
-    android:paddingRight="@dimen/activity_horizontal_margin"
-    android:paddingTop="@dimen/activity_vertical_margin"
-    android:paddingBottom="@dimen/activity_vertical_margin"
-    tools:context=".MyActivity">
-
-    <TextView
-        android:text="@string/hello_world"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content" />
-
-</RelativeLayout>
diff --git a/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/res/layout/frames.xml b/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/res/layout/frames.xml
deleted file mode 100644
index 985fa0c..0000000
--- a/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/res/layout/frames.xml
+++ /dev/null
@@ -1,56 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:orientation="vertical">
-
-    <TextView
-        android:id="@+id/title"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:text="Welcome"  />
-
-    <FrameLayout
-        android:id="@+id/attending_remotely"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:foreground="?android:selectableItemBackground">
-
-        <ImageView
-            android:layout_width="100dp"
-            android:layout_height="100dp"
-            android:adjustViewBounds="true"
-            android:scaleType="centerInside" />
-
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_gravity="bottom|end|right"
-            android:text="Remotely" />
-
-    </FrameLayout>
-
-    <FrameLayout
-        android:id="@+id/attending_in_person"
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:foreground="?android:selectableItemBackground">
-
-        <ImageView
-            android:layout_width="100dp"
-            android:layout_height="100dp"
-            android:adjustViewBounds="true"
-            android:scaleType="centerInside" />
-
-        <TextView
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_gravity="bottom|end|right"
-            android:text="In Person" />
-
-    </FrameLayout>
-
-</LinearLayout>
diff --git a/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/res/menu/my.xml b/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/res/menu/my.xml
deleted file mode 100644
index bea58cc..0000000
--- a/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/res/menu/my.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<menu xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:tools="http://schemas.android.com/tools"
-    tools:context=".MyActivity" >
-    <item android:id="@+id/action_settings"
-        android:title="@string/action_settings"
-        android:orderInCategory="100"
-        android:showAsAction="never" />
-</menu>
diff --git a/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/res/values-en-rGB/strings.xml b/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/res/values-en-rGB/strings.xml
deleted file mode 100644
index 35986fa..0000000
--- a/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/res/values-en-rGB/strings.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2014 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<resources>
-
-    <string name="app_name">Simple Application</string>
-    <string name="hello_world">Hello world!</string>
-
-</resources>
diff --git a/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/res/values-en/strings.xml b/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/res/values-en/strings.xml
deleted file mode 100644
index d13ac5f..0000000
--- a/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/res/values-en/strings.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-
-    <string name="app_name">Simple Application</string>
-    <string name="hello_world">Hello world!</string>
-    <string name="action_settings">Settings</string>
-
-</resources>
diff --git a/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/res/values-ta/strings.xml b/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/res/values-ta/strings.xml
deleted file mode 100644
index d13ac5f..0000000
--- a/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/res/values-ta/strings.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-
-    <string name="app_name">Simple Application</string>
-    <string name="hello_world">Hello world!</string>
-    <string name="action_settings">Settings</string>
-
-</resources>
diff --git a/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/res/values-v19/styles.xml b/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/res/values-v19/styles.xml
deleted file mode 100644
index de742eb..0000000
--- a/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/res/values-v19/styles.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<resources>
-
-    <style name="PreviewTheme" parent="android:Theme.Holo">
-    </style>
-
-</resources>
diff --git a/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/res/values-v20/styles.xml b/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/res/values-v20/styles.xml
deleted file mode 100644
index de742eb..0000000
--- a/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/res/values-v20/styles.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<resources>
-
-    <style name="PreviewTheme" parent="android:Theme.Holo">
-    </style>
-
-</resources>
diff --git a/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/res/values-w820dp/dimens.xml b/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/res/values-w820dp/dimens.xml
deleted file mode 100644
index 63fc816..0000000
--- a/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/res/values-w820dp/dimens.xml
+++ /dev/null
@@ -1,6 +0,0 @@
-<resources>
-    <!-- Example customization of dimensions originally defined in res/values/dimens.xml
-         (such as screen margins) for screens with more than 820dp of available width. This
-         would include 7" and 10" devices in landscape (~960dp and ~1280dp respectively). -->
-    <dimen name="activity_horizontal_margin">64dp</dimen>
-</resources>
diff --git a/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/res/values-zh-rCN/strings.xml b/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/res/values-zh-rCN/strings.xml
deleted file mode 100644
index 100d85e..0000000
--- a/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/res/values-zh-rCN/strings.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!--
-  ~ Copyright (C) 2014 The Android Open Source Project
-  ~
-  ~ Licensed under the Apache License, Version 2.0 (the "License");
-  ~ you may not use this file except in compliance with the License.
-  ~ You may obtain a copy of the License at
-  ~
-  ~      http://www.apache.org/licenses/LICENSE-2.0
-  ~
-  ~ Unless required by applicable law or agreed to in writing, software
-  ~ distributed under the License is distributed on an "AS IS" BASIS,
-  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  ~ See the License for the specific language governing permissions and
-  ~ limitations under the License.
-  -->
-<resources>
-    <string name="app_name">谷歌 I/O</string>
-    <string name="hello_world">Hello world!</string>
-    <string name="action_settings">Settings</string>
-    <string name="cancel">取消</string>
-</resources>
diff --git a/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/res/values/dimens.xml b/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/res/values/dimens.xml
deleted file mode 100644
index 47c8224..0000000
--- a/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/res/values/dimens.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-<resources>
-    <!-- Default screen margins, per the Android Design guidelines. -->
-    <dimen name="activity_horizontal_margin">16dp</dimen>
-    <dimen name="activity_vertical_margin">16dp</dimen>
-</resources>
diff --git a/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/res/values/strings.xml b/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/res/values/strings.xml
deleted file mode 100644
index d13ac5f..0000000
--- a/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/res/values/strings.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<resources>
-
-    <string name="app_name">Simple Application</string>
-    <string name="hello_world">Hello world!</string>
-    <string name="action_settings">Settings</string>
-
-</resources>
diff --git a/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/res/values/styles.xml b/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/res/values/styles.xml
deleted file mode 100644
index fdc045e..0000000
--- a/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/main/res/values/styles.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<resources>
-
-    <!-- Base application theme. -->
-    <style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar">
-        <!-- Customize your theme here. -->
-    </style>
-
-    <style name="PreviewTheme" parent="android:Theme.Holo.Light.DarkActionBar">
-    </style>
-
-    <style name="NotATheme">
-    </style>
-</resources>
diff --git a/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/test/java/google/simpleapplication/UnitTest.java b/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/test/java/google/simpleapplication/UnitTest.java
deleted file mode 100644
index 767acad..0000000
--- a/android/testData/projects/simpleApplicationUnresolvedDependency/app/src/test/java/google/simpleapplication/UnitTest.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2015 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package google.simpleapplication;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-import java.lang.Deprecated;
-
-/**
- * A unit test to be executed on the local vm.
- */
-public class UnitTest {
-  @Test
-  public void passingTest() throws Exception {
-    Assert.assertEquals(2, 1 + 1);
-  }
-
-  @Test
-  public void failingTest() throws Exception {
-    Assert.assertEquals(5, 2 + 2);
-  }
-}
\ No newline at end of file
diff --git a/android/testData/projects/simpleApplicationUnresolvedDependency/build.gradle b/android/testData/projects/simpleApplicationUnresolvedDependency/build.gradle
deleted file mode 100644
index 623e5b2..0000000
--- a/android/testData/projects/simpleApplicationUnresolvedDependency/build.gradle
+++ /dev/null
@@ -1,19 +0,0 @@
-// Top-level build file where you can add configuration options common to all sub-projects/modules.
-
-buildscript {
-    repositories {
-        // This will be populated by AndroidGradleTestCase
-    }
-    dependencies {
-        classpath 'com.android.tools.build:gradle:1.5.0'
-
-        // NOTE: Do not place your application dependencies here; they belong
-        // in the individual module build.gradle files
-    }
-}
-
-allprojects {
-    repositories {
-        // This will be populated by AndroidGradleTestCase
-    }
-}
diff --git a/android/testData/snapshots/IdeModels_AllVariantsSync/allVariantSyncWithV2.txt b/android/testData/snapshots/IdeModels_AllVariantsSync/allVariantSyncWithV2.txt
index 5626af6..a961ab0 100644
--- a/android/testData/snapshots/IdeModels_AllVariantsSync/allVariantSyncWithV2.txt
+++ b/android/testData/snapshots/IdeModels_AllVariantsSync/allVariantSyncWithV2.txt
@@ -44,6 +44,7 @@
     UseAndroidX                   : false
     UsesCompose                   : false
     MlModelBindingEnabled         : false
+    AndroidResourcesEnabled       : true
 - basicVariant:               : basicBarDebug
     applicationId                 : com.example.psd.sample.app.defaultSuffix.barSuffix
     testApplicationId             : com.example.psd.sample.app.default.test
@@ -150,6 +151,7 @@
         Name                          : debug
         IsDebuggable                  : true
         IsJniDebuggable               : false
+        IsPseudoLocalesEnabled        : true
         IsRenderscriptDebuggable      : false
         RenderscriptOptimLevel        : 3
         IsMinifyEnabled               : false
@@ -205,6 +207,7 @@
         ProguardFiles                 : <ROOT>/app/proguard-rules2.txt [-]
         IsDebuggable                  : false
         IsJniDebuggable               : false
+        IsPseudoLocalesEnabled        : false
         IsRenderscriptDebuggable      : false
         RenderscriptOptimLevel        : 2
         IsMinifyEnabled               : false
@@ -241,6 +244,7 @@
         VersionNameSuffix             : vnsSpecial
         IsDebuggable                  : false
         IsJniDebuggable               : false
+        IsPseudoLocalesEnabled        : false
         IsRenderscriptDebuggable      : false
         RenderscriptOptimLevel        : 3
         IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/IdeModels_AllVariantsSync/allVariantWithBuildSrc.txt b/android/testData/snapshots/IdeModels_AllVariantsSync/allVariantWithBuildSrc.txt
index 09c5152..245d1ab 100644
--- a/android/testData/snapshots/IdeModels_AllVariantsSync/allVariantWithBuildSrc.txt
+++ b/android/testData/snapshots/IdeModels_AllVariantsSync/allVariantWithBuildSrc.txt
@@ -44,6 +44,7 @@
     UseAndroidX                   : false
     UsesCompose                   : false
     MlModelBindingEnabled         : false
+    AndroidResourcesEnabled       : true
 - basicVariant:               : debug
     applicationId                 : google.simpleapplication
     testApplicationId             : google.simpleapplication.test
@@ -116,6 +117,7 @@
         Name                          : debug
         IsDebuggable                  : true
         IsJniDebuggable               : false
+        IsPseudoLocalesEnabled        : false
         IsRenderscriptDebuggable      : false
         RenderscriptOptimLevel        : 3
         IsMinifyEnabled               : false
@@ -168,6 +170,7 @@
         ProguardFiles                 : <ROOT>/app/proguard-rules.pro
         IsDebuggable                  : false
         IsJniDebuggable               : false
+        IsPseudoLocalesEnabled        : false
         IsRenderscriptDebuggable      : false
         RenderscriptOptimLevel        : 3
         IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/androidKotlinMultiplatform_V2.txt b/android/testData/snapshots/ideModels/androidKotlinMultiplatform_V2.txt
index 43a222d..59ffab2 100644
--- a/android/testData/snapshots/ideModels/androidKotlinMultiplatform_V2.txt
+++ b/android/testData/snapshots/ideModels/androidKotlinMultiplatform_V2.txt
@@ -1143,6 +1143,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : typeoneModeoneDebug
         testApplicationId             : com.example.androidlib.test
     - basicVariant:               : typeoneModetwoDebug
@@ -1217,6 +1218,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1267,6 +1269,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1734,6 +1737,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.app
         testApplicationId             : com.example.app.test
@@ -1802,6 +1806,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1852,6 +1857,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2178,6 +2184,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : false
     - basicVariant:               : androidMain
         testApplicationId             : com.example.kmpfirstlib.test
     BootClassPath                 : <ANDROID_SDK>/platforms/android-<SDK_VERSION>/android.jar
@@ -2984,6 +2991,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : false
     - basicVariant:               : androidMain
     BootClassPath                 : <ANDROID_SDK>/platforms/android-<SDK_VERSION>/android.jar
     DefaultSourceProvider
diff --git a/android/testData/snapshots/ideModels/basicCmakeApp_Agp_4_1_Gradle_6_7_1_V1.txt b/android/testData/snapshots/ideModels/basicCmakeApp_Agp_4_1_Gradle_6_7_1_V1.txt
index 8a6e8f2..2052e79 100644
--- a/android/testData/snapshots/ideModels/basicCmakeApp_Agp_4_1_Gradle_6_7_1_V1.txt
+++ b/android/testData/snapshots/ideModels/basicCmakeApp_Agp_4_1_Gradle_6_7_1_V1.txt
@@ -244,6 +244,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.basiccmakeapp.whose.name.is.at.least.seventy.characters.long
         testApplicationId             : com.example.basiccmakeapp.whose.name.is.at.least.seventy.characters.long.test
@@ -312,6 +313,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -359,6 +361,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/basicCmakeApp_Agp_4_2_Gradle_6_7_1_V1.txt b/android/testData/snapshots/ideModels/basicCmakeApp_Agp_4_2_Gradle_6_7_1_V1.txt
index 3fd3610..b5c5cc6 100644
--- a/android/testData/snapshots/ideModels/basicCmakeApp_Agp_4_2_Gradle_6_7_1_V1.txt
+++ b/android/testData/snapshots/ideModels/basicCmakeApp_Agp_4_2_Gradle_6_7_1_V1.txt
@@ -243,6 +243,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.basiccmakeapp.whose.name.is.at.least.seventy.characters.long
         testApplicationId             : com.example.basiccmakeapp.whose.name.is.at.least.seventy.characters.long.test
@@ -311,6 +312,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -358,6 +360,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/basicCmakeApp_Agp_7_0_Gradle_7_0_2_V1.txt b/android/testData/snapshots/ideModels/basicCmakeApp_Agp_7_0_Gradle_7_0_2_V1.txt
index 7944b7a..121975e 100644
--- a/android/testData/snapshots/ideModels/basicCmakeApp_Agp_7_0_Gradle_7_0_2_V1.txt
+++ b/android/testData/snapshots/ideModels/basicCmakeApp_Agp_7_0_Gradle_7_0_2_V1.txt
@@ -212,6 +212,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.basiccmakeapp.whose.name.is.at.least.seventy.characters.long
         testApplicationId             : com.example.basiccmakeapp.whose.name.is.at.least.seventy.characters.long.test
@@ -286,6 +287,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -339,6 +341,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/basicCmakeApp_Agp_7_1_Gradle_7_2_V1.txt b/android/testData/snapshots/ideModels/basicCmakeApp_Agp_7_1_Gradle_7_2_V1.txt
index 1bc8da7..06de87b 100644
--- a/android/testData/snapshots/ideModels/basicCmakeApp_Agp_7_1_Gradle_7_2_V1.txt
+++ b/android/testData/snapshots/ideModels/basicCmakeApp_Agp_7_1_Gradle_7_2_V1.txt
@@ -229,6 +229,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.basiccmakeapp.whose.name.is.at.least.seventy.characters.long
         testApplicationId             : com.example.basiccmakeapp.whose.name.is.at.least.seventy.characters.long.test
@@ -303,6 +304,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -356,6 +358,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/basicCmakeApp_Agp_7_2_Gradle_7_3_3_V1.txt b/android/testData/snapshots/ideModels/basicCmakeApp_Agp_7_2_Gradle_7_3_3_V1.txt
index ae55e25..b9bbce1 100644
--- a/android/testData/snapshots/ideModels/basicCmakeApp_Agp_7_2_Gradle_7_3_3_V1.txt
+++ b/android/testData/snapshots/ideModels/basicCmakeApp_Agp_7_2_Gradle_7_3_3_V1.txt
@@ -229,6 +229,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.basiccmakeapp.whose.name.is.at.least.seventy.characters.long
         testApplicationId             : com.example.basiccmakeapp.whose.name.is.at.least.seventy.characters.long.test
@@ -303,6 +304,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -358,6 +360,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/basicCmakeApp_Agp_7_2_Gradle_7_3_3_V2.txt b/android/testData/snapshots/ideModels/basicCmakeApp_Agp_7_2_Gradle_7_3_3_V2.txt
index f3aa751..ccec4b5 100644
--- a/android/testData/snapshots/ideModels/basicCmakeApp_Agp_7_2_Gradle_7_3_3_V2.txt
+++ b/android/testData/snapshots/ideModels/basicCmakeApp_Agp_7_2_Gradle_7_3_3_V2.txt
@@ -229,6 +229,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.basiccmakeapp.whose.name.is.at.least.seventy.characters.long
         testApplicationId             : com.example.basiccmakeapp.whose.name.is.at.least.seventy.characters.long.test
@@ -303,6 +304,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -358,6 +360,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/basicCmakeApp_Agp_7_3_Gradle_7_4_V2.txt b/android/testData/snapshots/ideModels/basicCmakeApp_Agp_7_3_Gradle_7_4_V2.txt
index 9e1800f..1f711b0 100644
--- a/android/testData/snapshots/ideModels/basicCmakeApp_Agp_7_3_Gradle_7_4_V2.txt
+++ b/android/testData/snapshots/ideModels/basicCmakeApp_Agp_7_3_Gradle_7_4_V2.txt
@@ -229,6 +229,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.basiccmakeapp.whose.name.is.at.least.seventy.characters.long
         testApplicationId             : com.example.basiccmakeapp.whose.name.is.at.least.seventy.characters.long.test
@@ -303,6 +304,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -358,6 +360,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/basicCmakeApp_Agp_7_4_Gradle_7_5_V2.txt b/android/testData/snapshots/ideModels/basicCmakeApp_Agp_7_4_Gradle_7_5_V2.txt
index e715628..9c84561 100644
--- a/android/testData/snapshots/ideModels/basicCmakeApp_Agp_7_4_Gradle_7_5_V2.txt
+++ b/android/testData/snapshots/ideModels/basicCmakeApp_Agp_7_4_Gradle_7_5_V2.txt
@@ -229,6 +229,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.basiccmakeapp.whose.name.is.at.least.seventy.characters.long
         testApplicationId             : com.example.basiccmakeapp.whose.name.is.at.least.seventy.characters.long.test
@@ -303,6 +304,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -358,6 +360,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/basicCmakeApp_Agp_8_0_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/basicCmakeApp_Agp_8_0_Gradle_8_0_V2.txt
index 338e6e0..c55b29b 100644
--- a/android/testData/snapshots/ideModels/basicCmakeApp_Agp_8_0_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/basicCmakeApp_Agp_8_0_Gradle_8_0_V2.txt
@@ -224,6 +224,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.basiccmakeapp.whose.name.is.at.least.seventy.characters.long
         testApplicationId             : com.example.basiccmakeapp.whose.name.is.at.least.seventy.characters.long.test
@@ -295,6 +296,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -347,6 +349,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/basicCmakeApp_Agp_8_1_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/basicCmakeApp_Agp_8_1_Gradle_8_0_V2.txt
index 8c7ba76..f38332a 100644
--- a/android/testData/snapshots/ideModels/basicCmakeApp_Agp_8_1_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/basicCmakeApp_Agp_8_1_Gradle_8_0_V2.txt
@@ -224,6 +224,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.basiccmakeapp.whose.name.is.at.least.seventy.characters.long
         testApplicationId             : com.example.basiccmakeapp.whose.name.is.at.least.seventy.characters.long.test
@@ -295,6 +296,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -347,6 +349,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/basicCmakeApp_Agp_8_2_Gradle_8_2_V2.txt b/android/testData/snapshots/ideModels/basicCmakeApp_Agp_8_2_Gradle_8_2_V2.txt
index 3a11966..95f33d7 100644
--- a/android/testData/snapshots/ideModels/basicCmakeApp_Agp_8_2_Gradle_8_2_V2.txt
+++ b/android/testData/snapshots/ideModels/basicCmakeApp_Agp_8_2_Gradle_8_2_V2.txt
@@ -224,6 +224,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.basiccmakeapp.whose.name.is.at.least.seventy.characters.long
         testApplicationId             : com.example.basiccmakeapp.whose.name.is.at.least.seventy.characters.long.test
@@ -295,6 +296,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -347,6 +349,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/basicCmakeApp_V2.txt b/android/testData/snapshots/ideModels/basicCmakeApp_V2.txt
index 873f0fe..d687a90 100644
--- a/android/testData/snapshots/ideModels/basicCmakeApp_V2.txt
+++ b/android/testData/snapshots/ideModels/basicCmakeApp_V2.txt
@@ -230,6 +230,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.basiccmakeapp.whose.name.is.at.least.seventy.characters.long
         testApplicationId             : com.example.basiccmakeapp.whose.name.is.at.least.seventy.characters.long.test
@@ -301,6 +302,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -353,6 +355,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/basic_Agp_4_1_Gradle_6_7_1_V1.txt b/android/testData/snapshots/ideModels/basic_Agp_4_1_Gradle_6_7_1_V1.txt
index 1ca1f2e..c4e2045 100644
--- a/android/testData/snapshots/ideModels/basic_Agp_4_1_Gradle_6_7_1_V1.txt
+++ b/android/testData/snapshots/ideModels/basic_Agp_4_1_Gradle_6_7_1_V1.txt
@@ -676,6 +676,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.android.tests.basic.debug
         testApplicationId             : com.android.tests.basic.debug.test
@@ -753,6 +754,7 @@
                 foo                           : (string, foo, foo2)
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -800,6 +802,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/basic_Agp_4_2_Gradle_6_7_1_V1.txt b/android/testData/snapshots/ideModels/basic_Agp_4_2_Gradle_6_7_1_V1.txt
index 61794f8..69b9024 100644
--- a/android/testData/snapshots/ideModels/basic_Agp_4_2_Gradle_6_7_1_V1.txt
+++ b/android/testData/snapshots/ideModels/basic_Agp_4_2_Gradle_6_7_1_V1.txt
@@ -676,6 +676,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.android.tests.basic.debug
         testApplicationId             : com.android.tests.basic.debug.test
@@ -753,6 +754,7 @@
                 foo                           : (string, foo, foo2)
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -800,6 +802,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/basic_Agp_7_0_Gradle_7_0_2_V1.txt b/android/testData/snapshots/ideModels/basic_Agp_7_0_Gradle_7_0_2_V1.txt
index edee004..6ba351d 100644
--- a/android/testData/snapshots/ideModels/basic_Agp_7_0_Gradle_7_0_2_V1.txt
+++ b/android/testData/snapshots/ideModels/basic_Agp_7_0_Gradle_7_0_2_V1.txt
@@ -676,6 +676,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.android.tests.basic.debug
         testApplicationId             : com.android.tests.basic.debug.test
@@ -759,6 +760,7 @@
                 foo                           : (string, foo, foo2)
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -812,6 +814,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/basic_Agp_7_1_Gradle_7_2_V1.txt b/android/testData/snapshots/ideModels/basic_Agp_7_1_Gradle_7_2_V1.txt
index 4dcb128..888a374 100644
--- a/android/testData/snapshots/ideModels/basic_Agp_7_1_Gradle_7_2_V1.txt
+++ b/android/testData/snapshots/ideModels/basic_Agp_7_1_Gradle_7_2_V1.txt
@@ -676,6 +676,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.android.tests.basic.debug
         testApplicationId             : com.android.tests.basic.debug.test
@@ -759,6 +760,7 @@
                 foo                           : (string, foo, foo2)
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -812,6 +814,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/basic_Agp_7_2_Gradle_7_3_3_V1.txt b/android/testData/snapshots/ideModels/basic_Agp_7_2_Gradle_7_3_3_V1.txt
index a3f177c..f295b9d 100644
--- a/android/testData/snapshots/ideModels/basic_Agp_7_2_Gradle_7_3_3_V1.txt
+++ b/android/testData/snapshots/ideModels/basic_Agp_7_2_Gradle_7_3_3_V1.txt
@@ -679,6 +679,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.android.tests.basic.debug
         testApplicationId             : com.android.tests.basic.debug.test
@@ -762,6 +763,7 @@
                 string/foo                    : (string, foo, foo2)
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -815,6 +817,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/basic_Agp_7_2_Gradle_7_3_3_V2.txt b/android/testData/snapshots/ideModels/basic_Agp_7_2_Gradle_7_3_3_V2.txt
index 6829ce8..b2f9b4a 100644
--- a/android/testData/snapshots/ideModels/basic_Agp_7_2_Gradle_7_3_3_V2.txt
+++ b/android/testData/snapshots/ideModels/basic_Agp_7_2_Gradle_7_3_3_V2.txt
@@ -654,6 +654,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.android.tests.basic.debug
         testApplicationId             : com.android.tests.basic.debug.test
@@ -737,6 +738,7 @@
                 string/foo                    : (string, foo, foo2)
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -790,6 +792,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/basic_Agp_7_3_Gradle_7_4_V2.txt b/android/testData/snapshots/ideModels/basic_Agp_7_3_Gradle_7_4_V2.txt
index 888699d..e9dc62a 100644
--- a/android/testData/snapshots/ideModels/basic_Agp_7_3_Gradle_7_4_V2.txt
+++ b/android/testData/snapshots/ideModels/basic_Agp_7_3_Gradle_7_4_V2.txt
@@ -654,6 +654,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.android.tests.basic.debug
         testApplicationId             : com.android.tests.basic.debug.test
@@ -737,6 +738,7 @@
                 string/foo                    : (string, foo, foo2)
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -790,6 +792,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/basic_Agp_7_4_Gradle_7_5_V2.txt b/android/testData/snapshots/ideModels/basic_Agp_7_4_Gradle_7_5_V2.txt
index 581a877..6da3735 100644
--- a/android/testData/snapshots/ideModels/basic_Agp_7_4_Gradle_7_5_V2.txt
+++ b/android/testData/snapshots/ideModels/basic_Agp_7_4_Gradle_7_5_V2.txt
@@ -654,6 +654,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.android.tests.basic.debug
         testApplicationId             : com.android.tests.basic.debug.test
@@ -737,6 +738,7 @@
                 string/foo                    : (string, foo, foo2)
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -790,6 +792,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/basic_Agp_8_0_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/basic_Agp_8_0_Gradle_8_0_V2.txt
index b4934d6..207a308 100644
--- a/android/testData/snapshots/ideModels/basic_Agp_8_0_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/basic_Agp_8_0_Gradle_8_0_V2.txt
@@ -654,6 +654,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.android.tests.basic.debug
         testApplicationId             : com.android.tests.basic.debug.test
@@ -734,6 +735,7 @@
                 string/foo                    : (string, foo, foo2)
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -784,6 +786,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/basic_Agp_8_1_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/basic_Agp_8_1_Gradle_8_0_V2.txt
index 8dd1784..3cb0d9a 100644
--- a/android/testData/snapshots/ideModels/basic_Agp_8_1_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/basic_Agp_8_1_Gradle_8_0_V2.txt
@@ -654,6 +654,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.android.tests.basic.debug
         testApplicationId             : com.android.tests.basic.debug.test
@@ -734,6 +735,7 @@
                 string/foo                    : (string, foo, foo2)
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -784,6 +786,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/basic_Agp_8_2_Gradle_8_2_V2.txt b/android/testData/snapshots/ideModels/basic_Agp_8_2_Gradle_8_2_V2.txt
index 674f364..a1880b3 100644
--- a/android/testData/snapshots/ideModels/basic_Agp_8_2_Gradle_8_2_V2.txt
+++ b/android/testData/snapshots/ideModels/basic_Agp_8_2_Gradle_8_2_V2.txt
@@ -654,6 +654,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.android.tests.basic.debug
         testApplicationId             : com.android.tests.basic.debug.test
@@ -734,6 +735,7 @@
                 string/foo                    : (string, foo, foo2)
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -784,6 +786,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/basic_V2.txt b/android/testData/snapshots/ideModels/basic_V2.txt
index b0ff434..a992a51 100644
--- a/android/testData/snapshots/ideModels/basic_V2.txt
+++ b/android/testData/snapshots/ideModels/basic_V2.txt
@@ -654,6 +654,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.android.tests.basic.debug
         testApplicationId             : com.android.tests.basic.debug.test
@@ -734,6 +735,7 @@
                 string/foo                    : (string, foo, foo2)
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -784,6 +786,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/compositeBuild_Agp_7_0_Gradle_7_0_2_V1.txt b/android/testData/snapshots/ideModels/compositeBuild_Agp_7_0_Gradle_7_0_2_V1.txt
index 202b8de..4745b3d 100644
--- a/android/testData/snapshots/ideModels/compositeBuild_Agp_7_0_Gradle_7_0_2_V1.txt
+++ b/android/testData/snapshots/ideModels/compositeBuild_Agp_7_0_Gradle_7_0_2_V1.txt
@@ -1117,6 +1117,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.test.composite1
         testApplicationId             : com.test.composite1.test
@@ -1192,6 +1193,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1245,6 +1247,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1830,6 +1833,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.test.composite1.test
     - basicVariant:               : release
@@ -1899,6 +1903,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1952,6 +1957,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2814,6 +2820,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.test.composite3
         testApplicationId             : com.test.composite3.test
@@ -2889,6 +2896,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2942,6 +2950,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3515,6 +3524,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.test.composite3.test
     - basicVariant:               : release
@@ -3584,6 +3594,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3637,6 +3648,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4809,6 +4821,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.test.compositeapp
         testApplicationId             : com.test.compositeapp.test
@@ -4884,6 +4897,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4937,6 +4951,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5528,6 +5543,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.test.composite0.test
     - basicVariant:               : release
@@ -5597,6 +5613,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5650,6 +5667,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/compositeBuild_Agp_7_1_Gradle_7_2_V1.txt b/android/testData/snapshots/ideModels/compositeBuild_Agp_7_1_Gradle_7_2_V1.txt
index 10d2f99..d07ba6e 100644
--- a/android/testData/snapshots/ideModels/compositeBuild_Agp_7_1_Gradle_7_2_V1.txt
+++ b/android/testData/snapshots/ideModels/compositeBuild_Agp_7_1_Gradle_7_2_V1.txt
@@ -1172,6 +1172,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.test.composite1
         testApplicationId             : com.test.composite1.test
@@ -1247,6 +1248,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1300,6 +1302,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1885,6 +1888,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.test.composite1.test
     - basicVariant:               : release
@@ -1954,6 +1958,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2007,6 +2012,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2915,6 +2921,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.test.composite3
         testApplicationId             : com.test.composite3.test
@@ -2990,6 +2997,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3043,6 +3051,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3616,6 +3625,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.test.composite3.test
     - basicVariant:               : release
@@ -3685,6 +3695,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3738,6 +3749,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4968,6 +4980,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.test.compositeapp
         testApplicationId             : com.test.compositeapp.test
@@ -5043,6 +5056,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5096,6 +5110,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5681,6 +5696,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.test.composite0.test
     - basicVariant:               : release
@@ -5750,6 +5766,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5803,6 +5820,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/compositeBuild_Agp_7_2_Gradle_7_3_3_V1.txt b/android/testData/snapshots/ideModels/compositeBuild_Agp_7_2_Gradle_7_3_3_V1.txt
index 3d9194e..121476c 100644
--- a/android/testData/snapshots/ideModels/compositeBuild_Agp_7_2_Gradle_7_3_3_V1.txt
+++ b/android/testData/snapshots/ideModels/compositeBuild_Agp_7_2_Gradle_7_3_3_V1.txt
@@ -1172,6 +1172,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.test.composite1
         testApplicationId             : com.test.composite1.test
@@ -1247,6 +1248,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1302,6 +1304,7 @@
             ProguardFiles                 : <ROOT>/TestCompositeLib1/app/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1871,6 +1874,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.test.composite1.test
     - basicVariant:               : release
@@ -1940,6 +1944,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1995,6 +2000,7 @@
             ProguardFiles                 : <ROOT>/TestCompositeLib1/lib/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2887,6 +2893,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.test.composite3
         testApplicationId             : com.test.composite3.test
@@ -2962,6 +2969,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3017,6 +3025,7 @@
             ProguardFiles                 : <ROOT>/TestCompositeLib3/app/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3574,6 +3583,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.test.composite3.test
     - basicVariant:               : release
@@ -3643,6 +3653,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3698,6 +3709,7 @@
             ProguardFiles                 : <ROOT>/TestCompositeLib3/lib/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4912,6 +4924,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.test.compositeapp
         testApplicationId             : com.test.compositeapp.test
@@ -4987,6 +5000,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5042,6 +5056,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5611,6 +5626,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.test.composite0.test
     - basicVariant:               : release
@@ -5680,6 +5696,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5735,6 +5752,7 @@
             ProguardFiles                 : <ROOT>/lib/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/compositeBuild_Agp_7_2_Gradle_7_3_3_V2.txt b/android/testData/snapshots/ideModels/compositeBuild_Agp_7_2_Gradle_7_3_3_V2.txt
index 2276d62..47afb10 100644
--- a/android/testData/snapshots/ideModels/compositeBuild_Agp_7_2_Gradle_7_3_3_V2.txt
+++ b/android/testData/snapshots/ideModels/compositeBuild_Agp_7_2_Gradle_7_3_3_V2.txt
@@ -1145,6 +1145,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.test.composite1
         testApplicationId             : com.test.composite1.test
@@ -1220,6 +1221,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1275,6 +1277,7 @@
             ProguardFiles                 : <ROOT>/TestCompositeLib1/app/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2310,6 +2313,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.test.composite1.test
     - basicVariant:               : release
@@ -2379,6 +2383,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2434,6 +2439,7 @@
             ProguardFiles                 : <ROOT>/TestCompositeLib1/lib/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3875,6 +3881,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.test.composite3
         testApplicationId             : com.test.composite3.test
@@ -3950,6 +3957,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4005,6 +4013,7 @@
             ProguardFiles                 : <ROOT>/TestCompositeLib3/app/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5016,6 +5025,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.test.composite3.test
     - basicVariant:               : release
@@ -5085,6 +5095,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5140,6 +5151,7 @@
             ProguardFiles                 : <ROOT>/TestCompositeLib3/lib/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6870,6 +6882,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.test.compositeapp
         testApplicationId             : com.test.compositeapp.test
@@ -6945,6 +6958,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -7000,6 +7014,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -8041,6 +8056,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.test.composite0.test
     - basicVariant:               : release
@@ -8110,6 +8126,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -8165,6 +8182,7 @@
             ProguardFiles                 : <ROOT>/lib/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/compositeBuild_Agp_7_3_Gradle_7_4_V2.txt b/android/testData/snapshots/ideModels/compositeBuild_Agp_7_3_Gradle_7_4_V2.txt
index 0e77d53..bd58f73 100644
--- a/android/testData/snapshots/ideModels/compositeBuild_Agp_7_3_Gradle_7_4_V2.txt
+++ b/android/testData/snapshots/ideModels/compositeBuild_Agp_7_3_Gradle_7_4_V2.txt
@@ -1145,6 +1145,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.test.composite1
         testApplicationId             : com.test.composite1.test
@@ -1220,6 +1221,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1275,6 +1277,7 @@
             ProguardFiles                 : <ROOT>/TestCompositeLib1/app/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2312,6 +2315,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.test.composite1.test
     - basicVariant:               : release
@@ -2381,6 +2385,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2436,6 +2441,7 @@
             ProguardFiles                 : <ROOT>/TestCompositeLib1/lib/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3879,6 +3885,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.test.composite3
         testApplicationId             : com.test.composite3.test
@@ -3954,6 +3961,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4009,6 +4017,7 @@
             ProguardFiles                 : <ROOT>/TestCompositeLib3/app/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5022,6 +5031,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.test.composite3.test
     - basicVariant:               : release
@@ -5091,6 +5101,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5146,6 +5157,7 @@
             ProguardFiles                 : <ROOT>/TestCompositeLib3/lib/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6890,6 +6902,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.test.compositeapp
         testApplicationId             : com.test.compositeapp.test
@@ -6965,6 +6978,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -7020,6 +7034,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -8063,6 +8078,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.test.composite0.test
     - basicVariant:               : release
@@ -8132,6 +8148,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -8187,6 +8204,7 @@
             ProguardFiles                 : <ROOT>/lib/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/compositeBuild_Agp_7_4_Gradle_7_5_V2.txt b/android/testData/snapshots/ideModels/compositeBuild_Agp_7_4_Gradle_7_5_V2.txt
index b849a24..106c96f 100644
--- a/android/testData/snapshots/ideModels/compositeBuild_Agp_7_4_Gradle_7_5_V2.txt
+++ b/android/testData/snapshots/ideModels/compositeBuild_Agp_7_4_Gradle_7_5_V2.txt
@@ -1145,6 +1145,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.test.composite1
         testApplicationId             : com.test.composite1.test
@@ -1220,6 +1221,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1275,6 +1277,7 @@
             ProguardFiles                 : <ROOT>/TestCompositeLib1/app/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2312,6 +2315,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.test.composite1.test
     - basicVariant:               : release
@@ -2381,6 +2385,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2436,6 +2441,7 @@
             ProguardFiles                 : <ROOT>/TestCompositeLib1/lib/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3879,6 +3885,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.test.composite3
         testApplicationId             : com.test.composite3.test
@@ -3954,6 +3961,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4009,6 +4017,7 @@
             ProguardFiles                 : <ROOT>/TestCompositeLib3/app/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5022,6 +5031,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.test.composite3.test
     - basicVariant:               : release
@@ -5091,6 +5101,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5146,6 +5157,7 @@
             ProguardFiles                 : <ROOT>/TestCompositeLib3/lib/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6890,6 +6902,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.test.compositeapp
         testApplicationId             : com.test.compositeapp.test
@@ -6965,6 +6978,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -7020,6 +7034,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -8063,6 +8078,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.test.composite0.test
     - basicVariant:               : release
@@ -8132,6 +8148,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -8187,6 +8204,7 @@
             ProguardFiles                 : <ROOT>/lib/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/compositeBuild_Agp_8_0_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/compositeBuild_Agp_8_0_Gradle_8_0_V2.txt
index f8a04fe..a75927b 100644
--- a/android/testData/snapshots/ideModels/compositeBuild_Agp_8_0_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/compositeBuild_Agp_8_0_Gradle_8_0_V2.txt
@@ -1131,6 +1131,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.test.composite1
         testApplicationId             : com.test.composite1.test
@@ -1203,6 +1204,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1255,6 +1257,7 @@
             ProguardFiles                 : <ROOT>/TestCompositeLib1/app/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2282,6 +2285,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.test.composite1.test
     - basicVariant:               : release
@@ -2348,6 +2352,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2400,6 +2405,7 @@
             ProguardFiles                 : <ROOT>/TestCompositeLib1/lib/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3819,6 +3825,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.test.composite3
         testApplicationId             : com.test.composite3.test
@@ -3891,6 +3898,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3943,6 +3951,7 @@
             ProguardFiles                 : <ROOT>/TestCompositeLib3/app/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4946,6 +4955,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.test.composite3.test
     - basicVariant:               : release
@@ -5012,6 +5022,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5064,6 +5075,7 @@
             ProguardFiles                 : <ROOT>/TestCompositeLib3/lib/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6784,6 +6796,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.test.compositeapp
         testApplicationId             : com.test.compositeapp.test
@@ -6856,6 +6869,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6908,6 +6922,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -7941,6 +7956,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.test.composite0.test
     - basicVariant:               : release
@@ -8007,6 +8023,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -8059,6 +8076,7 @@
             ProguardFiles                 : <ROOT>/lib/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/compositeBuild_Agp_8_1_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/compositeBuild_Agp_8_1_Gradle_8_0_V2.txt
index cf50c157..cc223ac 100644
--- a/android/testData/snapshots/ideModels/compositeBuild_Agp_8_1_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/compositeBuild_Agp_8_1_Gradle_8_0_V2.txt
@@ -1131,6 +1131,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.test.composite1
         testApplicationId             : com.test.composite1.test
@@ -1203,6 +1204,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1255,6 +1257,7 @@
             ProguardFiles                 : <ROOT>/TestCompositeLib1/app/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2282,6 +2285,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.test.composite1.test
     - basicVariant:               : release
@@ -2348,6 +2352,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2400,6 +2405,7 @@
             ProguardFiles                 : <ROOT>/TestCompositeLib1/lib/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3819,6 +3825,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.test.composite3
         testApplicationId             : com.test.composite3.test
@@ -3891,6 +3898,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3943,6 +3951,7 @@
             ProguardFiles                 : <ROOT>/TestCompositeLib3/app/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4946,6 +4955,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.test.composite3.test
     - basicVariant:               : release
@@ -5012,6 +5022,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5064,6 +5075,7 @@
             ProguardFiles                 : <ROOT>/TestCompositeLib3/lib/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6784,6 +6796,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.test.compositeapp
         testApplicationId             : com.test.compositeapp.test
@@ -6856,6 +6869,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6908,6 +6922,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -7941,6 +7956,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.test.composite0.test
     - basicVariant:               : release
@@ -8007,6 +8023,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -8059,6 +8076,7 @@
             ProguardFiles                 : <ROOT>/lib/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/compositeBuild_Agp_8_2_Gradle_8_2_V2.txt b/android/testData/snapshots/ideModels/compositeBuild_Agp_8_2_Gradle_8_2_V2.txt
index 0ed97e2..51e8150 100644
--- a/android/testData/snapshots/ideModels/compositeBuild_Agp_8_2_Gradle_8_2_V2.txt
+++ b/android/testData/snapshots/ideModels/compositeBuild_Agp_8_2_Gradle_8_2_V2.txt
@@ -1131,6 +1131,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.test.composite1
         testApplicationId             : com.test.composite1.test
@@ -1203,6 +1204,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1255,6 +1257,7 @@
             ProguardFiles                 : <ROOT>/TestCompositeLib1/app/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2278,6 +2281,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.test.composite1.test
     - basicVariant:               : release
@@ -2344,6 +2348,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2396,6 +2401,7 @@
             ProguardFiles                 : <ROOT>/TestCompositeLib1/lib/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3811,6 +3817,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.test.composite3
         testApplicationId             : com.test.composite3.test
@@ -3883,6 +3890,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3935,6 +3943,7 @@
             ProguardFiles                 : <ROOT>/TestCompositeLib3/app/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4934,6 +4943,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.test.composite3.test
     - basicVariant:               : release
@@ -5000,6 +5010,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5052,6 +5063,7 @@
             ProguardFiles                 : <ROOT>/TestCompositeLib3/lib/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6772,6 +6784,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.test.compositeapp
         testApplicationId             : com.test.compositeapp.test
@@ -6844,6 +6857,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6896,6 +6910,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -7925,6 +7940,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.test.composite0.test
     - basicVariant:               : release
@@ -7991,6 +8007,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -8043,6 +8060,7 @@
             ProguardFiles                 : <ROOT>/lib/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/compositeBuild_V2.txt b/android/testData/snapshots/ideModels/compositeBuild_V2.txt
index 12b7bef..b49d23f 100644
--- a/android/testData/snapshots/ideModels/compositeBuild_V2.txt
+++ b/android/testData/snapshots/ideModels/compositeBuild_V2.txt
@@ -1140,6 +1140,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.test.composite1
         testApplicationId             : com.test.composite1.test
@@ -1212,6 +1213,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1264,6 +1266,7 @@
             ProguardFiles                 : <ROOT>/TestCompositeLib1/app/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2287,6 +2290,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.test.composite1.test
     - basicVariant:               : release
@@ -2353,6 +2357,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2405,6 +2410,7 @@
             ProguardFiles                 : <ROOT>/TestCompositeLib1/lib/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3832,6 +3838,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.test.composite3
         testApplicationId             : com.test.composite3.test
@@ -3904,6 +3911,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3956,6 +3964,7 @@
             ProguardFiles                 : <ROOT>/TestCompositeLib3/app/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4955,6 +4964,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.test.composite3.test
     - basicVariant:               : release
@@ -5021,6 +5031,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5073,6 +5084,7 @@
             ProguardFiles                 : <ROOT>/TestCompositeLib3/lib/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6805,6 +6817,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.test.compositeapp
         testApplicationId             : com.test.compositeapp.test
@@ -6877,6 +6890,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6929,6 +6943,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -7958,6 +7973,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.test.composite0.test
     - basicVariant:               : release
@@ -8024,6 +8040,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -8076,6 +8093,7 @@
             ProguardFiles                 : <ROOT>/lib/proguard-rules.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/dependentModules___noLibraryRuntimeIndependentModules_V2.txt b/android/testData/snapshots/ideModels/dependentModules___noLibraryRuntimeIndependentModules_V2.txt
index 228590f..5fe3384 100644
--- a/android/testData/snapshots/ideModels/dependentModules___noLibraryRuntimeIndependentModules_V2.txt
+++ b/android/testData/snapshots/ideModels/dependentModules___noLibraryRuntimeIndependentModules_V2.txt
@@ -971,6 +971,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : basicDebug
         applicationId                 : com.example.dependentmodules.app
         testApplicationId             : com.example.dependentmodules.app.test
@@ -1047,6 +1048,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1097,6 +1099,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2060,6 +2063,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.dependentmodules.lib.test
     - basicVariant:               : release
@@ -2125,6 +2129,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2175,6 +2180,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/dependentModules___noLibraryRuntime_V2.txt b/android/testData/snapshots/ideModels/dependentModules___noLibraryRuntime_V2.txt
index 7ac6cc9..85f00d1 100644
--- a/android/testData/snapshots/ideModels/dependentModules___noLibraryRuntime_V2.txt
+++ b/android/testData/snapshots/ideModels/dependentModules___noLibraryRuntime_V2.txt
@@ -971,6 +971,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : basicDebug
         applicationId                 : com.example.dependentmodules.app
         testApplicationId             : com.example.dependentmodules.app.test
@@ -1047,6 +1048,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1097,6 +1099,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2073,6 +2076,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.dependentmodules.lib.test
     - basicVariant:               : release
@@ -2138,6 +2142,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2188,6 +2193,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/fixtures_Agp_7_2_Gradle_7_3_3_V2.txt b/android/testData/snapshots/ideModels/fixtures_Agp_7_2_Gradle_7_3_3_V2.txt
index 41e4ac4..28c8dd3 100644
--- a/android/testData/snapshots/ideModels/fixtures_Agp_7_2_Gradle_7_3_3_V2.txt
+++ b/android/testData/snapshots/ideModels/fixtures_Agp_7_2_Gradle_7_3_3_V2.txt
@@ -1097,6 +1097,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -1172,6 +1173,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1227,6 +1229,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2246,6 +2249,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -2321,6 +2325,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2390,6 +2395,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/fixtures_Agp_7_3_Gradle_7_4_V2.txt b/android/testData/snapshots/ideModels/fixtures_Agp_7_3_Gradle_7_4_V2.txt
index 59a44a7..1300a68 100644
--- a/android/testData/snapshots/ideModels/fixtures_Agp_7_3_Gradle_7_4_V2.txt
+++ b/android/testData/snapshots/ideModels/fixtures_Agp_7_3_Gradle_7_4_V2.txt
@@ -1097,6 +1097,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -1172,6 +1173,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1227,6 +1229,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2248,6 +2251,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -2323,6 +2327,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2392,6 +2397,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/fixtures_Agp_7_4_Gradle_7_5_V2.txt b/android/testData/snapshots/ideModels/fixtures_Agp_7_4_Gradle_7_5_V2.txt
index f70e603..23f37b9 100644
--- a/android/testData/snapshots/ideModels/fixtures_Agp_7_4_Gradle_7_5_V2.txt
+++ b/android/testData/snapshots/ideModels/fixtures_Agp_7_4_Gradle_7_5_V2.txt
@@ -1097,6 +1097,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -1172,6 +1173,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1227,6 +1229,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2248,6 +2251,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -2323,6 +2327,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2392,6 +2397,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/fixtures_Agp_8_0_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/fixtures_Agp_8_0_Gradle_8_0_V2.txt
index 57b950c..0ab75c9 100644
--- a/android/testData/snapshots/ideModels/fixtures_Agp_8_0_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/fixtures_Agp_8_0_Gradle_8_0_V2.txt
@@ -1075,6 +1075,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -1147,6 +1148,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1199,6 +1201,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2210,6 +2213,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -2281,6 +2285,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2346,6 +2351,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/fixtures_Agp_8_1_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/fixtures_Agp_8_1_Gradle_8_0_V2.txt
index 499a0f5..9227e33 100644
--- a/android/testData/snapshots/ideModels/fixtures_Agp_8_1_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/fixtures_Agp_8_1_Gradle_8_0_V2.txt
@@ -1075,6 +1075,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -1147,6 +1148,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1199,6 +1201,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2210,6 +2213,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -2281,6 +2285,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2346,6 +2351,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/fixtures_Agp_8_2_Gradle_8_2_V2.txt b/android/testData/snapshots/ideModels/fixtures_Agp_8_2_Gradle_8_2_V2.txt
index 592a9ba..d5328e2 100644
--- a/android/testData/snapshots/ideModels/fixtures_Agp_8_2_Gradle_8_2_V2.txt
+++ b/android/testData/snapshots/ideModels/fixtures_Agp_8_2_Gradle_8_2_V2.txt
@@ -1075,6 +1075,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -1147,6 +1148,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1199,6 +1201,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2210,6 +2213,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -2281,6 +2285,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2346,6 +2351,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/fixtures_V2.txt b/android/testData/snapshots/ideModels/fixtures_V2.txt
index 38df29d..8a39279 100644
--- a/android/testData/snapshots/ideModels/fixtures_V2.txt
+++ b/android/testData/snapshots/ideModels/fixtures_V2.txt
@@ -1086,6 +1086,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -1158,6 +1159,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1210,6 +1212,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2219,6 +2222,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -2290,6 +2294,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2355,6 +2360,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/includeFromLib_Agp_4_1_Gradle_6_7_1_V1.txt b/android/testData/snapshots/ideModels/includeFromLib_Agp_4_1_Gradle_6_7_1_V1.txt
index 70afcb8..e2a1be5 100644
--- a/android/testData/snapshots/ideModels/includeFromLib_Agp_4_1_Gradle_6_7_1_V1.txt
+++ b/android/testData/snapshots/ideModels/includeFromLib_Agp_4_1_Gradle_6_7_1_V1.txt
@@ -1372,6 +1372,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.navgraph
         testApplicationId             : com.example.navgraph.test
@@ -1441,6 +1442,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1488,6 +1490,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2029,6 +2032,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -2092,6 +2096,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2139,6 +2144,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/includeFromLib_Agp_4_2_Gradle_6_7_1_V1.txt b/android/testData/snapshots/ideModels/includeFromLib_Agp_4_2_Gradle_6_7_1_V1.txt
index 630d04d..bbb19d9 100644
--- a/android/testData/snapshots/ideModels/includeFromLib_Agp_4_2_Gradle_6_7_1_V1.txt
+++ b/android/testData/snapshots/ideModels/includeFromLib_Agp_4_2_Gradle_6_7_1_V1.txt
@@ -1370,6 +1370,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.navgraph
         testApplicationId             : com.example.navgraph.test
@@ -1439,6 +1440,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1486,6 +1488,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2027,6 +2030,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -2090,6 +2094,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2137,6 +2142,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/includeFromLib_Agp_7_0_Gradle_7_0_2_V1.txt b/android/testData/snapshots/ideModels/includeFromLib_Agp_7_0_Gradle_7_0_2_V1.txt
index 93fdc4a..a4d75bd 100644
--- a/android/testData/snapshots/ideModels/includeFromLib_Agp_7_0_Gradle_7_0_2_V1.txt
+++ b/android/testData/snapshots/ideModels/includeFromLib_Agp_7_0_Gradle_7_0_2_V1.txt
@@ -1302,6 +1302,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.navgraph
         testApplicationId             : com.example.navgraph.test
@@ -1377,6 +1378,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1430,6 +1432,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1977,6 +1980,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -2046,6 +2050,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2099,6 +2104,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/includeFromLib_Agp_7_1_Gradle_7_2_V1.txt b/android/testData/snapshots/ideModels/includeFromLib_Agp_7_1_Gradle_7_2_V1.txt
index d7bcb68..0c2d04b 100644
--- a/android/testData/snapshots/ideModels/includeFromLib_Agp_7_1_Gradle_7_2_V1.txt
+++ b/android/testData/snapshots/ideModels/includeFromLib_Agp_7_1_Gradle_7_2_V1.txt
@@ -1336,6 +1336,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.navgraph
         testApplicationId             : com.example.navgraph.test
@@ -1411,6 +1412,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1464,6 +1466,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2011,6 +2014,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -2080,6 +2084,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2133,6 +2138,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/includeFromLib_Agp_7_2_Gradle_7_3_3_V1.txt b/android/testData/snapshots/ideModels/includeFromLib_Agp_7_2_Gradle_7_3_3_V1.txt
index d5392b7..968827b 100644
--- a/android/testData/snapshots/ideModels/includeFromLib_Agp_7_2_Gradle_7_3_3_V1.txt
+++ b/android/testData/snapshots/ideModels/includeFromLib_Agp_7_2_Gradle_7_3_3_V1.txt
@@ -1336,6 +1336,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.navgraph
         testApplicationId             : com.example.navgraph.test
@@ -1411,6 +1412,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1466,6 +1468,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1997,6 +2000,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -2067,6 +2071,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2122,6 +2127,7 @@
             ProguardFiles                 : <ROOT>/lib/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/includeFromLib_Agp_7_2_Gradle_7_3_3_V2.txt b/android/testData/snapshots/ideModels/includeFromLib_Agp_7_2_Gradle_7_3_3_V2.txt
index 15f82b6..64ca74c 100644
--- a/android/testData/snapshots/ideModels/includeFromLib_Agp_7_2_Gradle_7_3_3_V2.txt
+++ b/android/testData/snapshots/ideModels/includeFromLib_Agp_7_2_Gradle_7_3_3_V2.txt
@@ -1295,6 +1295,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.navgraph
         testApplicationId             : com.example.navgraph.test
@@ -1370,6 +1371,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1425,6 +1427,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2716,6 +2719,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -2786,6 +2790,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2841,6 +2846,7 @@
             ProguardFiles                 : <ROOT>/lib/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/includeFromLib_Agp_7_3_Gradle_7_4_V2.txt b/android/testData/snapshots/ideModels/includeFromLib_Agp_7_3_Gradle_7_4_V2.txt
index 24267ff..ba158b9 100644
--- a/android/testData/snapshots/ideModels/includeFromLib_Agp_7_3_Gradle_7_4_V2.txt
+++ b/android/testData/snapshots/ideModels/includeFromLib_Agp_7_3_Gradle_7_4_V2.txt
@@ -1295,6 +1295,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.navgraph
         testApplicationId             : com.example.navgraph.test
@@ -1370,6 +1371,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1425,6 +1427,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2718,6 +2721,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -2788,6 +2792,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2843,6 +2848,7 @@
             ProguardFiles                 : <ROOT>/lib/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/includeFromLib_Agp_7_4_Gradle_7_5_V2.txt b/android/testData/snapshots/ideModels/includeFromLib_Agp_7_4_Gradle_7_5_V2.txt
index 5dd6c41..ec93b27 100644
--- a/android/testData/snapshots/ideModels/includeFromLib_Agp_7_4_Gradle_7_5_V2.txt
+++ b/android/testData/snapshots/ideModels/includeFromLib_Agp_7_4_Gradle_7_5_V2.txt
@@ -1295,6 +1295,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.navgraph
         testApplicationId             : com.example.navgraph.test
@@ -1370,6 +1371,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1425,6 +1427,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2718,6 +2721,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -2788,6 +2792,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2843,6 +2848,7 @@
             ProguardFiles                 : <ROOT>/lib/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/includeFromLib_Agp_8_0_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/includeFromLib_Agp_8_0_Gradle_8_0_V2.txt
index ae98b51..08f217f 100644
--- a/android/testData/snapshots/ideModels/includeFromLib_Agp_8_0_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/includeFromLib_Agp_8_0_Gradle_8_0_V2.txt
@@ -1281,6 +1281,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.navgraph
         testApplicationId             : com.example.navgraph.test
@@ -1353,6 +1354,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1405,6 +1407,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2688,6 +2691,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -2755,6 +2759,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2807,6 +2812,7 @@
             ProguardFiles                 : <ROOT>/lib/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/includeFromLib_Agp_8_1_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/includeFromLib_Agp_8_1_Gradle_8_0_V2.txt
index bfb1588..b8ecb97 100644
--- a/android/testData/snapshots/ideModels/includeFromLib_Agp_8_1_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/includeFromLib_Agp_8_1_Gradle_8_0_V2.txt
@@ -1281,6 +1281,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.navgraph
         testApplicationId             : com.example.navgraph.test
@@ -1353,6 +1354,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1405,6 +1407,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2688,6 +2691,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -2755,6 +2759,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2807,6 +2812,7 @@
             ProguardFiles                 : <ROOT>/lib/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/includeFromLib_Agp_8_2_Gradle_8_2_V2.txt b/android/testData/snapshots/ideModels/includeFromLib_Agp_8_2_Gradle_8_2_V2.txt
index 396f6c7..dfe26c7 100644
--- a/android/testData/snapshots/ideModels/includeFromLib_Agp_8_2_Gradle_8_2_V2.txt
+++ b/android/testData/snapshots/ideModels/includeFromLib_Agp_8_2_Gradle_8_2_V2.txt
@@ -1281,6 +1281,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.navgraph
         testApplicationId             : com.example.navgraph.test
@@ -1353,6 +1354,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1405,6 +1407,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2688,6 +2691,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -2755,6 +2759,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2807,6 +2812,7 @@
             ProguardFiles                 : <ROOT>/lib/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/includeFromLib_V2.txt b/android/testData/snapshots/ideModels/includeFromLib_V2.txt
index 0724373..1887b4c 100644
--- a/android/testData/snapshots/ideModels/includeFromLib_V2.txt
+++ b/android/testData/snapshots/ideModels/includeFromLib_V2.txt
@@ -1292,6 +1292,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.navgraph
         testApplicationId             : com.example.navgraph.test
@@ -1364,6 +1365,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1416,6 +1418,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2699,6 +2702,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -2766,6 +2770,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2818,6 +2823,7 @@
             ProguardFiles                 : <ROOT>/lib/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/kotlinKapt_Agp_4_1_Gradle_6_7_1_V1.txt b/android/testData/snapshots/ideModels/kotlinKapt_Agp_4_1_Gradle_6_7_1_V1.txt
index ca6e4e6..4a1cc65 100644
--- a/android/testData/snapshots/ideModels/kotlinKapt_Agp_4_1_Gradle_6_7_1_V1.txt
+++ b/android/testData/snapshots/ideModels/kotlinKapt_Agp_4_1_Gradle_6_7_1_V1.txt
@@ -1762,6 +1762,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : localDebug
         applicationId                 : com.example.mainactivity
         testApplicationId             : com.example.mainactivity.test
@@ -1837,6 +1838,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1884,6 +1886,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2656,6 +2659,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -2718,6 +2722,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2765,6 +2770,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/kotlinKapt_Agp_4_2_Gradle_6_7_1_V1.txt b/android/testData/snapshots/ideModels/kotlinKapt_Agp_4_2_Gradle_6_7_1_V1.txt
index 6bc5f0e..93aa1eb 100644
--- a/android/testData/snapshots/ideModels/kotlinKapt_Agp_4_2_Gradle_6_7_1_V1.txt
+++ b/android/testData/snapshots/ideModels/kotlinKapt_Agp_4_2_Gradle_6_7_1_V1.txt
@@ -1760,6 +1760,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : localDebug
         applicationId                 : com.example.mainactivity
         testApplicationId             : com.example.mainactivity.test
@@ -1835,6 +1836,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1882,6 +1884,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2654,6 +2657,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -2716,6 +2720,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2763,6 +2768,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/kotlinKapt_Agp_7_0_Gradle_7_0_2_V1.txt b/android/testData/snapshots/ideModels/kotlinKapt_Agp_7_0_Gradle_7_0_2_V1.txt
index c6322ab..b9a7167 100644
--- a/android/testData/snapshots/ideModels/kotlinKapt_Agp_7_0_Gradle_7_0_2_V1.txt
+++ b/android/testData/snapshots/ideModels/kotlinKapt_Agp_7_0_Gradle_7_0_2_V1.txt
@@ -1667,6 +1667,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : localDebug
         applicationId                 : com.example.mainactivity
         testApplicationId             : com.example.mainactivity.test
@@ -1748,6 +1749,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1801,6 +1803,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2555,6 +2558,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -2623,6 +2627,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2676,6 +2681,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/kotlinKapt_Agp_7_1_Gradle_7_2_V1.txt b/android/testData/snapshots/ideModels/kotlinKapt_Agp_7_1_Gradle_7_2_V1.txt
index 71c2036..306a44f 100644
--- a/android/testData/snapshots/ideModels/kotlinKapt_Agp_7_1_Gradle_7_2_V1.txt
+++ b/android/testData/snapshots/ideModels/kotlinKapt_Agp_7_1_Gradle_7_2_V1.txt
@@ -1750,6 +1750,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : localDebug
         applicationId                 : com.example.mainactivity
         testApplicationId             : com.example.mainactivity.test
@@ -1831,6 +1832,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1884,6 +1886,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2638,6 +2641,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -2706,6 +2710,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2759,6 +2764,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/kotlinKapt_Agp_7_2_Gradle_7_3_3_V1.txt b/android/testData/snapshots/ideModels/kotlinKapt_Agp_7_2_Gradle_7_3_3_V1.txt
index 8dfdd1c..21cd7e4 100644
--- a/android/testData/snapshots/ideModels/kotlinKapt_Agp_7_2_Gradle_7_3_3_V1.txt
+++ b/android/testData/snapshots/ideModels/kotlinKapt_Agp_7_2_Gradle_7_3_3_V1.txt
@@ -1750,6 +1750,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : localDebug
         applicationId                 : com.example.mainactivity
         testApplicationId             : com.example.mainactivity.test
@@ -1831,6 +1832,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1886,6 +1888,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2627,6 +2630,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -2695,6 +2699,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2751,6 +2756,7 @@
             ConsumerProguardFiles         : <ROOT>/lib/other.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/kotlinKapt_Agp_7_2_Gradle_7_3_3_V2.txt b/android/testData/snapshots/ideModels/kotlinKapt_Agp_7_2_Gradle_7_3_3_V2.txt
index 41622df..d2c53d3 100644
--- a/android/testData/snapshots/ideModels/kotlinKapt_Agp_7_2_Gradle_7_3_3_V2.txt
+++ b/android/testData/snapshots/ideModels/kotlinKapt_Agp_7_2_Gradle_7_3_3_V2.txt
@@ -1716,6 +1716,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : localDebug
         applicationId                 : com.example.mainactivity
         testApplicationId             : com.example.mainactivity.test
@@ -1797,6 +1798,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1852,6 +1854,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2745,6 +2748,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -2813,6 +2817,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2869,6 +2874,7 @@
             ConsumerProguardFiles         : <ROOT>/lib/other.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/kotlinKapt_Agp_7_3_Gradle_7_4_V2.txt b/android/testData/snapshots/ideModels/kotlinKapt_Agp_7_3_Gradle_7_4_V2.txt
index 901cdfd..6d9a76c 100644
--- a/android/testData/snapshots/ideModels/kotlinKapt_Agp_7_3_Gradle_7_4_V2.txt
+++ b/android/testData/snapshots/ideModels/kotlinKapt_Agp_7_3_Gradle_7_4_V2.txt
@@ -1720,6 +1720,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : localDebug
         applicationId                 : com.example.mainactivity
         testApplicationId             : com.example.mainactivity.test
@@ -1801,6 +1802,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1856,6 +1858,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2752,6 +2755,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -2820,6 +2824,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2876,6 +2881,7 @@
             ConsumerProguardFiles         : <ROOT>/lib/other.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/kotlinKapt_Agp_7_4_Gradle_7_5_V2.txt b/android/testData/snapshots/ideModels/kotlinKapt_Agp_7_4_Gradle_7_5_V2.txt
index 21f9b39..f369124 100644
--- a/android/testData/snapshots/ideModels/kotlinKapt_Agp_7_4_Gradle_7_5_V2.txt
+++ b/android/testData/snapshots/ideModels/kotlinKapt_Agp_7_4_Gradle_7_5_V2.txt
@@ -1720,6 +1720,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : localDebug
         applicationId                 : com.example.mainactivity
         testApplicationId             : com.example.mainactivity.test
@@ -1801,6 +1802,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1856,6 +1858,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2751,6 +2754,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -2819,6 +2823,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2875,6 +2880,7 @@
             ConsumerProguardFiles         : <ROOT>/lib/other.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/kotlinKapt_Agp_8_0_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/kotlinKapt_Agp_8_0_Gradle_8_0_V2.txt
index 7f3aacb..aadfadf 100644
--- a/android/testData/snapshots/ideModels/kotlinKapt_Agp_8_0_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/kotlinKapt_Agp_8_0_Gradle_8_0_V2.txt
@@ -1702,6 +1702,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : localDebug
         applicationId                 : com.example.mainactivity
         testApplicationId             : com.example.mainactivity.test
@@ -1780,6 +1781,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1832,6 +1834,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2707,6 +2710,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -2772,6 +2776,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2825,6 +2830,7 @@
             ConsumerProguardFiles         : <ROOT>/lib/other.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/kotlinKapt_Agp_8_1_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/kotlinKapt_Agp_8_1_Gradle_8_0_V2.txt
index e5ac92e..5003859 100644
--- a/android/testData/snapshots/ideModels/kotlinKapt_Agp_8_1_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/kotlinKapt_Agp_8_1_Gradle_8_0_V2.txt
@@ -1702,6 +1702,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : localDebug
         applicationId                 : com.example.mainactivity
         testApplicationId             : com.example.mainactivity.test
@@ -1780,6 +1781,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1832,6 +1834,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2704,6 +2707,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -2769,6 +2773,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2822,6 +2827,7 @@
             ConsumerProguardFiles         : <ROOT>/lib/other.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/kotlinKapt_Agp_8_2_Gradle_8_2_V2.txt b/android/testData/snapshots/ideModels/kotlinKapt_Agp_8_2_Gradle_8_2_V2.txt
index 4ba492e..2ade0ec 100644
--- a/android/testData/snapshots/ideModels/kotlinKapt_Agp_8_2_Gradle_8_2_V2.txt
+++ b/android/testData/snapshots/ideModels/kotlinKapt_Agp_8_2_Gradle_8_2_V2.txt
@@ -1702,6 +1702,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : localDebug
         applicationId                 : com.example.mainactivity
         testApplicationId             : com.example.mainactivity.test
@@ -1780,6 +1781,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1832,6 +1834,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2700,6 +2703,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -2765,6 +2769,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2818,6 +2823,7 @@
             ConsumerProguardFiles         : <ROOT>/lib/other.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/kotlinKapt_V2.txt b/android/testData/snapshots/ideModels/kotlinKapt_V2.txt
index 731b6e0..b2cedb5 100644
--- a/android/testData/snapshots/ideModels/kotlinKapt_V2.txt
+++ b/android/testData/snapshots/ideModels/kotlinKapt_V2.txt
@@ -1721,6 +1721,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : localDebug
         applicationId                 : com.example.mainactivity
         testApplicationId             : com.example.mainactivity.test
@@ -1799,6 +1800,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1851,6 +1853,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2719,6 +2722,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -2784,6 +2788,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2837,6 +2842,7 @@
             ConsumerProguardFiles         : <ROOT>/lib/other.pro [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/kotlinMultiplatform_Agp_7_0_Gradle_7_0_2_V1.txt b/android/testData/snapshots/ideModels/kotlinMultiplatform_Agp_7_0_Gradle_7_0_2_V1.txt
index 74bee39..352f107 100644
--- a/android/testData/snapshots/ideModels/kotlinMultiplatform_Agp_7_0_Gradle_7_0_2_V1.txt
+++ b/android/testData/snapshots/ideModels/kotlinMultiplatform_Agp_7_0_Gradle_7_0_2_V1.txt
@@ -1142,6 +1142,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.kotlin
         testApplicationId             : com.example.android.kotlin.test
@@ -1217,6 +1218,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1270,6 +1272,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1803,6 +1806,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.test.multiproject.module2.test
     - basicVariant:               : release
@@ -1893,6 +1897,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1970,6 +1975,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/kotlinMultiplatform_Agp_7_1_Gradle_7_2_V1.txt b/android/testData/snapshots/ideModels/kotlinMultiplatform_Agp_7_1_Gradle_7_2_V1.txt
index e77f02d..9207589 100644
--- a/android/testData/snapshots/ideModels/kotlinMultiplatform_Agp_7_1_Gradle_7_2_V1.txt
+++ b/android/testData/snapshots/ideModels/kotlinMultiplatform_Agp_7_1_Gradle_7_2_V1.txt
@@ -1188,6 +1188,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.kotlin
         testApplicationId             : com.example.android.kotlin.test
@@ -1263,6 +1264,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1316,6 +1318,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1849,6 +1852,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.test.multiproject.module2.test
     - basicVariant:               : release
@@ -1939,6 +1943,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2016,6 +2021,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/kotlinMultiplatform_Agp_7_2_Gradle_7_3_3_V1.txt b/android/testData/snapshots/ideModels/kotlinMultiplatform_Agp_7_2_Gradle_7_3_3_V1.txt
index 3b84982..1ab29e2 100644
--- a/android/testData/snapshots/ideModels/kotlinMultiplatform_Agp_7_2_Gradle_7_3_3_V1.txt
+++ b/android/testData/snapshots/ideModels/kotlinMultiplatform_Agp_7_2_Gradle_7_3_3_V1.txt
@@ -1188,6 +1188,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.kotlin
         testApplicationId             : com.example.android.kotlin.test
@@ -1263,6 +1264,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1316,6 +1318,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1833,6 +1836,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.test.multiproject.module2.test
     - basicVariant:               : release
@@ -1923,6 +1927,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2000,6 +2005,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/kotlinMultiplatform_Agp_7_2_Gradle_7_3_3_V2.txt b/android/testData/snapshots/ideModels/kotlinMultiplatform_Agp_7_2_Gradle_7_3_3_V2.txt
index 30ebf88..5ba6ab2 100644
--- a/android/testData/snapshots/ideModels/kotlinMultiplatform_Agp_7_2_Gradle_7_3_3_V2.txt
+++ b/android/testData/snapshots/ideModels/kotlinMultiplatform_Agp_7_2_Gradle_7_3_3_V2.txt
@@ -1160,6 +1160,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.kotlin
         testApplicationId             : com.example.android.kotlin.test
@@ -1235,6 +1236,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1288,6 +1290,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2260,6 +2263,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.test.multiproject.module2.test
     - basicVariant:               : release
@@ -2350,6 +2354,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2427,6 +2432,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/kotlinMultiplatform_Agp_7_3_Gradle_7_4_V2.txt b/android/testData/snapshots/ideModels/kotlinMultiplatform_Agp_7_3_Gradle_7_4_V2.txt
index 8740875..40931a4 100644
--- a/android/testData/snapshots/ideModels/kotlinMultiplatform_Agp_7_3_Gradle_7_4_V2.txt
+++ b/android/testData/snapshots/ideModels/kotlinMultiplatform_Agp_7_3_Gradle_7_4_V2.txt
@@ -1160,6 +1160,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.kotlin
         testApplicationId             : com.example.android.kotlin.test
@@ -1235,6 +1236,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1288,6 +1290,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2262,6 +2265,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.test.multiproject.module2.test
     - basicVariant:               : release
@@ -2352,6 +2356,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2429,6 +2434,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/kotlinMultiplatform_Agp_7_4_Gradle_7_5_V2.txt b/android/testData/snapshots/ideModels/kotlinMultiplatform_Agp_7_4_Gradle_7_5_V2.txt
index cc603d8..cf106b0 100644
--- a/android/testData/snapshots/ideModels/kotlinMultiplatform_Agp_7_4_Gradle_7_5_V2.txt
+++ b/android/testData/snapshots/ideModels/kotlinMultiplatform_Agp_7_4_Gradle_7_5_V2.txt
@@ -1160,6 +1160,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.kotlin
         testApplicationId             : com.example.android.kotlin.test
@@ -1235,6 +1236,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1288,6 +1290,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2262,6 +2265,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.test.multiproject.module2.test
     - basicVariant:               : release
@@ -2352,6 +2356,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2429,6 +2434,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/kotlinMultiplatform_Agp_8_0_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/kotlinMultiplatform_Agp_8_0_Gradle_8_0_V2.txt
index e299afd..f990f81 100644
--- a/android/testData/snapshots/ideModels/kotlinMultiplatform_Agp_8_0_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/kotlinMultiplatform_Agp_8_0_Gradle_8_0_V2.txt
@@ -1146,6 +1146,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.kotlin
         testApplicationId             : com.example.android.kotlin.test
@@ -1218,6 +1219,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1268,6 +1270,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2232,6 +2235,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.test.multiproject.module2.test
     - basicVariant:               : release
@@ -2313,6 +2317,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2381,6 +2386,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/kotlinMultiplatform_Agp_8_1_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/kotlinMultiplatform_Agp_8_1_Gradle_8_0_V2.txt
index 9e526da..27a6c5c 100644
--- a/android/testData/snapshots/ideModels/kotlinMultiplatform_Agp_8_1_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/kotlinMultiplatform_Agp_8_1_Gradle_8_0_V2.txt
@@ -1146,6 +1146,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.kotlin
         testApplicationId             : com.example.android.kotlin.test
@@ -1218,6 +1219,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1268,6 +1270,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2232,6 +2235,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.test.multiproject.module2.test
     - basicVariant:               : release
@@ -2313,6 +2317,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2381,6 +2386,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/kotlinMultiplatform_Agp_8_2_Gradle_8_2_V2.txt b/android/testData/snapshots/ideModels/kotlinMultiplatform_Agp_8_2_Gradle_8_2_V2.txt
index eb20bec..b1d7c1c 100644
--- a/android/testData/snapshots/ideModels/kotlinMultiplatform_Agp_8_2_Gradle_8_2_V2.txt
+++ b/android/testData/snapshots/ideModels/kotlinMultiplatform_Agp_8_2_Gradle_8_2_V2.txt
@@ -1146,6 +1146,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.kotlin
         testApplicationId             : com.example.android.kotlin.test
@@ -1218,6 +1219,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1268,6 +1270,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2228,6 +2231,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.test.multiproject.module2.test
     - basicVariant:               : release
@@ -2309,6 +2313,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2377,6 +2382,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/kotlinMultiplatform_V2.txt b/android/testData/snapshots/ideModels/kotlinMultiplatform_V2.txt
index d29128c..f30072b 100644
--- a/android/testData/snapshots/ideModels/kotlinMultiplatform_V2.txt
+++ b/android/testData/snapshots/ideModels/kotlinMultiplatform_V2.txt
@@ -1157,6 +1157,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.kotlin
         testApplicationId             : com.example.android.kotlin.test
@@ -1229,6 +1230,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1279,6 +1281,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2239,6 +2242,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.test.multiproject.module2.test
     - basicVariant:               : release
@@ -2320,6 +2324,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2388,6 +2393,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/kotlinMultiplatform___jvm_V2.txt b/android/testData/snapshots/ideModels/kotlinMultiplatform___jvm_V2.txt
index d0439cb..448dbcd 100644
--- a/android/testData/snapshots/ideModels/kotlinMultiplatform___jvm_V2.txt
+++ b/android/testData/snapshots/ideModels/kotlinMultiplatform___jvm_V2.txt
@@ -1213,6 +1213,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.kotlin
         testApplicationId             : com.example.android.kotlin.test
@@ -1285,6 +1286,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1335,6 +1337,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2301,6 +2304,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.test.multiproject.module2.test
     - basicVariant:               : release
@@ -2382,6 +2386,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2450,6 +2455,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/kotlinMultiplatform___jvm_kmpapp_V2.txt b/android/testData/snapshots/ideModels/kotlinMultiplatform___jvm_kmpapp_V2.txt
index 9eb72b0..c36f949 100644
--- a/android/testData/snapshots/ideModels/kotlinMultiplatform___jvm_kmpapp_V2.txt
+++ b/android/testData/snapshots/ideModels/kotlinMultiplatform___jvm_kmpapp_V2.txt
@@ -1302,6 +1302,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.kotlin
         testApplicationId             : com.example.android.kotlin.test
@@ -1392,6 +1393,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1460,6 +1462,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2808,6 +2811,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.test.multiproject.module2.test
     - basicVariant:               : release
@@ -2889,6 +2893,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2957,6 +2962,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/kotlinMultiplatform___jvm_kmpapp_withintermediate_V2.txt b/android/testData/snapshots/ideModels/kotlinMultiplatform___jvm_kmpapp_withintermediate_V2.txt
index b2078c2..073d440 100644
--- a/android/testData/snapshots/ideModels/kotlinMultiplatform___jvm_kmpapp_withintermediate_V2.txt
+++ b/android/testData/snapshots/ideModels/kotlinMultiplatform___jvm_kmpapp_withintermediate_V2.txt
@@ -1323,6 +1323,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.kotlin
         testApplicationId             : com.example.android.kotlin.test
@@ -1413,6 +1414,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1481,6 +1483,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2835,6 +2838,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.test.multiproject.module2.test
     - basicVariant:               : release
@@ -2916,6 +2920,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2984,6 +2989,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/kotlinMultiplatform___multiple_source_set_per_android_compilation_V2.txt b/android/testData/snapshots/ideModels/kotlinMultiplatform___multiple_source_set_per_android_compilation_V2.txt
index fe96aae..3c5c9ad 100644
--- a/android/testData/snapshots/ideModels/kotlinMultiplatform___multiple_source_set_per_android_compilation_V2.txt
+++ b/android/testData/snapshots/ideModels/kotlinMultiplatform___multiple_source_set_per_android_compilation_V2.txt
@@ -1205,6 +1205,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.kotlin
         testApplicationId             : com.example.android.kotlin.test
@@ -1295,6 +1296,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1363,6 +1365,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2556,6 +2559,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.test.multiproject.module2.test
     - basicVariant:               : release
@@ -2637,6 +2641,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2705,6 +2710,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/kotlinMultiplatform___withjs_V2.txt b/android/testData/snapshots/ideModels/kotlinMultiplatform___withjs_V2.txt
index 58c8e2f..e4cb4e7 100644
--- a/android/testData/snapshots/ideModels/kotlinMultiplatform___withjs_V2.txt
+++ b/android/testData/snapshots/ideModels/kotlinMultiplatform___withjs_V2.txt
@@ -1228,6 +1228,7 @@
             UseAndroidX                   : false
             UsesCompose                   : false
             MlModelBindingEnabled         : false
+            AndroidResourcesEnabled       : true
         - basicVariant:               : debug
             applicationId                 : com.example.android.kotlin
             testApplicationId             : com.example.android.kotlin.test
@@ -1300,6 +1301,7 @@
                 Name                          : debug
                 IsDebuggable                  : true
                 IsJniDebuggable               : false
+                IsPseudoLocalesEnabled        : false
                 IsRenderscriptDebuggable      : false
                 RenderscriptOptimLevel        : 3
                 IsMinifyEnabled               : false
@@ -1350,6 +1352,7 @@
                 Name                          : release
                 IsDebuggable                  : false
                 IsJniDebuggable               : false
+                IsPseudoLocalesEnabled        : false
                 IsRenderscriptDebuggable      : false
                 RenderscriptOptimLevel        : 3
                 IsMinifyEnabled               : false
@@ -2521,6 +2524,7 @@
             UseAndroidX                   : false
             UsesCompose                   : false
             MlModelBindingEnabled         : false
+            AndroidResourcesEnabled       : true
         - basicVariant:               : debug
             testApplicationId             : com.example.test.multiproject.module2.test
         - basicVariant:               : release
@@ -2602,6 +2606,7 @@
                 Name                          : debug
                 IsDebuggable                  : true
                 IsJniDebuggable               : false
+                IsPseudoLocalesEnabled        : false
                 IsRenderscriptDebuggable      : false
                 RenderscriptOptimLevel        : 3
                 IsMinifyEnabled               : false
@@ -2670,6 +2675,7 @@
                 Name                          : release
                 IsDebuggable                  : false
                 IsJniDebuggable               : false
+                IsPseudoLocalesEnabled        : false
                 IsRenderscriptDebuggable      : false
                 RenderscriptOptimLevel        : 3
                 IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/linked_firstapp_Agp_4_1_Gradle_6_7_1_V1.txt b/android/testData/snapshots/ideModels/linked_firstapp_Agp_4_1_Gradle_6_7_1_V1.txt
index 8bd6542..900a953 100644
--- a/android/testData/snapshots/ideModels/linked_firstapp_Agp_4_1_Gradle_6_7_1_V1.txt
+++ b/android/testData/snapshots/ideModels/linked_firstapp_Agp_4_1_Gradle_6_7_1_V1.txt
@@ -1126,6 +1126,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.firstapp
         testApplicationId             : com.example.firstapp.test
@@ -1195,6 +1196,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1242,6 +1244,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1818,6 +1821,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.mysharedlibrary.test
     - basicVariant:               : release
@@ -1881,6 +1885,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1928,6 +1933,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/linked_firstapp_Agp_4_2_Gradle_6_7_1_V1.txt b/android/testData/snapshots/ideModels/linked_firstapp_Agp_4_2_Gradle_6_7_1_V1.txt
index 6389566..aae4768 100644
--- a/android/testData/snapshots/ideModels/linked_firstapp_Agp_4_2_Gradle_6_7_1_V1.txt
+++ b/android/testData/snapshots/ideModels/linked_firstapp_Agp_4_2_Gradle_6_7_1_V1.txt
@@ -1124,6 +1124,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.firstapp
         testApplicationId             : com.example.firstapp.test
@@ -1193,6 +1194,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1240,6 +1242,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1816,6 +1819,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.mysharedlibrary.test
     - basicVariant:               : release
@@ -1879,6 +1883,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1926,6 +1931,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/linked_firstapp_Agp_7_0_Gradle_7_0_2_V1.txt b/android/testData/snapshots/ideModels/linked_firstapp_Agp_7_0_Gradle_7_0_2_V1.txt
index eff399b..7788f62 100644
--- a/android/testData/snapshots/ideModels/linked_firstapp_Agp_7_0_Gradle_7_0_2_V1.txt
+++ b/android/testData/snapshots/ideModels/linked_firstapp_Agp_7_0_Gradle_7_0_2_V1.txt
@@ -1084,6 +1084,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.firstapp
         testApplicationId             : com.example.firstapp.test
@@ -1159,6 +1160,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1212,6 +1214,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1776,6 +1779,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.mysharedlibrary.test
     - basicVariant:               : release
@@ -1845,6 +1849,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1898,6 +1903,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/linked_firstapp_Agp_7_1_Gradle_7_2_V1.txt b/android/testData/snapshots/ideModels/linked_firstapp_Agp_7_1_Gradle_7_2_V1.txt
index 55d63bb..5ae4382 100644
--- a/android/testData/snapshots/ideModels/linked_firstapp_Agp_7_1_Gradle_7_2_V1.txt
+++ b/android/testData/snapshots/ideModels/linked_firstapp_Agp_7_1_Gradle_7_2_V1.txt
@@ -1142,6 +1142,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.firstapp
         testApplicationId             : com.example.firstapp.test
@@ -1217,6 +1218,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1270,6 +1272,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1834,6 +1837,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.mysharedlibrary.test
     - basicVariant:               : release
@@ -1903,6 +1907,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1956,6 +1961,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/linked_firstapp_Agp_7_2_Gradle_7_3_3_V1.txt b/android/testData/snapshots/ideModels/linked_firstapp_Agp_7_2_Gradle_7_3_3_V1.txt
index 014c83a..a52e21a 100644
--- a/android/testData/snapshots/ideModels/linked_firstapp_Agp_7_2_Gradle_7_3_3_V1.txt
+++ b/android/testData/snapshots/ideModels/linked_firstapp_Agp_7_2_Gradle_7_3_3_V1.txt
@@ -1142,6 +1142,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.firstapp
         testApplicationId             : com.example.firstapp.test
@@ -1217,6 +1218,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1272,6 +1274,7 @@
             ProguardFiles                 : <ROOT>/firstapp/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1820,6 +1823,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.mysharedlibrary.test
     - basicVariant:               : release
@@ -1890,6 +1894,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1945,6 +1950,7 @@
             ProguardFiles                 : <ROOT>/shared/mysharedlibrary/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/linked_firstapp_Agp_7_2_Gradle_7_3_3_V2.txt b/android/testData/snapshots/ideModels/linked_firstapp_Agp_7_2_Gradle_7_3_3_V2.txt
index 46e5cfa..b05f815 100644
--- a/android/testData/snapshots/ideModels/linked_firstapp_Agp_7_2_Gradle_7_3_3_V2.txt
+++ b/android/testData/snapshots/ideModels/linked_firstapp_Agp_7_2_Gradle_7_3_3_V2.txt
@@ -1115,6 +1115,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.firstapp
         testApplicationId             : com.example.firstapp.test
@@ -1190,6 +1191,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1245,6 +1247,7 @@
             ProguardFiles                 : <ROOT>/firstapp/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2249,6 +2252,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.mysharedlibrary.test
     - basicVariant:               : release
@@ -2319,6 +2323,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2374,6 +2379,7 @@
             ProguardFiles                 : <ROOT>/shared/mysharedlibrary/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/linked_firstapp_Agp_7_3_Gradle_7_4_V2.txt b/android/testData/snapshots/ideModels/linked_firstapp_Agp_7_3_Gradle_7_4_V2.txt
index 0bc7357..468e978 100644
--- a/android/testData/snapshots/ideModels/linked_firstapp_Agp_7_3_Gradle_7_4_V2.txt
+++ b/android/testData/snapshots/ideModels/linked_firstapp_Agp_7_3_Gradle_7_4_V2.txt
@@ -1115,6 +1115,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.firstapp
         testApplicationId             : com.example.firstapp.test
@@ -1190,6 +1191,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1245,6 +1247,7 @@
             ProguardFiles                 : <ROOT>/firstapp/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2251,6 +2254,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.mysharedlibrary.test
     - basicVariant:               : release
@@ -2321,6 +2325,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2376,6 +2381,7 @@
             ProguardFiles                 : <ROOT>/shared/mysharedlibrary/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/linked_firstapp_Agp_7_4_Gradle_7_5_V2.txt b/android/testData/snapshots/ideModels/linked_firstapp_Agp_7_4_Gradle_7_5_V2.txt
index c0ca35a..ac13db6 100644
--- a/android/testData/snapshots/ideModels/linked_firstapp_Agp_7_4_Gradle_7_5_V2.txt
+++ b/android/testData/snapshots/ideModels/linked_firstapp_Agp_7_4_Gradle_7_5_V2.txt
@@ -1115,6 +1115,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.firstapp
         testApplicationId             : com.example.firstapp.test
@@ -1190,6 +1191,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1245,6 +1247,7 @@
             ProguardFiles                 : <ROOT>/firstapp/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2251,6 +2254,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.mysharedlibrary.test
     - basicVariant:               : release
@@ -2321,6 +2325,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2376,6 +2381,7 @@
             ProguardFiles                 : <ROOT>/shared/mysharedlibrary/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/linked_firstapp_Agp_8_0_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/linked_firstapp_Agp_8_0_Gradle_8_0_V2.txt
index 3c47c74..b26e9c4 100644
--- a/android/testData/snapshots/ideModels/linked_firstapp_Agp_8_0_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/linked_firstapp_Agp_8_0_Gradle_8_0_V2.txt
@@ -1101,6 +1101,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.firstapp
         testApplicationId             : com.example.firstapp.test
@@ -1173,6 +1174,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1225,6 +1227,7 @@
             ProguardFiles                 : <ROOT>/firstapp/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2221,6 +2224,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.mysharedlibrary.test
     - basicVariant:               : release
@@ -2288,6 +2292,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2340,6 +2345,7 @@
             ProguardFiles                 : <ROOT>/shared/mysharedlibrary/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/linked_firstapp_Agp_8_1_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/linked_firstapp_Agp_8_1_Gradle_8_0_V2.txt
index e2a657d..2d4f745 100644
--- a/android/testData/snapshots/ideModels/linked_firstapp_Agp_8_1_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/linked_firstapp_Agp_8_1_Gradle_8_0_V2.txt
@@ -1101,6 +1101,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.firstapp
         testApplicationId             : com.example.firstapp.test
@@ -1173,6 +1174,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1225,6 +1227,7 @@
             ProguardFiles                 : <ROOT>/firstapp/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2221,6 +2224,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.mysharedlibrary.test
     - basicVariant:               : release
@@ -2288,6 +2292,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2340,6 +2345,7 @@
             ProguardFiles                 : <ROOT>/shared/mysharedlibrary/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/linked_firstapp_Agp_8_2_Gradle_8_2_V2.txt b/android/testData/snapshots/ideModels/linked_firstapp_Agp_8_2_Gradle_8_2_V2.txt
index 7297b37..09642a1 100644
--- a/android/testData/snapshots/ideModels/linked_firstapp_Agp_8_2_Gradle_8_2_V2.txt
+++ b/android/testData/snapshots/ideModels/linked_firstapp_Agp_8_2_Gradle_8_2_V2.txt
@@ -1101,6 +1101,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.firstapp
         testApplicationId             : com.example.firstapp.test
@@ -1173,6 +1174,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1225,6 +1227,7 @@
             ProguardFiles                 : <ROOT>/firstapp/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2217,6 +2220,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.mysharedlibrary.test
     - basicVariant:               : release
@@ -2284,6 +2288,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2336,6 +2341,7 @@
             ProguardFiles                 : <ROOT>/shared/mysharedlibrary/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/linked_firstapp_V2.txt b/android/testData/snapshots/ideModels/linked_firstapp_V2.txt
index 7864612..281f8cb 100644
--- a/android/testData/snapshots/ideModels/linked_firstapp_V2.txt
+++ b/android/testData/snapshots/ideModels/linked_firstapp_V2.txt
@@ -1112,6 +1112,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.firstapp
         testApplicationId             : com.example.firstapp.test
@@ -1184,6 +1185,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1236,6 +1238,7 @@
             ProguardFiles                 : <ROOT>/firstapp/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2228,6 +2231,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.mysharedlibrary.test
     - basicVariant:               : release
@@ -2295,6 +2299,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2347,6 +2352,7 @@
             ProguardFiles                 : <ROOT>/shared/mysharedlibrary/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/lintCustomChecks_Agp_7_1_Gradle_7_2_V1.txt b/android/testData/snapshots/ideModels/lintCustomChecks_Agp_7_1_Gradle_7_2_V1.txt
index e6bd010..9f95384 100644
--- a/android/testData/snapshots/ideModels/lintCustomChecks_Agp_7_1_Gradle_7_2_V1.txt
+++ b/android/testData/snapshots/ideModels/lintCustomChecks_Agp_7_1_Gradle_7_2_V1.txt
@@ -830,6 +830,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.app
         testApplicationId             : com.example.app.test
@@ -902,6 +903,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -955,6 +957,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1190,6 +1193,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library.test
     - basicVariant:               : release
@@ -1256,6 +1260,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1309,6 +1314,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1518,6 +1524,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library.test
     - basicVariant:               : release
@@ -1584,6 +1591,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1637,6 +1645,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/lintCustomChecks_Agp_7_2_Gradle_7_3_3_V1.txt b/android/testData/snapshots/ideModels/lintCustomChecks_Agp_7_2_Gradle_7_3_3_V1.txt
index 140840e..d9b005f 100644
--- a/android/testData/snapshots/ideModels/lintCustomChecks_Agp_7_2_Gradle_7_3_3_V1.txt
+++ b/android/testData/snapshots/ideModels/lintCustomChecks_Agp_7_2_Gradle_7_3_3_V1.txt
@@ -830,6 +830,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.app
         testApplicationId             : com.example.app.test
@@ -902,6 +903,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -955,6 +957,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1174,6 +1177,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library.test
     - basicVariant:               : release
@@ -1240,6 +1244,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1293,6 +1298,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1486,6 +1492,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library.test
     - basicVariant:               : release
@@ -1552,6 +1559,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1605,6 +1613,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/lintCustomChecks_Agp_7_2_Gradle_7_3_3_V2.txt b/android/testData/snapshots/ideModels/lintCustomChecks_Agp_7_2_Gradle_7_3_3_V2.txt
index cd26b50..67740ae 100644
--- a/android/testData/snapshots/ideModels/lintCustomChecks_Agp_7_2_Gradle_7_3_3_V2.txt
+++ b/android/testData/snapshots/ideModels/lintCustomChecks_Agp_7_2_Gradle_7_3_3_V2.txt
@@ -830,6 +830,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.app
         testApplicationId             : com.example.app.test
@@ -902,6 +903,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -955,6 +957,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1173,6 +1176,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library.test
     - basicVariant:               : release
@@ -1239,6 +1243,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1292,6 +1297,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1485,6 +1491,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library.test
     - basicVariant:               : release
@@ -1551,6 +1558,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1604,6 +1612,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/lintCustomChecks_Agp_7_3_Gradle_7_4_V2.txt b/android/testData/snapshots/ideModels/lintCustomChecks_Agp_7_3_Gradle_7_4_V2.txt
index fa35905..9c949fd 100644
--- a/android/testData/snapshots/ideModels/lintCustomChecks_Agp_7_3_Gradle_7_4_V2.txt
+++ b/android/testData/snapshots/ideModels/lintCustomChecks_Agp_7_3_Gradle_7_4_V2.txt
@@ -839,6 +839,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.app
         testApplicationId             : com.example.app.test
@@ -911,6 +912,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -964,6 +966,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1184,6 +1187,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library.test
     - basicVariant:               : release
@@ -1250,6 +1254,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1303,6 +1308,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1498,6 +1504,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library.test
     - basicVariant:               : release
@@ -1564,6 +1571,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1617,6 +1625,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/lintCustomChecks_Agp_7_4_Gradle_7_5_V2.txt b/android/testData/snapshots/ideModels/lintCustomChecks_Agp_7_4_Gradle_7_5_V2.txt
index 4a04966..a8b0b85 100644
--- a/android/testData/snapshots/ideModels/lintCustomChecks_Agp_7_4_Gradle_7_5_V2.txt
+++ b/android/testData/snapshots/ideModels/lintCustomChecks_Agp_7_4_Gradle_7_5_V2.txt
@@ -839,6 +839,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.app
         testApplicationId             : com.example.app.test
@@ -911,6 +912,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -964,6 +966,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1184,6 +1187,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library.test
     - basicVariant:               : release
@@ -1250,6 +1254,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1303,6 +1308,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1498,6 +1504,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library.test
     - basicVariant:               : release
@@ -1564,6 +1571,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1617,6 +1625,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/lintCustomChecks_Agp_8_0_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/lintCustomChecks_Agp_8_0_Gradle_8_0_V2.txt
index 6aba3a8..f4923f3 100644
--- a/android/testData/snapshots/ideModels/lintCustomChecks_Agp_8_0_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/lintCustomChecks_Agp_8_0_Gradle_8_0_V2.txt
@@ -824,6 +824,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.app
         testApplicationId             : com.example.app.test
@@ -893,6 +894,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -943,6 +945,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1153,6 +1156,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library.test
     - basicVariant:               : release
@@ -1216,6 +1220,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1266,6 +1271,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1451,6 +1457,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library.test
     - basicVariant:               : release
@@ -1514,6 +1521,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1564,6 +1572,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/lintCustomChecks_Agp_8_1_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/lintCustomChecks_Agp_8_1_Gradle_8_0_V2.txt
index 813813d..31992f4 100644
--- a/android/testData/snapshots/ideModels/lintCustomChecks_Agp_8_1_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/lintCustomChecks_Agp_8_1_Gradle_8_0_V2.txt
@@ -824,6 +824,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.app
         testApplicationId             : com.example.app.test
@@ -893,6 +894,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -943,6 +945,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1153,6 +1156,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library.test
     - basicVariant:               : release
@@ -1216,6 +1220,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1266,6 +1271,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1451,6 +1457,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library.test
     - basicVariant:               : release
@@ -1514,6 +1521,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1564,6 +1572,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/lintCustomChecks_Agp_8_2_Gradle_8_2_V2.txt b/android/testData/snapshots/ideModels/lintCustomChecks_Agp_8_2_Gradle_8_2_V2.txt
index ebcd046..45530e3 100644
--- a/android/testData/snapshots/ideModels/lintCustomChecks_Agp_8_2_Gradle_8_2_V2.txt
+++ b/android/testData/snapshots/ideModels/lintCustomChecks_Agp_8_2_Gradle_8_2_V2.txt
@@ -824,6 +824,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.app
         testApplicationId             : com.example.app.test
@@ -893,6 +894,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -943,6 +945,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1153,6 +1156,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library.test
     - basicVariant:               : release
@@ -1216,6 +1220,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1266,6 +1271,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1451,6 +1457,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library.test
     - basicVariant:               : release
@@ -1514,6 +1521,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1564,6 +1572,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/lintCustomChecks_V2.txt b/android/testData/snapshots/ideModels/lintCustomChecks_V2.txt
index fbb79f2..407398c 100644
--- a/android/testData/snapshots/ideModels/lintCustomChecks_V2.txt
+++ b/android/testData/snapshots/ideModels/lintCustomChecks_V2.txt
@@ -850,6 +850,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.app
         testApplicationId             : com.example.app.test
@@ -919,6 +920,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -969,6 +971,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1179,6 +1182,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library.test
     - basicVariant:               : release
@@ -1242,6 +1246,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1292,6 +1297,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1477,6 +1483,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library.test
     - basicVariant:               : release
@@ -1540,6 +1547,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1590,6 +1598,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/localAarsAsModules_Agp_4_1_Gradle_6_7_1_V1.txt b/android/testData/snapshots/ideModels/localAarsAsModules_Agp_4_1_Gradle_6_7_1_V1.txt
index b360f9f..11e88c0 100644
--- a/android/testData/snapshots/ideModels/localAarsAsModules_Agp_4_1_Gradle_6_7_1_V1.txt
+++ b/android/testData/snapshots/ideModels/localAarsAsModules_Agp_4_1_Gradle_6_7_1_V1.txt
@@ -419,6 +419,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.android.test.localaarsasmodules
         testApplicationId             : com.android.test.localaarsasmodules.test
@@ -487,6 +488,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -534,6 +536,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -766,6 +769,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.android.test.library.test
     - basicVariant:               : release
@@ -828,6 +832,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -875,6 +880,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/localAarsAsModules_Agp_4_2_Gradle_6_7_1_V1.txt b/android/testData/snapshots/ideModels/localAarsAsModules_Agp_4_2_Gradle_6_7_1_V1.txt
index 2c24341..ea2abfb 100644
--- a/android/testData/snapshots/ideModels/localAarsAsModules_Agp_4_2_Gradle_6_7_1_V1.txt
+++ b/android/testData/snapshots/ideModels/localAarsAsModules_Agp_4_2_Gradle_6_7_1_V1.txt
@@ -417,6 +417,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.android.test.localaarsasmodules
         testApplicationId             : com.android.test.localaarsasmodules.test
@@ -485,6 +486,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -532,6 +534,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -764,6 +767,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.android.test.library.test
     - basicVariant:               : release
@@ -826,6 +830,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -873,6 +878,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/localAarsAsModules_Agp_7_0_Gradle_7_0_2_V1.txt b/android/testData/snapshots/ideModels/localAarsAsModules_Agp_7_0_Gradle_7_0_2_V1.txt
index 495d590..ef32ebb 100644
--- a/android/testData/snapshots/ideModels/localAarsAsModules_Agp_7_0_Gradle_7_0_2_V1.txt
+++ b/android/testData/snapshots/ideModels/localAarsAsModules_Agp_7_0_Gradle_7_0_2_V1.txt
@@ -355,6 +355,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.android.test.localaarsasmodules
         testApplicationId             : com.android.test.localaarsasmodules.test
@@ -429,6 +430,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -482,6 +484,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -720,6 +723,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.android.test.library.test
     - basicVariant:               : release
@@ -788,6 +792,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -841,6 +846,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/localAarsAsModules_Agp_7_1_Gradle_7_2_V1.txt b/android/testData/snapshots/ideModels/localAarsAsModules_Agp_7_1_Gradle_7_2_V1.txt
index cd564e2..e105e47 100644
--- a/android/testData/snapshots/ideModels/localAarsAsModules_Agp_7_1_Gradle_7_2_V1.txt
+++ b/android/testData/snapshots/ideModels/localAarsAsModules_Agp_7_1_Gradle_7_2_V1.txt
@@ -389,6 +389,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.android.test.localaarsasmodules
         testApplicationId             : com.android.test.localaarsasmodules.test
@@ -463,6 +464,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -516,6 +518,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -754,6 +757,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.android.test.library.test
     - basicVariant:               : release
@@ -822,6 +826,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -875,6 +880,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/localAarsAsModules_Agp_7_2_Gradle_7_3_3_V1.txt b/android/testData/snapshots/ideModels/localAarsAsModules_Agp_7_2_Gradle_7_3_3_V1.txt
index 6786093..e0d9dc9 100644
--- a/android/testData/snapshots/ideModels/localAarsAsModules_Agp_7_2_Gradle_7_3_3_V1.txt
+++ b/android/testData/snapshots/ideModels/localAarsAsModules_Agp_7_2_Gradle_7_3_3_V1.txt
@@ -389,6 +389,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.android.test.localaarsasmodules
         testApplicationId             : com.android.test.localaarsasmodules.test
@@ -463,6 +464,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -518,6 +520,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -740,6 +743,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.android.test.library.test
     - basicVariant:               : release
@@ -808,6 +812,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -863,6 +868,7 @@
             ProguardFiles                 : <ROOT>/library/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/localAarsAsModules_Agp_7_2_Gradle_7_3_3_V2.txt b/android/testData/snapshots/ideModels/localAarsAsModules_Agp_7_2_Gradle_7_3_3_V2.txt
index 75d88b4..7d82198 100644
--- a/android/testData/snapshots/ideModels/localAarsAsModules_Agp_7_2_Gradle_7_3_3_V2.txt
+++ b/android/testData/snapshots/ideModels/localAarsAsModules_Agp_7_2_Gradle_7_3_3_V2.txt
@@ -388,6 +388,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.android.test.localaarsasmodules
         testApplicationId             : com.android.test.localaarsasmodules.test
@@ -462,6 +463,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -517,6 +519,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -741,6 +744,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.android.test.library.test
     - basicVariant:               : release
@@ -809,6 +813,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -864,6 +869,7 @@
             ProguardFiles                 : <ROOT>/library/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/localAarsAsModules_Agp_7_3_Gradle_7_4_V2.txt b/android/testData/snapshots/ideModels/localAarsAsModules_Agp_7_3_Gradle_7_4_V2.txt
index 520efa9..6ba356e 100644
--- a/android/testData/snapshots/ideModels/localAarsAsModules_Agp_7_3_Gradle_7_4_V2.txt
+++ b/android/testData/snapshots/ideModels/localAarsAsModules_Agp_7_3_Gradle_7_4_V2.txt
@@ -388,6 +388,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.android.test.localaarsasmodules
         testApplicationId             : com.android.test.localaarsasmodules.test
@@ -462,6 +463,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -517,6 +519,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -743,6 +746,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.android.test.library.test
     - basicVariant:               : release
@@ -811,6 +815,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -866,6 +871,7 @@
             ProguardFiles                 : <ROOT>/library/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/localAarsAsModules_Agp_7_4_Gradle_7_5_V2.txt b/android/testData/snapshots/ideModels/localAarsAsModules_Agp_7_4_Gradle_7_5_V2.txt
index c4b3a68..3f8efce 100644
--- a/android/testData/snapshots/ideModels/localAarsAsModules_Agp_7_4_Gradle_7_5_V2.txt
+++ b/android/testData/snapshots/ideModels/localAarsAsModules_Agp_7_4_Gradle_7_5_V2.txt
@@ -388,6 +388,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.android.test.localaarsasmodules
         testApplicationId             : com.android.test.localaarsasmodules.test
@@ -462,6 +463,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -517,6 +519,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -743,6 +746,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.android.test.library.test
     - basicVariant:               : release
@@ -811,6 +815,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -866,6 +871,7 @@
             ProguardFiles                 : <ROOT>/library/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/localAarsAsModules_Agp_8_0_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/localAarsAsModules_Agp_8_0_Gradle_8_0_V2.txt
index ef7b43a..1562242 100644
--- a/android/testData/snapshots/ideModels/localAarsAsModules_Agp_8_0_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/localAarsAsModules_Agp_8_0_Gradle_8_0_V2.txt
@@ -374,6 +374,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.android.test.localaarsasmodules
         testApplicationId             : com.android.test.localaarsasmodules.test
@@ -445,6 +446,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -497,6 +499,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -713,6 +716,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.android.test.library.test
     - basicVariant:               : release
@@ -778,6 +782,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -830,6 +835,7 @@
             ProguardFiles                 : <ROOT>/library/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/localAarsAsModules_Agp_8_1_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/localAarsAsModules_Agp_8_1_Gradle_8_0_V2.txt
index 3c3fab8..edef51c 100644
--- a/android/testData/snapshots/ideModels/localAarsAsModules_Agp_8_1_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/localAarsAsModules_Agp_8_1_Gradle_8_0_V2.txt
@@ -374,6 +374,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.android.test.localaarsasmodules
         testApplicationId             : com.android.test.localaarsasmodules.test
@@ -445,6 +446,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -497,6 +499,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -713,6 +716,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.android.test.library.test
     - basicVariant:               : release
@@ -778,6 +782,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -830,6 +835,7 @@
             ProguardFiles                 : <ROOT>/library/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/localAarsAsModules_Agp_8_2_Gradle_8_2_V2.txt b/android/testData/snapshots/ideModels/localAarsAsModules_Agp_8_2_Gradle_8_2_V2.txt
index a75a7ef..fb62339 100644
--- a/android/testData/snapshots/ideModels/localAarsAsModules_Agp_8_2_Gradle_8_2_V2.txt
+++ b/android/testData/snapshots/ideModels/localAarsAsModules_Agp_8_2_Gradle_8_2_V2.txt
@@ -374,6 +374,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.android.test.localaarsasmodules
         testApplicationId             : com.android.test.localaarsasmodules.test
@@ -445,6 +446,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -497,6 +499,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -713,6 +716,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.android.test.library.test
     - basicVariant:               : release
@@ -778,6 +782,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -830,6 +835,7 @@
             ProguardFiles                 : <ROOT>/library/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/localAarsAsModules_V2.txt b/android/testData/snapshots/ideModels/localAarsAsModules_V2.txt
index 3a091ea..c65777a 100644
--- a/android/testData/snapshots/ideModels/localAarsAsModules_V2.txt
+++ b/android/testData/snapshots/ideModels/localAarsAsModules_V2.txt
@@ -385,6 +385,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.android.test.localaarsasmodules
         testApplicationId             : com.android.test.localaarsasmodules.test
@@ -456,6 +457,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -508,6 +510,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -724,6 +727,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.android.test.library.test
     - basicVariant:               : release
@@ -789,6 +793,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -841,6 +846,7 @@
             ProguardFiles                 : <ROOT>/library/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/multiFlavor_Agp_4_1_Gradle_6_7_1_V1.txt b/android/testData/snapshots/ideModels/multiFlavor_Agp_4_1_Gradle_6_7_1_V1.txt
index 37caf7a..fe70d3b 100644
--- a/android/testData/snapshots/ideModels/multiFlavor_Agp_4_1_Gradle_6_7_1_V1.txt
+++ b/android/testData/snapshots/ideModels/multiFlavor_Agp_4_1_Gradle_6_7_1_V1.txt
@@ -1298,6 +1298,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : firstAbcSecondAbcDebug
         applicationId                 : com.example.multiflavor.firstAbc.secondAbc.debug
         testApplicationId             : com.example.multiflavor.firstAbc.secondAbc.debug.test
@@ -1394,6 +1395,7 @@
                 b                             : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1447,6 +1449,7 @@
                 b                             : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/multiFlavor_Agp_4_2_Gradle_6_7_1_V1.txt b/android/testData/snapshots/ideModels/multiFlavor_Agp_4_2_Gradle_6_7_1_V1.txt
index 733295c..7f31e0c 100644
--- a/android/testData/snapshots/ideModels/multiFlavor_Agp_4_2_Gradle_6_7_1_V1.txt
+++ b/android/testData/snapshots/ideModels/multiFlavor_Agp_4_2_Gradle_6_7_1_V1.txt
@@ -1297,6 +1297,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : firstAbcSecondAbcDebug
         applicationId                 : com.example.multiflavor.firstAbc.secondAbc.debug
         testApplicationId             : com.example.multiflavor.firstAbc.secondAbc.debug.test
@@ -1393,6 +1394,7 @@
                 b                             : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1446,6 +1448,7 @@
                 b                             : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/multiFlavor_Agp_7_0_Gradle_7_0_2_V1.txt b/android/testData/snapshots/ideModels/multiFlavor_Agp_7_0_Gradle_7_0_2_V1.txt
index 0ca1fa0..7898ccb 100644
--- a/android/testData/snapshots/ideModels/multiFlavor_Agp_7_0_Gradle_7_0_2_V1.txt
+++ b/android/testData/snapshots/ideModels/multiFlavor_Agp_7_0_Gradle_7_0_2_V1.txt
@@ -1106,6 +1106,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : firstAbcSecondAbcDebug
         applicationId                 : com.example.multiflavor.firstAbc.secondAbc.debug
         testApplicationId             : com.example.multiflavor.firstAbc.secondAbc.debug.test
@@ -1208,6 +1209,7 @@
                 b                             : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1267,6 +1269,7 @@
                 b                             : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/multiFlavor_Agp_7_1_Gradle_7_2_V1.txt b/android/testData/snapshots/ideModels/multiFlavor_Agp_7_1_Gradle_7_2_V1.txt
index 2805333..b3076c9 100644
--- a/android/testData/snapshots/ideModels/multiFlavor_Agp_7_1_Gradle_7_2_V1.txt
+++ b/android/testData/snapshots/ideModels/multiFlavor_Agp_7_1_Gradle_7_2_V1.txt
@@ -1147,6 +1147,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : firstAbcSecondAbcDebug
         applicationId                 : com.example.multiflavor.firstAbc.secondAbc.debug
         testApplicationId             : com.example.multiflavor.firstAbc.secondAbc.debug.test
@@ -1249,6 +1250,7 @@
                 b                             : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1308,6 +1310,7 @@
                 b                             : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/multiFlavor_Agp_7_2_Gradle_7_3_3_V1.txt b/android/testData/snapshots/ideModels/multiFlavor_Agp_7_2_Gradle_7_3_3_V1.txt
index f9df592..008da21 100644
--- a/android/testData/snapshots/ideModels/multiFlavor_Agp_7_2_Gradle_7_3_3_V1.txt
+++ b/android/testData/snapshots/ideModels/multiFlavor_Agp_7_2_Gradle_7_3_3_V1.txt
@@ -1147,6 +1147,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : firstAbcSecondAbcDebug
         applicationId                 : com.example.multiflavor.firstAbc.secondAbc.debug
         testApplicationId             : com.example.multiflavor.firstAbc.secondAbc.debug.test
@@ -1251,6 +1252,7 @@
                 b                             : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1312,6 +1314,7 @@
                 b                             : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/multiFlavor_Agp_7_2_Gradle_7_3_3_V2.txt b/android/testData/snapshots/ideModels/multiFlavor_Agp_7_2_Gradle_7_3_3_V2.txt
index ad9e3a7..98f7d62 100644
--- a/android/testData/snapshots/ideModels/multiFlavor_Agp_7_2_Gradle_7_3_3_V2.txt
+++ b/android/testData/snapshots/ideModels/multiFlavor_Agp_7_2_Gradle_7_3_3_V2.txt
@@ -1120,6 +1120,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : firstAbcSecondAbcDebug
         applicationId                 : com.example.multiflavor.firstAbc.secondAbc.debug
         testApplicationId             : com.example.multiflavor.firstAbc.secondAbc.debug.test
@@ -1224,6 +1225,7 @@
                 b                             : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1285,6 +1287,7 @@
                 b                             : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/multiFlavor_Agp_7_3_Gradle_7_4_V2.txt b/android/testData/snapshots/ideModels/multiFlavor_Agp_7_3_Gradle_7_4_V2.txt
index b461221..9c80291 100644
--- a/android/testData/snapshots/ideModels/multiFlavor_Agp_7_3_Gradle_7_4_V2.txt
+++ b/android/testData/snapshots/ideModels/multiFlavor_Agp_7_3_Gradle_7_4_V2.txt
@@ -1120,6 +1120,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : firstAbcSecondAbcDebug
         applicationId                 : com.example.multiflavor.firstAbc.secondAbc.debug
         testApplicationId             : com.example.multiflavor.firstAbc.secondAbc.debug.test
@@ -1224,6 +1225,7 @@
                 b                             : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1285,6 +1287,7 @@
                 b                             : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/multiFlavor_Agp_7_4_Gradle_7_5_V2.txt b/android/testData/snapshots/ideModels/multiFlavor_Agp_7_4_Gradle_7_5_V2.txt
index b8fbc30..eae3ff4 100644
--- a/android/testData/snapshots/ideModels/multiFlavor_Agp_7_4_Gradle_7_5_V2.txt
+++ b/android/testData/snapshots/ideModels/multiFlavor_Agp_7_4_Gradle_7_5_V2.txt
@@ -1120,6 +1120,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : firstAbcSecondAbcDebug
         applicationId                 : com.example.multiflavor.firstAbc.secondAbc.debug
         testApplicationId             : com.example.multiflavor.firstAbc.secondAbc.debug.test
@@ -1224,6 +1225,7 @@
                 b                             : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1285,6 +1287,7 @@
                 b                             : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/multiFlavor_Agp_8_0_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/multiFlavor_Agp_8_0_Gradle_8_0_V2.txt
index 8d0d3cf..375268e 100644
--- a/android/testData/snapshots/ideModels/multiFlavor_Agp_8_0_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/multiFlavor_Agp_8_0_Gradle_8_0_V2.txt
@@ -1103,6 +1103,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : firstAbcSecondAbcDebug
         applicationId                 : com.example.multiflavor.firstAbc.secondAbc.debug
         testApplicationId             : com.example.multiflavor.firstAbc.secondAbc.debug.test
@@ -1204,6 +1205,7 @@
                 b                             : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1262,6 +1264,7 @@
                 b                             : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/multiFlavor_Agp_8_1_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/multiFlavor_Agp_8_1_Gradle_8_0_V2.txt
index 3586b5a..b5b5e22 100644
--- a/android/testData/snapshots/ideModels/multiFlavor_Agp_8_1_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/multiFlavor_Agp_8_1_Gradle_8_0_V2.txt
@@ -1103,6 +1103,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : firstAbcSecondAbcDebug
         applicationId                 : com.example.multiflavor.firstAbc.secondAbc.debug
         testApplicationId             : com.example.multiflavor.firstAbc.secondAbc.debug.test
@@ -1204,6 +1205,7 @@
                 b                             : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1262,6 +1264,7 @@
                 b                             : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/multiFlavor_Agp_8_2_Gradle_8_2_V2.txt b/android/testData/snapshots/ideModels/multiFlavor_Agp_8_2_Gradle_8_2_V2.txt
index 4756696..8004f50 100644
--- a/android/testData/snapshots/ideModels/multiFlavor_Agp_8_2_Gradle_8_2_V2.txt
+++ b/android/testData/snapshots/ideModels/multiFlavor_Agp_8_2_Gradle_8_2_V2.txt
@@ -1103,6 +1103,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : firstAbcSecondAbcDebug
         applicationId                 : com.example.multiflavor.firstAbc.secondAbc.debug
         testApplicationId             : com.example.multiflavor.firstAbc.secondAbc.debug.test
@@ -1204,6 +1205,7 @@
                 b                             : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1262,6 +1264,7 @@
                 b                             : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/multiFlavor_V2.txt b/android/testData/snapshots/ideModels/multiFlavor_V2.txt
index e43907e..1aae872 100644
--- a/android/testData/snapshots/ideModels/multiFlavor_V2.txt
+++ b/android/testData/snapshots/ideModels/multiFlavor_V2.txt
@@ -1129,6 +1129,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : firstAbcSecondAbcDebug
         applicationId                 : com.example.multiflavor.firstAbc.secondAbc.debug
         testApplicationId             : com.example.multiflavor.firstAbc.secondAbc.debug.test
@@ -1230,6 +1231,7 @@
                 b                             : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1288,6 +1290,7 @@
                 b                             : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/multiFlavor____withFiltering_Agp_4_1_Gradle_6_7_1_V1.txt b/android/testData/snapshots/ideModels/multiFlavor____withFiltering_Agp_4_1_Gradle_6_7_1_V1.txt
index 8ce417c..7233747 100644
--- a/android/testData/snapshots/ideModels/multiFlavor____withFiltering_Agp_4_1_Gradle_6_7_1_V1.txt
+++ b/android/testData/snapshots/ideModels/multiFlavor____withFiltering_Agp_4_1_Gradle_6_7_1_V1.txt
@@ -432,6 +432,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : firstAbcSecondAbcDebug
         applicationId                 : com.example.multiflavor.firstAbc.secondAbc.debug
         testApplicationId             : com.example.multiflavor.firstAbc.secondAbc.debug.test
@@ -513,6 +514,7 @@
                 b                             : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -566,6 +568,7 @@
                 b                             : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/multiFlavor____withFiltering_Agp_4_2_Gradle_6_7_1_V1.txt b/android/testData/snapshots/ideModels/multiFlavor____withFiltering_Agp_4_2_Gradle_6_7_1_V1.txt
index 5939393..a40d170 100644
--- a/android/testData/snapshots/ideModels/multiFlavor____withFiltering_Agp_4_2_Gradle_6_7_1_V1.txt
+++ b/android/testData/snapshots/ideModels/multiFlavor____withFiltering_Agp_4_2_Gradle_6_7_1_V1.txt
@@ -431,6 +431,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : firstAbcSecondAbcDebug
         applicationId                 : com.example.multiflavor.firstAbc.secondAbc.debug
         testApplicationId             : com.example.multiflavor.firstAbc.secondAbc.debug.test
@@ -512,6 +513,7 @@
                 b                             : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -565,6 +567,7 @@
                 b                             : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/multiFlavor____withFiltering_Agp_7_0_Gradle_7_0_2_V1.txt b/android/testData/snapshots/ideModels/multiFlavor____withFiltering_Agp_7_0_Gradle_7_0_2_V1.txt
index f841f21..6797eb1 100644
--- a/android/testData/snapshots/ideModels/multiFlavor____withFiltering_Agp_7_0_Gradle_7_0_2_V1.txt
+++ b/android/testData/snapshots/ideModels/multiFlavor____withFiltering_Agp_7_0_Gradle_7_0_2_V1.txt
@@ -327,6 +327,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : firstAbcSecondAbcDebug
         applicationId                 : com.example.multiflavor.firstAbc.secondAbc.debug
         testApplicationId             : com.example.multiflavor.firstAbc.secondAbc.debug.test
@@ -414,6 +415,7 @@
                 b                             : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -473,6 +475,7 @@
                 b                             : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/multiFlavor____withFiltering_Agp_7_1_Gradle_7_2_V1.txt b/android/testData/snapshots/ideModels/multiFlavor____withFiltering_Agp_7_1_Gradle_7_2_V1.txt
index b451642..c3cf0bf 100644
--- a/android/testData/snapshots/ideModels/multiFlavor____withFiltering_Agp_7_1_Gradle_7_2_V1.txt
+++ b/android/testData/snapshots/ideModels/multiFlavor____withFiltering_Agp_7_1_Gradle_7_2_V1.txt
@@ -368,6 +368,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : firstAbcSecondAbcDebug
         applicationId                 : com.example.multiflavor.firstAbc.secondAbc.debug
         testApplicationId             : com.example.multiflavor.firstAbc.secondAbc.debug.test
@@ -455,6 +456,7 @@
                 b                             : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -514,6 +516,7 @@
                 b                             : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/multiFlavor____withFiltering_Agp_7_2_Gradle_7_3_3_V1.txt b/android/testData/snapshots/ideModels/multiFlavor____withFiltering_Agp_7_2_Gradle_7_3_3_V1.txt
index 9ac41b2..34375ec 100644
--- a/android/testData/snapshots/ideModels/multiFlavor____withFiltering_Agp_7_2_Gradle_7_3_3_V1.txt
+++ b/android/testData/snapshots/ideModels/multiFlavor____withFiltering_Agp_7_2_Gradle_7_3_3_V1.txt
@@ -368,6 +368,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : firstAbcSecondAbcDebug
         applicationId                 : com.example.multiflavor.firstAbc.secondAbc.debug
         testApplicationId             : com.example.multiflavor.firstAbc.secondAbc.debug.test
@@ -457,6 +458,7 @@
                 b                             : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -518,6 +520,7 @@
                 b                             : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/multiFlavor____withFiltering_Agp_7_2_Gradle_7_3_3_V2.txt b/android/testData/snapshots/ideModels/multiFlavor____withFiltering_Agp_7_2_Gradle_7_3_3_V2.txt
index d8f1baa..3e63c61 100644
--- a/android/testData/snapshots/ideModels/multiFlavor____withFiltering_Agp_7_2_Gradle_7_3_3_V2.txt
+++ b/android/testData/snapshots/ideModels/multiFlavor____withFiltering_Agp_7_2_Gradle_7_3_3_V2.txt
@@ -368,6 +368,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : firstAbcSecondAbcDebug
         applicationId                 : com.example.multiflavor.firstAbc.secondAbc.debug
         testApplicationId             : com.example.multiflavor.firstAbc.secondAbc.debug.test
@@ -457,6 +458,7 @@
                 b                             : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -518,6 +520,7 @@
                 b                             : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/multiFlavor____withFiltering_Agp_7_3_Gradle_7_4_V2.txt b/android/testData/snapshots/ideModels/multiFlavor____withFiltering_Agp_7_3_Gradle_7_4_V2.txt
index 9617e7d..7b51bcd 100644
--- a/android/testData/snapshots/ideModels/multiFlavor____withFiltering_Agp_7_3_Gradle_7_4_V2.txt
+++ b/android/testData/snapshots/ideModels/multiFlavor____withFiltering_Agp_7_3_Gradle_7_4_V2.txt
@@ -368,6 +368,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : firstAbcSecondAbcDebug
         applicationId                 : com.example.multiflavor.firstAbc.secondAbc.debug
         testApplicationId             : com.example.multiflavor.firstAbc.secondAbc.debug.test
@@ -457,6 +458,7 @@
                 b                             : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -518,6 +520,7 @@
                 b                             : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/multiFlavor____withFiltering_Agp_7_4_Gradle_7_5_V2.txt b/android/testData/snapshots/ideModels/multiFlavor____withFiltering_Agp_7_4_Gradle_7_5_V2.txt
index f3e06f1..529d69c 100644
--- a/android/testData/snapshots/ideModels/multiFlavor____withFiltering_Agp_7_4_Gradle_7_5_V2.txt
+++ b/android/testData/snapshots/ideModels/multiFlavor____withFiltering_Agp_7_4_Gradle_7_5_V2.txt
@@ -368,6 +368,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : firstAbcSecondAbcDebug
         applicationId                 : com.example.multiflavor.firstAbc.secondAbc.debug
         testApplicationId             : com.example.multiflavor.firstAbc.secondAbc.debug.test
@@ -457,6 +458,7 @@
                 b                             : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -518,6 +520,7 @@
                 b                             : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/multiFlavor____withFiltering_Agp_8_0_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/multiFlavor____withFiltering_Agp_8_0_Gradle_8_0_V2.txt
index b600904..709ed10 100644
--- a/android/testData/snapshots/ideModels/multiFlavor____withFiltering_Agp_8_0_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/multiFlavor____withFiltering_Agp_8_0_Gradle_8_0_V2.txt
@@ -363,6 +363,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : firstAbcSecondAbcDebug
         applicationId                 : com.example.multiflavor.firstAbc.secondAbc.debug
         testApplicationId             : com.example.multiflavor.firstAbc.secondAbc.debug.test
@@ -449,6 +450,7 @@
                 b                             : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -507,6 +509,7 @@
                 b                             : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/multiFlavor____withFiltering_Agp_8_1_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/multiFlavor____withFiltering_Agp_8_1_Gradle_8_0_V2.txt
index c5f6cec..b86a296 100644
--- a/android/testData/snapshots/ideModels/multiFlavor____withFiltering_Agp_8_1_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/multiFlavor____withFiltering_Agp_8_1_Gradle_8_0_V2.txt
@@ -363,6 +363,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : firstAbcSecondAbcDebug
         applicationId                 : com.example.multiflavor.firstAbc.secondAbc.debug
         testApplicationId             : com.example.multiflavor.firstAbc.secondAbc.debug.test
@@ -449,6 +450,7 @@
                 b                             : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -507,6 +509,7 @@
                 b                             : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/multiFlavor____withFiltering_Agp_8_2_Gradle_8_2_V2.txt b/android/testData/snapshots/ideModels/multiFlavor____withFiltering_Agp_8_2_Gradle_8_2_V2.txt
index 8927a92..ab96f95 100644
--- a/android/testData/snapshots/ideModels/multiFlavor____withFiltering_Agp_8_2_Gradle_8_2_V2.txt
+++ b/android/testData/snapshots/ideModels/multiFlavor____withFiltering_Agp_8_2_Gradle_8_2_V2.txt
@@ -363,6 +363,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : firstAbcSecondAbcDebug
         applicationId                 : com.example.multiflavor.firstAbc.secondAbc.debug
         testApplicationId             : com.example.multiflavor.firstAbc.secondAbc.debug.test
@@ -449,6 +450,7 @@
                 b                             : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -507,6 +509,7 @@
                 b                             : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/multiFlavor____withFiltering_V2.txt b/android/testData/snapshots/ideModels/multiFlavor____withFiltering_V2.txt
index 09d6c6c..1882311 100644
--- a/android/testData/snapshots/ideModels/multiFlavor____withFiltering_V2.txt
+++ b/android/testData/snapshots/ideModels/multiFlavor____withFiltering_V2.txt
@@ -380,6 +380,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : firstAbcSecondAbcDebug
         applicationId                 : com.example.multiflavor.firstAbc.secondAbc.debug
         testApplicationId             : com.example.multiflavor.firstAbc.secondAbc.debug.test
@@ -466,6 +467,7 @@
                 b                             : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -524,6 +526,7 @@
                 b                             : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/namespaces_Agp_4_1_Gradle_6_7_1_V1.txt b/android/testData/snapshots/ideModels/namespaces_Agp_4_1_Gradle_6_7_1_V1.txt
index 05c56f9..bd5d5ce 100644
--- a/android/testData/snapshots/ideModels/namespaces_Agp_4_1_Gradle_6_7_1_V1.txt
+++ b/android/testData/snapshots/ideModels/namespaces_Agp_4_1_Gradle_6_7_1_V1.txt
@@ -542,6 +542,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : testData.namespaces
         testApplicationId             : testData.namespaces.test
@@ -610,6 +611,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -657,6 +659,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -886,6 +889,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -948,6 +952,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -995,6 +1000,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1208,6 +1214,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.otherlib.test
     - basicVariant:               : release
@@ -1270,6 +1277,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1317,6 +1325,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/namespaces_Agp_4_2_Gradle_6_7_1_V1.txt b/android/testData/snapshots/ideModels/namespaces_Agp_4_2_Gradle_6_7_1_V1.txt
index 7286c92..6058407 100644
--- a/android/testData/snapshots/ideModels/namespaces_Agp_4_2_Gradle_6_7_1_V1.txt
+++ b/android/testData/snapshots/ideModels/namespaces_Agp_4_2_Gradle_6_7_1_V1.txt
@@ -539,6 +539,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : testData.namespaces
         testApplicationId             : testData.namespaces.test
@@ -607,6 +608,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -654,6 +656,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -883,6 +886,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -945,6 +949,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -992,6 +997,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1205,6 +1211,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.otherlib.test
     - basicVariant:               : release
@@ -1267,6 +1274,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1314,6 +1322,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/namespaces_Agp_7_0_Gradle_7_0_2_V1.txt b/android/testData/snapshots/ideModels/namespaces_Agp_7_0_Gradle_7_0_2_V1.txt
index c04588d..92da79a 100644
--- a/android/testData/snapshots/ideModels/namespaces_Agp_7_0_Gradle_7_0_2_V1.txt
+++ b/android/testData/snapshots/ideModels/namespaces_Agp_7_0_Gradle_7_0_2_V1.txt
@@ -434,6 +434,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : testData.namespaces
         testApplicationId             : testData.namespaces.test
@@ -508,6 +509,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -561,6 +563,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -796,6 +799,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -864,6 +868,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -917,6 +922,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1135,6 +1141,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.otherlib.test
     - basicVariant:               : release
@@ -1203,6 +1210,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1256,6 +1264,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/namespaces_Agp_7_1_Gradle_7_2_V1.txt b/android/testData/snapshots/ideModels/namespaces_Agp_7_1_Gradle_7_2_V1.txt
index 450e854..3c258f8 100644
--- a/android/testData/snapshots/ideModels/namespaces_Agp_7_1_Gradle_7_2_V1.txt
+++ b/android/testData/snapshots/ideModels/namespaces_Agp_7_1_Gradle_7_2_V1.txt
@@ -485,6 +485,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : testData.namespaces
         testApplicationId             : testData.namespaces.test
@@ -559,6 +560,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -612,6 +614,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -847,6 +850,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -915,6 +919,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -968,6 +973,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1186,6 +1192,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.otherlib.test
     - basicVariant:               : release
@@ -1254,6 +1261,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1307,6 +1315,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/namespaces_Agp_7_2_Gradle_7_3_3_V1.txt b/android/testData/snapshots/ideModels/namespaces_Agp_7_2_Gradle_7_3_3_V1.txt
index b6b486c..169693d 100644
--- a/android/testData/snapshots/ideModels/namespaces_Agp_7_2_Gradle_7_3_3_V1.txt
+++ b/android/testData/snapshots/ideModels/namespaces_Agp_7_2_Gradle_7_3_3_V1.txt
@@ -485,6 +485,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : testData.namespaces
         testApplicationId             : testData.namespaces.test
@@ -559,6 +560,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -612,6 +614,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -831,6 +834,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -899,6 +903,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -952,6 +957,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1154,6 +1160,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.otherlib.test
     - basicVariant:               : release
@@ -1222,6 +1229,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1275,6 +1283,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/namespaces_Agp_7_2_Gradle_7_3_3_V2.txt b/android/testData/snapshots/ideModels/namespaces_Agp_7_2_Gradle_7_3_3_V2.txt
index 6512f7a..3013bb0 100644
--- a/android/testData/snapshots/ideModels/namespaces_Agp_7_2_Gradle_7_3_3_V2.txt
+++ b/android/testData/snapshots/ideModels/namespaces_Agp_7_2_Gradle_7_3_3_V2.txt
@@ -485,6 +485,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : testData.namespaces
         testApplicationId             : testData.namespaces.test
@@ -559,6 +560,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -612,6 +614,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -828,6 +831,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -896,6 +900,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -949,6 +954,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1155,6 +1161,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.otherlib.test
     - basicVariant:               : release
@@ -1223,6 +1230,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1276,6 +1284,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/namespaces_Agp_7_3_Gradle_7_4_V2.txt b/android/testData/snapshots/ideModels/namespaces_Agp_7_3_Gradle_7_4_V2.txt
index 73f04ae..1e425e7 100644
--- a/android/testData/snapshots/ideModels/namespaces_Agp_7_3_Gradle_7_4_V2.txt
+++ b/android/testData/snapshots/ideModels/namespaces_Agp_7_3_Gradle_7_4_V2.txt
@@ -485,6 +485,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : testData.namespaces
         testApplicationId             : testData.namespaces.test
@@ -559,6 +560,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -612,6 +614,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -829,6 +832,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -897,6 +901,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -950,6 +955,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1157,6 +1163,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.otherlib.test
     - basicVariant:               : release
@@ -1225,6 +1232,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1278,6 +1286,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/namespaces_Agp_7_4_Gradle_7_5_V2.txt b/android/testData/snapshots/ideModels/namespaces_Agp_7_4_Gradle_7_5_V2.txt
index d60bbf4..b2b826c 100644
--- a/android/testData/snapshots/ideModels/namespaces_Agp_7_4_Gradle_7_5_V2.txt
+++ b/android/testData/snapshots/ideModels/namespaces_Agp_7_4_Gradle_7_5_V2.txt
@@ -485,6 +485,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : testData.namespaces
         testApplicationId             : testData.namespaces.test
@@ -559,6 +560,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -612,6 +614,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -829,6 +832,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -897,6 +901,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -950,6 +955,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1157,6 +1163,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.otherlib.test
     - basicVariant:               : release
@@ -1225,6 +1232,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1278,6 +1286,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/namespaces_Agp_8_0_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/namespaces_Agp_8_0_Gradle_8_0_V2.txt
index 26f4cdc..fe59966 100644
--- a/android/testData/snapshots/ideModels/namespaces_Agp_8_0_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/namespaces_Agp_8_0_Gradle_8_0_V2.txt
@@ -462,6 +462,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : testData.namespaces
         testApplicationId             : testData.namespaces.test
@@ -533,6 +534,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -583,6 +585,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -790,6 +793,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -855,6 +859,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -905,6 +910,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1102,6 +1108,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.otherlib.test
     - basicVariant:               : release
@@ -1167,6 +1174,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1217,6 +1225,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/namespaces_Agp_8_1_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/namespaces_Agp_8_1_Gradle_8_0_V2.txt
index 747d835..49f7f0e 100644
--- a/android/testData/snapshots/ideModels/namespaces_Agp_8_1_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/namespaces_Agp_8_1_Gradle_8_0_V2.txt
@@ -462,6 +462,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : testData.namespaces
         testApplicationId             : testData.namespaces.test
@@ -533,6 +534,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -583,6 +585,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -790,6 +793,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -855,6 +859,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -905,6 +910,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1102,6 +1108,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.otherlib.test
     - basicVariant:               : release
@@ -1167,6 +1174,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1217,6 +1225,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/namespaces_Agp_8_2_Gradle_8_2_V2.txt b/android/testData/snapshots/ideModels/namespaces_Agp_8_2_Gradle_8_2_V2.txt
index c39b3df..6df82cee8 100644
--- a/android/testData/snapshots/ideModels/namespaces_Agp_8_2_Gradle_8_2_V2.txt
+++ b/android/testData/snapshots/ideModels/namespaces_Agp_8_2_Gradle_8_2_V2.txt
@@ -462,6 +462,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : testData.namespaces
         testApplicationId             : testData.namespaces.test
@@ -533,6 +534,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -583,6 +585,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -790,6 +793,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -855,6 +859,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -905,6 +910,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1102,6 +1108,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.otherlib.test
     - basicVariant:               : release
@@ -1167,6 +1174,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1217,6 +1225,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/namespaces_V2.txt b/android/testData/snapshots/ideModels/namespaces_V2.txt
index bcb528e..745a3f2 100644
--- a/android/testData/snapshots/ideModels/namespaces_V2.txt
+++ b/android/testData/snapshots/ideModels/namespaces_V2.txt
@@ -478,6 +478,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : testData.namespaces
         testApplicationId             : testData.namespaces.test
@@ -549,6 +550,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -599,6 +601,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -806,6 +809,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -871,6 +875,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -921,6 +926,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1118,6 +1124,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.otherlib.test
     - basicVariant:               : release
@@ -1183,6 +1190,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1233,6 +1241,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies_Agp_7_2_Gradle_7_3_3_V2.txt b/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies_Agp_7_2_Gradle_7_3_3_V2.txt
index 9a46ed5..4a1e7d6 100644
--- a/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies_Agp_7_2_Gradle_7_3_3_V2.txt
+++ b/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies_Agp_7_2_Gradle_7_3_3_V2.txt
@@ -2488,6 +2488,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : me.monori.gradleprojectpathissue
         testApplicationId             : me.monori.gradleprojectpathissue.test
@@ -2563,6 +2564,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2618,6 +2620,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3605,6 +3608,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : me.monori.feature.a.test
     - basicVariant:               : release
@@ -3665,6 +3669,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3718,6 +3723,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4683,6 +4689,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : me.monori.feature.b.test
     - basicVariant:               : release
@@ -4767,6 +4774,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4844,6 +4852,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5701,6 +5710,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : test.test
     - basicVariant:               : release
@@ -5761,6 +5771,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5814,6 +5825,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6013,6 +6025,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -6083,6 +6096,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6138,6 +6152,7 @@
             ProguardFiles                 : <ROOT>/lib/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies_Agp_7_3_Gradle_7_4_V2.txt b/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies_Agp_7_3_Gradle_7_4_V2.txt
index 50b7ea2..7ca2d82 100644
--- a/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies_Agp_7_3_Gradle_7_4_V2.txt
+++ b/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies_Agp_7_3_Gradle_7_4_V2.txt
@@ -2496,6 +2496,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : me.monori.gradleprojectpathissue
         testApplicationId             : me.monori.gradleprojectpathissue.test
@@ -2571,6 +2572,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2626,6 +2628,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3615,6 +3618,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : me.monori.feature.a.test
     - basicVariant:               : release
@@ -3675,6 +3679,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3728,6 +3733,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4695,6 +4701,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : me.monori.feature.b.test
     - basicVariant:               : release
@@ -4779,6 +4786,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4856,6 +4864,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5715,6 +5724,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : test.test
     - basicVariant:               : release
@@ -5775,6 +5785,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5828,6 +5839,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6029,6 +6041,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -6099,6 +6112,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6154,6 +6168,7 @@
             ProguardFiles                 : <ROOT>/lib/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies_Agp_7_4_Gradle_7_5_V2.txt b/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies_Agp_7_4_Gradle_7_5_V2.txt
index 59ce49e..faec8f8 100644
--- a/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies_Agp_7_4_Gradle_7_5_V2.txt
+++ b/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies_Agp_7_4_Gradle_7_5_V2.txt
@@ -2496,6 +2496,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : me.monori.gradleprojectpathissue
         testApplicationId             : me.monori.gradleprojectpathissue.test
@@ -2571,6 +2572,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2626,6 +2628,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3615,6 +3618,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : me.monori.feature.a.test
     - basicVariant:               : release
@@ -3675,6 +3679,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3728,6 +3733,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4695,6 +4701,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : me.monori.feature.b.test
     - basicVariant:               : release
@@ -4779,6 +4786,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4856,6 +4864,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5715,6 +5724,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : test.test
     - basicVariant:               : release
@@ -5775,6 +5785,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5828,6 +5839,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6029,6 +6041,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -6099,6 +6112,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6154,6 +6168,7 @@
             ProguardFiles                 : <ROOT>/lib/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies_Agp_8_0_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies_Agp_8_0_Gradle_8_0_V2.txt
index ba44a50..a945a6d 100644
--- a/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies_Agp_8_0_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies_Agp_8_0_Gradle_8_0_V2.txt
@@ -2455,6 +2455,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : me.monori.gradleprojectpathissue
         testApplicationId             : me.monori.gradleprojectpathissue.test
@@ -2527,6 +2528,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2579,6 +2581,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3558,6 +3561,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : me.monori.feature.a.test
     - basicVariant:               : release
@@ -3615,6 +3619,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3665,6 +3670,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4622,6 +4628,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : me.monori.feature.b.test
     - basicVariant:               : release
@@ -4697,6 +4704,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4765,6 +4773,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5610,6 +5619,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : test.test
     - basicVariant:               : release
@@ -5667,6 +5677,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5717,6 +5728,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5908,6 +5920,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -5975,6 +5988,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6027,6 +6041,7 @@
             ProguardFiles                 : <ROOT>/lib/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies_Agp_8_1_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies_Agp_8_1_Gradle_8_0_V2.txt
index 0593443..26b3584 100644
--- a/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies_Agp_8_1_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies_Agp_8_1_Gradle_8_0_V2.txt
@@ -2455,6 +2455,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : me.monori.gradleprojectpathissue
         testApplicationId             : me.monori.gradleprojectpathissue.test
@@ -2527,6 +2528,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2579,6 +2581,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3558,6 +3561,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : me.monori.feature.a.test
     - basicVariant:               : release
@@ -3615,6 +3619,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3665,6 +3670,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4622,6 +4628,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : me.monori.feature.b.test
     - basicVariant:               : release
@@ -4697,6 +4704,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4765,6 +4773,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5610,6 +5619,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : test.test
     - basicVariant:               : release
@@ -5667,6 +5677,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5717,6 +5728,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5908,6 +5920,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -5975,6 +5988,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6027,6 +6041,7 @@
             ProguardFiles                 : <ROOT>/lib/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies_Agp_8_2_Gradle_8_2_V2.txt b/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies_Agp_8_2_Gradle_8_2_V2.txt
index 7b4b93a..c3ba8ce 100644
--- a/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies_Agp_8_2_Gradle_8_2_V2.txt
+++ b/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies_Agp_8_2_Gradle_8_2_V2.txt
@@ -2455,6 +2455,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : me.monori.gradleprojectpathissue
         testApplicationId             : me.monori.gradleprojectpathissue.test
@@ -2527,6 +2528,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2579,6 +2581,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3552,6 +3555,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : me.monori.feature.a.test
     - basicVariant:               : release
@@ -3609,6 +3613,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3659,6 +3664,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4612,6 +4618,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : me.monori.feature.b.test
     - basicVariant:               : release
@@ -4687,6 +4694,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4755,6 +4763,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5597,6 +5606,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : test.test
     - basicVariant:               : release
@@ -5654,6 +5664,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5704,6 +5715,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5895,6 +5907,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -5962,6 +5975,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6014,6 +6028,7 @@
             ProguardFiles                 : <ROOT>/lib/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies_V2.txt b/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies_V2.txt
index 18fde67..c108359 100644
--- a/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies_V2.txt
+++ b/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies_V2.txt
@@ -2481,6 +2481,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : me.monori.gradleprojectpathissue
         testApplicationId             : me.monori.gradleprojectpathissue.test
@@ -2553,6 +2554,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2605,6 +2607,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3578,6 +3581,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : me.monori.feature.a.test
     - basicVariant:               : release
@@ -3635,6 +3639,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3685,6 +3690,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4638,6 +4644,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : me.monori.feature.b.test
     - basicVariant:               : release
@@ -4713,6 +4720,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4781,6 +4789,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5623,6 +5632,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : test.test
     - basicVariant:               : release
@@ -5680,6 +5690,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5730,6 +5741,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5921,6 +5933,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -5988,6 +6001,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6040,6 +6054,7 @@
             ProguardFiles                 : <ROOT>/lib/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies___manualTestFixturesWorkaround_Agp_7_2_Gradle_7_3_3_V2.txt b/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies___manualTestFixturesWorkaround_Agp_7_2_Gradle_7_3_3_V2.txt
index 4b41843..3711352 100644
--- a/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies___manualTestFixturesWorkaround_Agp_7_2_Gradle_7_3_3_V2.txt
+++ b/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies___manualTestFixturesWorkaround_Agp_7_2_Gradle_7_3_3_V2.txt
@@ -2491,6 +2491,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : me.monori.gradleprojectpathissue
         testApplicationId             : me.monori.gradleprojectpathissue.test
@@ -2566,6 +2567,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2621,6 +2623,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3598,6 +3601,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : me.monori.feature.a.test
     - basicVariant:               : release
@@ -3658,6 +3662,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3711,6 +3716,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4676,6 +4682,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : me.monori.feature.b.test
     - basicVariant:               : release
@@ -4760,6 +4767,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4837,6 +4845,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5694,6 +5703,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : test.test
     - basicVariant:               : release
@@ -5754,6 +5764,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5807,6 +5818,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6006,6 +6018,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -6076,6 +6089,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6131,6 +6145,7 @@
             ProguardFiles                 : <ROOT>/lib/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies___manualTestFixturesWorkaround_Agp_7_3_Gradle_7_4_V2.txt b/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies___manualTestFixturesWorkaround_Agp_7_3_Gradle_7_4_V2.txt
index 644244c..969a15d 100644
--- a/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies___manualTestFixturesWorkaround_Agp_7_3_Gradle_7_4_V2.txt
+++ b/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies___manualTestFixturesWorkaround_Agp_7_3_Gradle_7_4_V2.txt
@@ -2499,6 +2499,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : me.monori.gradleprojectpathissue
         testApplicationId             : me.monori.gradleprojectpathissue.test
@@ -2574,6 +2575,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2629,6 +2631,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3608,6 +3611,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : me.monori.feature.a.test
     - basicVariant:               : release
@@ -3668,6 +3672,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3721,6 +3726,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4688,6 +4694,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : me.monori.feature.b.test
     - basicVariant:               : release
@@ -4772,6 +4779,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4849,6 +4857,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5708,6 +5717,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : test.test
     - basicVariant:               : release
@@ -5768,6 +5778,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5821,6 +5832,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6022,6 +6034,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -6092,6 +6105,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6147,6 +6161,7 @@
             ProguardFiles                 : <ROOT>/lib/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies___manualTestFixturesWorkaround_Agp_7_4_Gradle_7_5_V2.txt b/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies___manualTestFixturesWorkaround_Agp_7_4_Gradle_7_5_V2.txt
index 848bcef..876470b 100644
--- a/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies___manualTestFixturesWorkaround_Agp_7_4_Gradle_7_5_V2.txt
+++ b/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies___manualTestFixturesWorkaround_Agp_7_4_Gradle_7_5_V2.txt
@@ -2499,6 +2499,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : me.monori.gradleprojectpathissue
         testApplicationId             : me.monori.gradleprojectpathissue.test
@@ -2574,6 +2575,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2629,6 +2631,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3608,6 +3611,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : me.monori.feature.a.test
     - basicVariant:               : release
@@ -3668,6 +3672,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3721,6 +3726,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4688,6 +4694,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : me.monori.feature.b.test
     - basicVariant:               : release
@@ -4772,6 +4779,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4849,6 +4857,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5708,6 +5717,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : test.test
     - basicVariant:               : release
@@ -5768,6 +5778,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5821,6 +5832,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6022,6 +6034,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -6092,6 +6105,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6147,6 +6161,7 @@
             ProguardFiles                 : <ROOT>/lib/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies___manualTestFixturesWorkaround_Agp_8_0_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies___manualTestFixturesWorkaround_Agp_8_0_Gradle_8_0_V2.txt
index ded10d1..72dfb80 100644
--- a/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies___manualTestFixturesWorkaround_Agp_8_0_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies___manualTestFixturesWorkaround_Agp_8_0_Gradle_8_0_V2.txt
@@ -2458,6 +2458,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : me.monori.gradleprojectpathissue
         testApplicationId             : me.monori.gradleprojectpathissue.test
@@ -2530,6 +2531,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2582,6 +2584,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3551,6 +3554,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : me.monori.feature.a.test
     - basicVariant:               : release
@@ -3608,6 +3612,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3658,6 +3663,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4615,6 +4621,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : me.monori.feature.b.test
     - basicVariant:               : release
@@ -4690,6 +4697,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4758,6 +4766,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5603,6 +5612,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : test.test
     - basicVariant:               : release
@@ -5660,6 +5670,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5710,6 +5721,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5901,6 +5913,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -5968,6 +5981,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6020,6 +6034,7 @@
             ProguardFiles                 : <ROOT>/lib/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies___manualTestFixturesWorkaround_Agp_8_1_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies___manualTestFixturesWorkaround_Agp_8_1_Gradle_8_0_V2.txt
index 5eeef0a..fcbdaa2 100644
--- a/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies___manualTestFixturesWorkaround_Agp_8_1_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies___manualTestFixturesWorkaround_Agp_8_1_Gradle_8_0_V2.txt
@@ -2458,6 +2458,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : me.monori.gradleprojectpathissue
         testApplicationId             : me.monori.gradleprojectpathissue.test
@@ -2530,6 +2531,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2582,6 +2584,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3551,6 +3554,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : me.monori.feature.a.test
     - basicVariant:               : release
@@ -3608,6 +3612,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3658,6 +3663,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4615,6 +4621,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : me.monori.feature.b.test
     - basicVariant:               : release
@@ -4690,6 +4697,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4758,6 +4766,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5603,6 +5612,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : test.test
     - basicVariant:               : release
@@ -5660,6 +5670,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5710,6 +5721,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5901,6 +5913,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -5968,6 +5981,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6020,6 +6034,7 @@
             ProguardFiles                 : <ROOT>/lib/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies___manualTestFixturesWorkaround_Agp_8_2_Gradle_8_2_V2.txt b/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies___manualTestFixturesWorkaround_Agp_8_2_Gradle_8_2_V2.txt
index db818af..b74028a 100644
--- a/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies___manualTestFixturesWorkaround_Agp_8_2_Gradle_8_2_V2.txt
+++ b/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies___manualTestFixturesWorkaround_Agp_8_2_Gradle_8_2_V2.txt
@@ -2458,6 +2458,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : me.monori.gradleprojectpathissue
         testApplicationId             : me.monori.gradleprojectpathissue.test
@@ -2530,6 +2531,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2582,6 +2584,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3545,6 +3548,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : me.monori.feature.a.test
     - basicVariant:               : release
@@ -3602,6 +3606,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3652,6 +3657,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4605,6 +4611,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : me.monori.feature.b.test
     - basicVariant:               : release
@@ -4680,6 +4687,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4748,6 +4756,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5590,6 +5599,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : test.test
     - basicVariant:               : release
@@ -5647,6 +5657,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5697,6 +5708,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5888,6 +5900,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -5955,6 +5968,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6007,6 +6021,7 @@
             ProguardFiles                 : <ROOT>/lib/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies___manualTestFixturesWorkaround_V2.txt b/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies___manualTestFixturesWorkaround_V2.txt
index 21ad35e..9bccfe9 100644
--- a/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies___manualTestFixturesWorkaround_V2.txt
+++ b/android/testData/snapshots/ideModels/nonStandardSourceSetDependencies___manualTestFixturesWorkaround_V2.txt
@@ -2484,6 +2484,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : me.monori.gradleprojectpathissue
         testApplicationId             : me.monori.gradleprojectpathissue.test
@@ -2556,6 +2557,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2608,6 +2610,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3571,6 +3574,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : me.monori.feature.a.test
     - basicVariant:               : release
@@ -3628,6 +3632,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3678,6 +3683,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4631,6 +4637,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : me.monori.feature.b.test
     - basicVariant:               : release
@@ -4706,6 +4713,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4774,6 +4782,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5616,6 +5625,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : test.test
     - basicVariant:               : release
@@ -5673,6 +5683,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5723,6 +5734,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5914,6 +5926,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.lib.test
     - basicVariant:               : release
@@ -5981,6 +5994,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6033,6 +6047,7 @@
             ProguardFiles                 : <ROOT>/lib/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/nonStandardSourceSets_application_Agp_7_0_Gradle_7_0_2_V1.txt b/android/testData/snapshots/ideModels/nonStandardSourceSets_application_Agp_7_0_Gradle_7_0_2_V1.txt
index 253dbb5..58843a4 100644
--- a/android/testData/snapshots/ideModels/nonStandardSourceSets_application_Agp_7_0_Gradle_7_0_2_V1.txt
+++ b/android/testData/snapshots/ideModels/nonStandardSourceSets_application_Agp_7_0_Gradle_7_0_2_V1.txt
@@ -860,6 +860,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -935,6 +936,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -988,6 +990,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/nonStandardSourceSets_application_Agp_7_1_Gradle_7_2_V1.txt b/android/testData/snapshots/ideModels/nonStandardSourceSets_application_Agp_7_1_Gradle_7_2_V1.txt
index c140de0..62f12ef 100644
--- a/android/testData/snapshots/ideModels/nonStandardSourceSets_application_Agp_7_1_Gradle_7_2_V1.txt
+++ b/android/testData/snapshots/ideModels/nonStandardSourceSets_application_Agp_7_1_Gradle_7_2_V1.txt
@@ -877,6 +877,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -952,6 +953,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1005,6 +1007,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/nonStandardSourceSets_application_Agp_7_2_Gradle_7_3_3_V1.txt b/android/testData/snapshots/ideModels/nonStandardSourceSets_application_Agp_7_2_Gradle_7_3_3_V1.txt
index 264318d..829d898 100644
--- a/android/testData/snapshots/ideModels/nonStandardSourceSets_application_Agp_7_2_Gradle_7_3_3_V1.txt
+++ b/android/testData/snapshots/ideModels/nonStandardSourceSets_application_Agp_7_2_Gradle_7_3_3_V1.txt
@@ -877,6 +877,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -952,6 +953,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1007,6 +1009,7 @@
             ProguardFiles                 : <ROOT>/application/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/nonStandardSourceSets_application_Agp_7_2_Gradle_7_3_3_V2.txt b/android/testData/snapshots/ideModels/nonStandardSourceSets_application_Agp_7_2_Gradle_7_3_3_V2.txt
index 36e19e0..b34459e 100644
--- a/android/testData/snapshots/ideModels/nonStandardSourceSets_application_Agp_7_2_Gradle_7_3_3_V2.txt
+++ b/android/testData/snapshots/ideModels/nonStandardSourceSets_application_Agp_7_2_Gradle_7_3_3_V2.txt
@@ -846,6 +846,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -921,6 +922,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -976,6 +978,7 @@
             ProguardFiles                 : <ROOT>/application/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/nonStandardSourceSets_application_Agp_7_3_Gradle_7_4_V2.txt b/android/testData/snapshots/ideModels/nonStandardSourceSets_application_Agp_7_3_Gradle_7_4_V2.txt
index 2d6c82a..ff8d583 100644
--- a/android/testData/snapshots/ideModels/nonStandardSourceSets_application_Agp_7_3_Gradle_7_4_V2.txt
+++ b/android/testData/snapshots/ideModels/nonStandardSourceSets_application_Agp_7_3_Gradle_7_4_V2.txt
@@ -846,6 +846,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -921,6 +922,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -976,6 +978,7 @@
             ProguardFiles                 : <ROOT>/application/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/nonStandardSourceSets_application_Agp_7_4_Gradle_7_5_V2.txt b/android/testData/snapshots/ideModels/nonStandardSourceSets_application_Agp_7_4_Gradle_7_5_V2.txt
index 3b458de..0e5e35b 100644
--- a/android/testData/snapshots/ideModels/nonStandardSourceSets_application_Agp_7_4_Gradle_7_5_V2.txt
+++ b/android/testData/snapshots/ideModels/nonStandardSourceSets_application_Agp_7_4_Gradle_7_5_V2.txt
@@ -846,6 +846,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -921,6 +922,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -976,6 +978,7 @@
             ProguardFiles                 : <ROOT>/application/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/nonStandardSourceSets_application_Agp_8_0_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/nonStandardSourceSets_application_Agp_8_0_Gradle_8_0_V2.txt
index c06aca6..dd92056 100644
--- a/android/testData/snapshots/ideModels/nonStandardSourceSets_application_Agp_8_0_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/nonStandardSourceSets_application_Agp_8_0_Gradle_8_0_V2.txt
@@ -841,6 +841,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -913,6 +914,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -965,6 +967,7 @@
             ProguardFiles                 : <ROOT>/application/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/nonStandardSourceSets_application_Agp_8_1_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/nonStandardSourceSets_application_Agp_8_1_Gradle_8_0_V2.txt
index 15b884b..53b004b 100644
--- a/android/testData/snapshots/ideModels/nonStandardSourceSets_application_Agp_8_1_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/nonStandardSourceSets_application_Agp_8_1_Gradle_8_0_V2.txt
@@ -841,6 +841,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -913,6 +914,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -965,6 +967,7 @@
             ProguardFiles                 : <ROOT>/application/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/nonStandardSourceSets_application_Agp_8_2_Gradle_8_2_V2.txt b/android/testData/snapshots/ideModels/nonStandardSourceSets_application_Agp_8_2_Gradle_8_2_V2.txt
index 64706af..0ba6a1b 100644
--- a/android/testData/snapshots/ideModels/nonStandardSourceSets_application_Agp_8_2_Gradle_8_2_V2.txt
+++ b/android/testData/snapshots/ideModels/nonStandardSourceSets_application_Agp_8_2_Gradle_8_2_V2.txt
@@ -841,6 +841,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -913,6 +914,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -965,6 +967,7 @@
             ProguardFiles                 : <ROOT>/application/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/nonStandardSourceSets_application_V2.txt b/android/testData/snapshots/ideModels/nonStandardSourceSets_application_V2.txt
index d91994f..1c2a8c1 100644
--- a/android/testData/snapshots/ideModels/nonStandardSourceSets_application_V2.txt
+++ b/android/testData/snapshots/ideModels/nonStandardSourceSets_application_V2.txt
@@ -847,6 +847,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -919,6 +920,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -971,6 +973,7 @@
             ProguardFiles                 : <ROOT>/application/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/onlyModule_Agp_4_1_Gradle_6_7_1_V1.txt b/android/testData/snapshots/ideModels/onlyModule_Agp_4_1_Gradle_6_7_1_V1.txt
index 8bae8a6..21f95e2 100644
--- a/android/testData/snapshots/ideModels/onlyModule_Agp_4_1_Gradle_6_7_1_V1.txt
+++ b/android/testData/snapshots/ideModels/onlyModule_Agp_4_1_Gradle_6_7_1_V1.txt
@@ -1001,6 +1001,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.app
         testApplicationId             : com.example.android.app.test
@@ -1069,6 +1070,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1116,6 +1118,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1163,6 +1166,7 @@
             Name                          : benchmark
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1398,6 +1402,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.app.testmodule
     BootClassPath                 : <ANDROID_SDK>/platforms/android-32/android.jar
@@ -1432,6 +1437,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1653,6 +1659,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.test2
     BootClassPath                 : <ANDROID_SDK>/platforms/android-32/android.jar
@@ -1686,6 +1693,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/onlyModule_Agp_4_2_Gradle_6_7_1_V1.txt b/android/testData/snapshots/ideModels/onlyModule_Agp_4_2_Gradle_6_7_1_V1.txt
index ff1a19a..cb1285c 100644
--- a/android/testData/snapshots/ideModels/onlyModule_Agp_4_2_Gradle_6_7_1_V1.txt
+++ b/android/testData/snapshots/ideModels/onlyModule_Agp_4_2_Gradle_6_7_1_V1.txt
@@ -1053,6 +1053,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.app
         testApplicationId             : com.example.android.app.test
@@ -1121,6 +1122,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1168,6 +1170,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1215,6 +1218,7 @@
             Name                          : benchmark
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1450,6 +1454,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : benchmark
         applicationId                 : com.example.android.benchmark
     BootClassPath                 : <ANDROID_SDK>/platforms/android-32/android.jar
@@ -1483,6 +1488,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1502,6 +1508,7 @@
             Name                          : benchmark
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1722,6 +1729,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.app.testmodule
     BootClassPath                 : <ANDROID_SDK>/platforms/android-32/android.jar
@@ -1756,6 +1764,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1977,6 +1986,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.test2
     BootClassPath                 : <ANDROID_SDK>/platforms/android-32/android.jar
@@ -2010,6 +2020,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/onlyModule_Agp_7_0_Gradle_7_0_2_V1.txt b/android/testData/snapshots/ideModels/onlyModule_Agp_7_0_Gradle_7_0_2_V1.txt
index a9ccfbb..a90cf85b 100644
--- a/android/testData/snapshots/ideModels/onlyModule_Agp_7_0_Gradle_7_0_2_V1.txt
+++ b/android/testData/snapshots/ideModels/onlyModule_Agp_7_0_Gradle_7_0_2_V1.txt
@@ -993,6 +993,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.app
         testApplicationId             : com.example.android.app.test
@@ -1067,6 +1068,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1120,6 +1122,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1173,6 +1176,7 @@
             Name                          : benchmark
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1414,6 +1418,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : benchmark
         applicationId                 : com.example.android.benchmark
     BootClassPath                 : <ANDROID_SDK>/platforms/android-32/android.jar
@@ -1449,6 +1454,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1470,6 +1476,7 @@
             Name                          : benchmark
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1692,6 +1699,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.app.testmodule
     BootClassPath                 : <ANDROID_SDK>/platforms/android-32/android.jar
@@ -1728,6 +1736,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1951,6 +1960,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.test2
     BootClassPath                 : <ANDROID_SDK>/platforms/android-32/android.jar
@@ -1986,6 +1996,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/onlyModule_Agp_7_1_Gradle_7_2_V1.txt b/android/testData/snapshots/ideModels/onlyModule_Agp_7_1_Gradle_7_2_V1.txt
index 9869a4f..47791a4 100644
--- a/android/testData/snapshots/ideModels/onlyModule_Agp_7_1_Gradle_7_2_V1.txt
+++ b/android/testData/snapshots/ideModels/onlyModule_Agp_7_1_Gradle_7_2_V1.txt
@@ -1013,6 +1013,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.app
         testApplicationId             : com.example.android.app.test
@@ -1087,6 +1088,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1140,6 +1142,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1193,6 +1196,7 @@
             Name                          : benchmark
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1434,6 +1438,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : benchmark
         applicationId                 : com.example.android.benchmark
     BootClassPath                 : <ANDROID_SDK>/platforms/android-32/android.jar
@@ -1469,6 +1474,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1490,6 +1496,7 @@
             Name                          : benchmark
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1715,6 +1722,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.app.testmodule
     BootClassPath                 : <ANDROID_SDK>/platforms/android-32/android.jar
@@ -1751,6 +1759,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1977,6 +1986,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.test2
     BootClassPath                 : <ANDROID_SDK>/platforms/android-32/android.jar
@@ -2012,6 +2022,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/onlyModule_Agp_7_2_Gradle_7_3_3_V1.txt b/android/testData/snapshots/ideModels/onlyModule_Agp_7_2_Gradle_7_3_3_V1.txt
index 0a6b63b3..e8135b9 100644
--- a/android/testData/snapshots/ideModels/onlyModule_Agp_7_2_Gradle_7_3_3_V1.txt
+++ b/android/testData/snapshots/ideModels/onlyModule_Agp_7_2_Gradle_7_3_3_V1.txt
@@ -1016,6 +1016,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.app
         testApplicationId             : com.example.android.app.test
@@ -1090,6 +1091,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1143,6 +1145,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1180,6 +1183,7 @@
             Name                          : benchmark
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1405,6 +1409,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : benchmark
         applicationId                 : com.example.android.benchmark
     BootClassPath                 : <ANDROID_SDK>/platforms/android-32/android.jar
@@ -1440,6 +1445,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1449,6 +1455,7 @@
             Name                          : benchmark
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1674,6 +1681,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.app.testmodule
     BootClassPath                 : <ANDROID_SDK>/platforms/android-32/android.jar
@@ -1710,6 +1718,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1936,6 +1945,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.test2
     BootClassPath                 : <ANDROID_SDK>/platforms/android-32/android.jar
@@ -1971,6 +1981,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/onlyModule_Agp_7_2_Gradle_7_3_3_V2.txt b/android/testData/snapshots/ideModels/onlyModule_Agp_7_2_Gradle_7_3_3_V2.txt
index 9c93ee3..39f729c 100644
--- a/android/testData/snapshots/ideModels/onlyModule_Agp_7_2_Gradle_7_3_3_V2.txt
+++ b/android/testData/snapshots/ideModels/onlyModule_Agp_7_2_Gradle_7_3_3_V2.txt
@@ -987,6 +987,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.app
         testApplicationId             : com.example.android.app.test
@@ -1061,6 +1062,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1114,6 +1116,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1151,6 +1154,7 @@
             Name                          : benchmark
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1377,6 +1381,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : benchmark
         applicationId                 : com.example.android.benchmark
     BootClassPath                 : <ANDROID_SDK>/platforms/android-32/android.jar
@@ -1412,6 +1417,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1421,6 +1427,7 @@
             Name                          : benchmark
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1845,6 +1852,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.app.testmodule
     BootClassPath                 : <ANDROID_SDK>/platforms/android-32/android.jar
@@ -1881,6 +1889,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2305,6 +2314,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.test2
     BootClassPath                 : <ANDROID_SDK>/platforms/android-32/android.jar
@@ -2340,6 +2350,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/onlyModule_Agp_7_3_Gradle_7_4_V2.txt b/android/testData/snapshots/ideModels/onlyModule_Agp_7_3_Gradle_7_4_V2.txt
index 69ec465..7ed4e26 100644
--- a/android/testData/snapshots/ideModels/onlyModule_Agp_7_3_Gradle_7_4_V2.txt
+++ b/android/testData/snapshots/ideModels/onlyModule_Agp_7_3_Gradle_7_4_V2.txt
@@ -987,6 +987,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.app
         testApplicationId             : com.example.android.app.test
@@ -1061,6 +1062,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1114,6 +1116,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1151,6 +1154,7 @@
             Name                          : benchmark
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1379,6 +1383,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : benchmark
         applicationId                 : com.example.android.benchmark
     BootClassPath                 : <ANDROID_SDK>/platforms/android-<SDK_VERSION>/android.jar
@@ -1414,6 +1419,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1423,6 +1429,7 @@
             Name                          : benchmark
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1848,6 +1855,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.app.testmodule
     BootClassPath                 : <ANDROID_SDK>/platforms/android-<SDK_VERSION>/android.jar
@@ -1884,6 +1892,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2309,6 +2318,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.test2
     BootClassPath                 : <ANDROID_SDK>/platforms/android-<SDK_VERSION>/android.jar
@@ -2344,6 +2354,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/onlyModule_Agp_7_4_Gradle_7_5_V2.txt b/android/testData/snapshots/ideModels/onlyModule_Agp_7_4_Gradle_7_5_V2.txt
index a66ceee..d5015c2 100644
--- a/android/testData/snapshots/ideModels/onlyModule_Agp_7_4_Gradle_7_5_V2.txt
+++ b/android/testData/snapshots/ideModels/onlyModule_Agp_7_4_Gradle_7_5_V2.txt
@@ -987,6 +987,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.app
         testApplicationId             : com.example.android.app.test
@@ -1061,6 +1062,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1114,6 +1116,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1151,6 +1154,7 @@
             Name                          : benchmark
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1379,6 +1383,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : benchmark
         applicationId                 : com.example.android.benchmark
     BootClassPath                 : <ANDROID_SDK>/platforms/android-<SDK_VERSION>/android.jar
@@ -1414,6 +1419,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1423,6 +1429,7 @@
             Name                          : benchmark
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1848,6 +1855,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.app.testmodule
     BootClassPath                 : <ANDROID_SDK>/platforms/android-<SDK_VERSION>/android.jar
@@ -1884,6 +1892,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2309,6 +2318,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.test2
     BootClassPath                 : <ANDROID_SDK>/platforms/android-<SDK_VERSION>/android.jar
@@ -2344,6 +2354,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/onlyModule_Agp_8_0_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/onlyModule_Agp_8_0_Gradle_8_0_V2.txt
index 4907f6c..88b5dec 100644
--- a/android/testData/snapshots/ideModels/onlyModule_Agp_8_0_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/onlyModule_Agp_8_0_Gradle_8_0_V2.txt
@@ -977,6 +977,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.app
         testApplicationId             : com.example.android.app.test
@@ -1048,6 +1049,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1098,6 +1100,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1133,6 +1136,7 @@
             Name                          : benchmark
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1351,6 +1355,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : benchmark
         applicationId                 : com.example.android.benchmark
     BootClassPath                 : <ANDROID_SDK>/platforms/android-<SDK_VERSION>/android.jar
@@ -1385,6 +1390,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1394,6 +1400,7 @@
             Name                          : benchmark
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1814,6 +1821,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.app.testmodule
     BootClassPath                 : <ANDROID_SDK>/platforms/android-<SDK_VERSION>/android.jar
@@ -1849,6 +1857,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2269,6 +2278,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.test2
     BootClassPath                 : <ANDROID_SDK>/platforms/android-<SDK_VERSION>/android.jar
@@ -2303,6 +2313,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/onlyModule_Agp_8_1_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/onlyModule_Agp_8_1_Gradle_8_0_V2.txt
index 421b357..505b259 100644
--- a/android/testData/snapshots/ideModels/onlyModule_Agp_8_1_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/onlyModule_Agp_8_1_Gradle_8_0_V2.txt
@@ -977,6 +977,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.app
         testApplicationId             : com.example.android.app.test
@@ -1048,6 +1049,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1098,6 +1100,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1133,6 +1136,7 @@
             Name                          : benchmark
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1351,6 +1355,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : benchmark
         applicationId                 : com.example.android.benchmark
     BootClassPath                 : <ANDROID_SDK>/platforms/android-<SDK_VERSION>/android.jar
@@ -1385,6 +1390,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1394,6 +1400,7 @@
             Name                          : benchmark
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1814,6 +1821,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.app.testmodule
     BootClassPath                 : <ANDROID_SDK>/platforms/android-<SDK_VERSION>/android.jar
@@ -1849,6 +1857,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2269,6 +2278,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.test2
     BootClassPath                 : <ANDROID_SDK>/platforms/android-<SDK_VERSION>/android.jar
@@ -2303,6 +2313,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/onlyModule_Agp_8_2_Gradle_8_2_V2.txt b/android/testData/snapshots/ideModels/onlyModule_Agp_8_2_Gradle_8_2_V2.txt
index 3aeaa01..49345bc 100644
--- a/android/testData/snapshots/ideModels/onlyModule_Agp_8_2_Gradle_8_2_V2.txt
+++ b/android/testData/snapshots/ideModels/onlyModule_Agp_8_2_Gradle_8_2_V2.txt
@@ -977,6 +977,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.app
         testApplicationId             : com.example.android.app.test
@@ -1048,6 +1049,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1098,6 +1100,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1133,6 +1136,7 @@
             Name                          : benchmark
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1351,6 +1355,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : benchmark
         applicationId                 : com.example.android.benchmark
     BootClassPath                 : <ANDROID_SDK>/platforms/android-<SDK_VERSION>/android.jar
@@ -1385,6 +1390,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1394,6 +1400,7 @@
             Name                          : benchmark
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1814,6 +1821,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.app.testmodule
     BootClassPath                 : <ANDROID_SDK>/platforms/android-<SDK_VERSION>/android.jar
@@ -1849,6 +1857,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2269,6 +2278,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.test2
     BootClassPath                 : <ANDROID_SDK>/platforms/android-<SDK_VERSION>/android.jar
@@ -2303,6 +2313,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/onlyModule_V2.txt b/android/testData/snapshots/ideModels/onlyModule_V2.txt
index b06fd68..0c02fd6 100644
--- a/android/testData/snapshots/ideModels/onlyModule_V2.txt
+++ b/android/testData/snapshots/ideModels/onlyModule_V2.txt
@@ -992,6 +992,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.app
         testApplicationId             : com.example.android.app.test
@@ -1063,6 +1064,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1113,6 +1115,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1148,6 +1151,7 @@
             Name                          : benchmark
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1366,6 +1370,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : benchmark
         applicationId                 : com.example.android.benchmark
     BootClassPath                 : <ANDROID_SDK>/platforms/android-<SDK_VERSION>/android.jar
@@ -1400,6 +1405,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1409,6 +1415,7 @@
             Name                          : benchmark
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1829,6 +1836,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.app.testmodule
     BootClassPath                 : <ANDROID_SDK>/platforms/android-<SDK_VERSION>/android.jar
@@ -1864,6 +1872,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2284,6 +2293,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.android.test2
     BootClassPath                 : <ANDROID_SDK>/platforms/android-<SDK_VERSION>/android.jar
@@ -2318,6 +2328,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/privacySandboxSdk_libraryAndConsumer_V2.txt b/android/testData/snapshots/ideModels/privacySandboxSdk_libraryAndConsumer_V2.txt
index 1d1eb70..4c58184 100644
--- a/android/testData/snapshots/ideModels/privacySandboxSdk_libraryAndConsumer_V2.txt
+++ b/android/testData/snapshots/ideModels/privacySandboxSdk_libraryAndConsumer_V2.txt
@@ -1848,6 +1848,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.ads_sdk_implementation.test
     - basicVariant:               : release
@@ -1913,6 +1914,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1963,6 +1965,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2348,6 +2351,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.rubidumconsumer
         testApplicationId             : com.example.rubidumconsumer.test
@@ -2421,6 +2425,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2471,6 +2476,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3531,6 +3537,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.rubidumconsumer
         testApplicationId             : com.example.rubidumconsumer.test
@@ -3605,6 +3612,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3655,6 +3663,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4732,6 +4741,7 @@
         UseAndroidX                   : true
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.feature.test
     - basicVariant:               : release
@@ -4794,6 +4804,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4844,6 +4855,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/psdSample_Groovy_Agp_4_1_Gradle_6_7_1_V1.txt b/android/testData/snapshots/ideModels/psdSample_Groovy_Agp_4_1_Gradle_6_7_1_V1.txt
index 2b1e4c3..6ee8f19 100644
--- a/android/testData/snapshots/ideModels/psdSample_Groovy_Agp_4_1_Gradle_6_7_1_V1.txt
+++ b/android/testData/snapshots/ideModels/psdSample_Groovy_Agp_4_1_Gradle_6_7_1_V1.txt
@@ -2851,6 +2851,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : basicBarDebug
         applicationId                 : com.example.psd.sample.app.defaultSuffix.barSuffix
         testApplicationId             : com.example.psd.sample.app.default.test
@@ -2954,6 +2955,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : true
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3003,6 +3005,7 @@
             VersionNameSuffix             : vsuffix
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 2
             IsMinifyEnabled               : false
@@ -3051,6 +3054,7 @@
             VersionNameSuffix             : vnsSpecial
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3880,6 +3884,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.dyn_feature.test
     - basicVariant:               : release
@@ -3935,6 +3940,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3982,6 +3988,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4199,6 +4206,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.projectwithappandlib.lib.test
     - basicVariant:               : release
@@ -4261,6 +4269,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4308,6 +4317,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4703,6 +4713,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested1.test
     - basicVariant:               : release
@@ -4757,6 +4768,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4804,6 +4816,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5006,6 +5019,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested1.deep.test
     - basicVariant:               : release
@@ -5063,6 +5077,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5110,6 +5125,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5319,6 +5335,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : basicDebug
         testApplicationId             : com.example.nested2.test
     - basicVariant:               : paidDebug
@@ -5377,6 +5394,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5424,6 +5442,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5754,6 +5773,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested2.deep.test
     - basicVariant:               : release
@@ -5808,6 +5828,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5855,6 +5876,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6069,6 +6091,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested2.trans.deep2.test
     - basicVariant:               : release
@@ -6123,6 +6146,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : true
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6170,6 +6194,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/psdSample_Groovy_Agp_4_2_Gradle_6_7_1_V1.txt b/android/testData/snapshots/ideModels/psdSample_Groovy_Agp_4_2_Gradle_6_7_1_V1.txt
index 40b2b6d..12d07b7 100644
--- a/android/testData/snapshots/ideModels/psdSample_Groovy_Agp_4_2_Gradle_6_7_1_V1.txt
+++ b/android/testData/snapshots/ideModels/psdSample_Groovy_Agp_4_2_Gradle_6_7_1_V1.txt
@@ -2843,6 +2843,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : basicBarDebug
         applicationId                 : com.example.psd.sample.app.defaultSuffix.barSuffix
         testApplicationId             : com.example.psd.sample.app.default.test
@@ -2946,6 +2947,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : true
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2995,6 +2997,7 @@
             VersionNameSuffix             : vsuffix
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 2
             IsMinifyEnabled               : false
@@ -3043,6 +3046,7 @@
             VersionNameSuffix             : vnsSpecial
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3872,6 +3876,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.dyn_feature.test
     - basicVariant:               : release
@@ -3927,6 +3932,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3974,6 +3980,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4191,6 +4198,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.projectwithappandlib.lib.test
     - basicVariant:               : release
@@ -4253,6 +4261,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4300,6 +4309,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4695,6 +4705,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested1.test
     - basicVariant:               : release
@@ -4749,6 +4760,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4796,6 +4808,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4998,6 +5011,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested1.deep.test
     - basicVariant:               : release
@@ -5055,6 +5069,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5102,6 +5117,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5311,6 +5327,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : basicDebug
         testApplicationId             : com.example.nested2.test
     - basicVariant:               : paidDebug
@@ -5369,6 +5386,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5416,6 +5434,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5746,6 +5765,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested2.deep.test
     - basicVariant:               : release
@@ -5800,6 +5820,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5847,6 +5868,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6061,6 +6083,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested2.trans.deep2.test
     - basicVariant:               : release
@@ -6115,6 +6138,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : true
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6162,6 +6186,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/psdSample_Groovy_Agp_7_0_Gradle_7_0_2_V1.txt b/android/testData/snapshots/ideModels/psdSample_Groovy_Agp_7_0_Gradle_7_0_2_V1.txt
index 6a9f8d0..a73b88f 100644
--- a/android/testData/snapshots/ideModels/psdSample_Groovy_Agp_7_0_Gradle_7_0_2_V1.txt
+++ b/android/testData/snapshots/ideModels/psdSample_Groovy_Agp_7_0_Gradle_7_0_2_V1.txt
@@ -2328,6 +2328,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : basicBarDebug
         applicationId                 : com.example.psd.sample.app.defaultSuffix.barSuffix
         testApplicationId             : com.example.psd.sample.app.default.test
@@ -2437,6 +2438,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : true
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2492,6 +2494,7 @@
             VersionNameSuffix             : vsuffix
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 2
             IsMinifyEnabled               : false
@@ -2546,6 +2549,7 @@
             VersionNameSuffix             : vnsSpecial
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3417,6 +3421,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.dyn_feature.test
     - basicVariant:               : release
@@ -3478,6 +3483,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3531,6 +3537,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3754,6 +3761,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.projectwithappandlib.lib.test
     - basicVariant:               : release
@@ -3822,6 +3830,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3875,6 +3884,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4275,6 +4285,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested1.test
     - basicVariant:               : release
@@ -4335,6 +4346,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4388,6 +4400,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4595,6 +4608,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested1.deep.test
     - basicVariant:               : release
@@ -4658,6 +4672,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4711,6 +4726,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4925,6 +4941,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : basicDebug
         testApplicationId             : com.example.nested2.test
     - basicVariant:               : paidDebug
@@ -4989,6 +5006,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5042,6 +5060,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5395,6 +5414,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested2.deep.test
     - basicVariant:               : release
@@ -5455,6 +5475,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5508,6 +5529,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5727,6 +5749,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested2.trans.deep2.test
     - basicVariant:               : release
@@ -5787,6 +5810,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : true
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5840,6 +5864,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/psdSample_Groovy_Agp_7_1_Gradle_7_2_V1.txt b/android/testData/snapshots/ideModels/psdSample_Groovy_Agp_7_1_Gradle_7_2_V1.txt
index ce33a72..429f7b7 100644
--- a/android/testData/snapshots/ideModels/psdSample_Groovy_Agp_7_1_Gradle_7_2_V1.txt
+++ b/android/testData/snapshots/ideModels/psdSample_Groovy_Agp_7_1_Gradle_7_2_V1.txt
@@ -2491,6 +2491,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : basicBarDebug
         applicationId                 : com.example.psd.sample.app.defaultSuffix.barSuffix
         testApplicationId             : com.example.psd.sample.app.default.test
@@ -2600,6 +2601,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : true
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2655,6 +2657,7 @@
             VersionNameSuffix             : vsuffix
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 2
             IsMinifyEnabled               : false
@@ -2709,6 +2712,7 @@
             VersionNameSuffix             : vnsSpecial
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3574,6 +3578,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.dyn_feature.test
     - basicVariant:               : release
@@ -3635,6 +3640,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3688,6 +3694,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3911,6 +3918,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.projectwithappandlib.lib.test
     - basicVariant:               : release
@@ -3979,6 +3987,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4032,6 +4041,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4432,6 +4442,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested1.test
     - basicVariant:               : release
@@ -4492,6 +4503,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4545,6 +4557,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4752,6 +4765,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested1.deep.test
     - basicVariant:               : release
@@ -4815,6 +4829,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4868,6 +4883,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5082,6 +5098,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : basicDebug
         testApplicationId             : com.example.nested2.test
     - basicVariant:               : paidDebug
@@ -5146,6 +5163,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5199,6 +5217,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5552,6 +5571,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested2.deep.test
     - basicVariant:               : release
@@ -5612,6 +5632,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5665,6 +5686,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5884,6 +5906,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested2.trans.deep2.test
     - basicVariant:               : release
@@ -5944,6 +5967,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : true
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5997,6 +6021,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/psdSample_Groovy_Agp_7_2_Gradle_7_3_3_V1.txt b/android/testData/snapshots/ideModels/psdSample_Groovy_Agp_7_2_Gradle_7_3_3_V1.txt
index f4ec780..eeef20a 100644
--- a/android/testData/snapshots/ideModels/psdSample_Groovy_Agp_7_2_Gradle_7_3_3_V1.txt
+++ b/android/testData/snapshots/ideModels/psdSample_Groovy_Agp_7_2_Gradle_7_3_3_V1.txt
@@ -2491,6 +2491,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : basicBarDebug
         applicationId                 : com.example.psd.sample.app.defaultSuffix.barSuffix
         testApplicationId             : com.example.psd.sample.app.default.test
@@ -2600,6 +2601,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : true
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2658,6 +2660,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules2.txt [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 2
             IsMinifyEnabled               : false
@@ -2696,6 +2699,7 @@
             VersionNameSuffix             : vnsSpecial
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3545,6 +3549,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.dyn_feature.test
     - basicVariant:               : release
@@ -3606,6 +3611,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3659,6 +3665,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3866,6 +3873,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.projectwithappandlib.lib.test
     - basicVariant:               : release
@@ -3934,6 +3942,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3990,6 +3999,7 @@
             ConsumerProguardFiles         : <ROOT>/lib/other.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4374,6 +4384,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested1.test
     - basicVariant:               : release
@@ -4434,6 +4445,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4487,6 +4499,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4678,6 +4691,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested1.deep.test
     - basicVariant:               : release
@@ -4741,6 +4755,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4794,6 +4809,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4992,6 +5008,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : basicDebug
         testApplicationId             : com.example.nested2.test
     - basicVariant:               : paidDebug
@@ -5056,6 +5073,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5109,6 +5127,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5446,6 +5465,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested2.deep.test
     - basicVariant:               : release
@@ -5506,6 +5526,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5559,6 +5580,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5762,6 +5784,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested2.trans.deep2.test
     - basicVariant:               : release
@@ -5822,6 +5845,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : true
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5875,6 +5899,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/psdSample_Groovy_Agp_7_2_Gradle_7_3_3_V2.txt b/android/testData/snapshots/ideModels/psdSample_Groovy_Agp_7_2_Gradle_7_3_3_V2.txt
index 3e2fda5..40d7646 100644
--- a/android/testData/snapshots/ideModels/psdSample_Groovy_Agp_7_2_Gradle_7_3_3_V2.txt
+++ b/android/testData/snapshots/ideModels/psdSample_Groovy_Agp_7_2_Gradle_7_3_3_V2.txt
@@ -2458,6 +2458,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : basicBarDebug
         applicationId                 : com.example.psd.sample.app.defaultSuffix.barSuffix
         testApplicationId             : com.example.psd.sample.app.default.test
@@ -2567,6 +2568,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : true
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2625,6 +2627,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules2.txt [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 2
             IsMinifyEnabled               : false
@@ -2663,6 +2666,7 @@
             VersionNameSuffix             : vnsSpecial
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3986,6 +3990,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.dyn_feature.test
     - basicVariant:               : release
@@ -4047,6 +4052,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4100,6 +4106,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4306,6 +4313,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.projectwithappandlib.lib.test
     - basicVariant:               : release
@@ -4374,6 +4382,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4430,6 +4439,7 @@
             ConsumerProguardFiles         : <ROOT>/lib/other.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5330,6 +5340,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested1.test
     - basicVariant:               : release
@@ -5390,6 +5401,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5443,6 +5455,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5634,6 +5647,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested1.deep.test
     - basicVariant:               : release
@@ -5697,6 +5711,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5750,6 +5765,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5948,6 +5964,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : basicDebug
         testApplicationId             : com.example.nested2.test
     - basicVariant:               : paidDebug
@@ -6012,6 +6029,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6065,6 +6083,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6402,6 +6421,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested2.deep.test
     - basicVariant:               : release
@@ -6462,6 +6482,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6515,6 +6536,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6718,6 +6740,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested2.trans.deep2.test
     - basicVariant:               : release
@@ -6778,6 +6801,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : true
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6831,6 +6855,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/psdSample_Groovy_Agp_7_3_Gradle_7_4_V2.txt b/android/testData/snapshots/ideModels/psdSample_Groovy_Agp_7_3_Gradle_7_4_V2.txt
index cd7466b..234af64 100644
--- a/android/testData/snapshots/ideModels/psdSample_Groovy_Agp_7_3_Gradle_7_4_V2.txt
+++ b/android/testData/snapshots/ideModels/psdSample_Groovy_Agp_7_3_Gradle_7_4_V2.txt
@@ -2461,6 +2461,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : basicBarDebug
         applicationId                 : com.example.psd.sample.app.defaultSuffix.barSuffix
         testApplicationId             : com.example.psd.sample.app.default.test
@@ -2570,6 +2571,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : true
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2628,6 +2630,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules2.txt [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 2
             IsMinifyEnabled               : false
@@ -2666,6 +2669,7 @@
             VersionNameSuffix             : vnsSpecial
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3991,6 +3995,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.dyn_feature.test
     - basicVariant:               : release
@@ -4052,6 +4057,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4105,6 +4111,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4313,6 +4320,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.projectwithappandlib.lib.test
     - basicVariant:               : release
@@ -4381,6 +4389,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4437,6 +4446,7 @@
             ConsumerProguardFiles         : <ROOT>/lib/other.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5339,6 +5349,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested1.test
     - basicVariant:               : release
@@ -5399,6 +5410,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5452,6 +5464,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5645,6 +5658,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested1.deep.test
     - basicVariant:               : release
@@ -5708,6 +5722,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5761,6 +5776,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5961,6 +5977,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : basicDebug
         testApplicationId             : com.example.nested2.test
     - basicVariant:               : paidDebug
@@ -6025,6 +6042,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6078,6 +6096,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6417,6 +6436,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested2.deep.test
     - basicVariant:               : release
@@ -6477,6 +6497,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6530,6 +6551,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6735,6 +6757,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested2.trans.deep2.test
     - basicVariant:               : release
@@ -6795,6 +6818,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : true
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6848,6 +6872,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/psdSample_Groovy_Agp_7_4_Gradle_7_5_V2.txt b/android/testData/snapshots/ideModels/psdSample_Groovy_Agp_7_4_Gradle_7_5_V2.txt
index 70a85a1..3a18f98 100644
--- a/android/testData/snapshots/ideModels/psdSample_Groovy_Agp_7_4_Gradle_7_5_V2.txt
+++ b/android/testData/snapshots/ideModels/psdSample_Groovy_Agp_7_4_Gradle_7_5_V2.txt
@@ -2461,6 +2461,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : basicBarDebug
         applicationId                 : com.example.psd.sample.app.defaultSuffix.barSuffix
         testApplicationId             : com.example.psd.sample.app.default.test
@@ -2570,6 +2571,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : true
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2628,6 +2630,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules2.txt [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 2
             IsMinifyEnabled               : false
@@ -2666,6 +2669,7 @@
             VersionNameSuffix             : vnsSpecial
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3991,6 +3995,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.dyn_feature.test
     - basicVariant:               : release
@@ -4052,6 +4057,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4105,6 +4111,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4313,6 +4320,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.projectwithappandlib.lib.test
     - basicVariant:               : release
@@ -4381,6 +4389,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4437,6 +4446,7 @@
             ConsumerProguardFiles         : <ROOT>/lib/other.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5339,6 +5349,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested1.test
     - basicVariant:               : release
@@ -5399,6 +5410,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5452,6 +5464,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5645,6 +5658,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested1.deep.test
     - basicVariant:               : release
@@ -5708,6 +5722,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5761,6 +5776,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5961,6 +5977,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : basicDebug
         testApplicationId             : com.example.nested2.test
     - basicVariant:               : paidDebug
@@ -6025,6 +6042,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6078,6 +6096,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6417,6 +6436,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested2.deep.test
     - basicVariant:               : release
@@ -6477,6 +6497,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6530,6 +6551,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6735,6 +6757,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested2.trans.deep2.test
     - basicVariant:               : release
@@ -6795,6 +6818,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : true
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6848,6 +6872,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/psdSample_Groovy_Agp_8_0_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/psdSample_Groovy_Agp_8_0_Gradle_8_0_V2.txt
index 89ab9ba..a2fa968 100644
--- a/android/testData/snapshots/ideModels/psdSample_Groovy_Agp_8_0_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/psdSample_Groovy_Agp_8_0_Gradle_8_0_V2.txt
@@ -2385,6 +2385,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : basicBarDebug
         applicationId                 : com.example.psd.sample.app.defaultSuffix.barSuffix
         testApplicationId             : com.example.psd.sample.app.default.test
@@ -2491,6 +2492,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : true
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2546,6 +2548,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules2.txt [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 2
             IsMinifyEnabled               : false
@@ -2582,6 +2585,7 @@
             VersionNameSuffix             : vnsSpecial
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3878,6 +3882,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.dyn_feature.test
     - basicVariant:               : release
@@ -3936,6 +3941,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3986,6 +3992,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4184,6 +4191,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.projectwithappandlib.lib.test
     - basicVariant:               : release
@@ -4249,6 +4257,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4302,6 +4311,7 @@
             ConsumerProguardFiles         : <ROOT>/lib/other.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5194,6 +5204,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested1.test
     - basicVariant:               : release
@@ -5251,6 +5262,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5301,6 +5313,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5484,6 +5497,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested1.deep.test
     - basicVariant:               : release
@@ -5544,6 +5558,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5594,6 +5609,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5784,6 +5800,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : basicDebug
         testApplicationId             : com.example.nested2.test
     - basicVariant:               : paidDebug
@@ -5845,6 +5862,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5895,6 +5913,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6214,6 +6233,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested2.deep.test
     - basicVariant:               : release
@@ -6271,6 +6291,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6321,6 +6342,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6516,6 +6538,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested2.trans.deep2.test
     - basicVariant:               : release
@@ -6573,6 +6596,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : true
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6623,6 +6647,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/psdSample_Groovy_Agp_8_1_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/psdSample_Groovy_Agp_8_1_Gradle_8_0_V2.txt
index 2a6ef0d..225bf1f 100644
--- a/android/testData/snapshots/ideModels/psdSample_Groovy_Agp_8_1_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/psdSample_Groovy_Agp_8_1_Gradle_8_0_V2.txt
@@ -2385,6 +2385,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : basicBarDebug
         applicationId                 : com.example.psd.sample.app.defaultSuffix.barSuffix
         testApplicationId             : com.example.psd.sample.app.default.test
@@ -2491,6 +2492,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : true
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2546,6 +2548,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules2.txt [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 2
             IsMinifyEnabled               : false
@@ -2582,6 +2585,7 @@
             VersionNameSuffix             : vnsSpecial
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3878,6 +3882,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.dyn_feature.test
     - basicVariant:               : release
@@ -3936,6 +3941,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3986,6 +3992,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4184,6 +4191,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.projectwithappandlib.lib.test
     - basicVariant:               : release
@@ -4249,6 +4257,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4302,6 +4311,7 @@
             ConsumerProguardFiles         : <ROOT>/lib/other.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5194,6 +5204,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested1.test
     - basicVariant:               : release
@@ -5251,6 +5262,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5301,6 +5313,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5484,6 +5497,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested1.deep.test
     - basicVariant:               : release
@@ -5544,6 +5558,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5594,6 +5609,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5784,6 +5800,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : basicDebug
         testApplicationId             : com.example.nested2.test
     - basicVariant:               : paidDebug
@@ -5845,6 +5862,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5895,6 +5913,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6214,6 +6233,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested2.deep.test
     - basicVariant:               : release
@@ -6271,6 +6291,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6321,6 +6342,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6516,6 +6538,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested2.trans.deep2.test
     - basicVariant:               : release
@@ -6573,6 +6596,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : true
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6623,6 +6647,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/psdSample_Groovy_Agp_8_2_Gradle_8_2_V2.txt b/android/testData/snapshots/ideModels/psdSample_Groovy_Agp_8_2_Gradle_8_2_V2.txt
index 5909ea2..f8742a0 100644
--- a/android/testData/snapshots/ideModels/psdSample_Groovy_Agp_8_2_Gradle_8_2_V2.txt
+++ b/android/testData/snapshots/ideModels/psdSample_Groovy_Agp_8_2_Gradle_8_2_V2.txt
@@ -2385,6 +2385,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : basicBarDebug
         applicationId                 : com.example.psd.sample.app.defaultSuffix.barSuffix
         testApplicationId             : com.example.psd.sample.app.default.test
@@ -2491,6 +2492,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : true
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2546,6 +2548,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules2.txt [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 2
             IsMinifyEnabled               : false
@@ -2582,6 +2585,7 @@
             VersionNameSuffix             : vnsSpecial
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3878,6 +3882,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.dyn_feature.test
     - basicVariant:               : release
@@ -3936,6 +3941,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3986,6 +3992,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4184,6 +4191,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.projectwithappandlib.lib.test
     - basicVariant:               : release
@@ -4249,6 +4257,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4302,6 +4311,7 @@
             ConsumerProguardFiles         : <ROOT>/lib/other.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5194,6 +5204,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested1.test
     - basicVariant:               : release
@@ -5251,6 +5262,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5301,6 +5313,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5484,6 +5497,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested1.deep.test
     - basicVariant:               : release
@@ -5544,6 +5558,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5594,6 +5609,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5784,6 +5800,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : basicDebug
         testApplicationId             : com.example.nested2.test
     - basicVariant:               : paidDebug
@@ -5845,6 +5862,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5895,6 +5913,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6214,6 +6233,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested2.deep.test
     - basicVariant:               : release
@@ -6271,6 +6291,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6321,6 +6342,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6516,6 +6538,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested2.trans.deep2.test
     - basicVariant:               : release
@@ -6573,6 +6596,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : true
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6623,6 +6647,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/psdSample_Groovy_V2.txt b/android/testData/snapshots/ideModels/psdSample_Groovy_V2.txt
index 5fe37f6..fbd80e0 100644
--- a/android/testData/snapshots/ideModels/psdSample_Groovy_V2.txt
+++ b/android/testData/snapshots/ideModels/psdSample_Groovy_V2.txt
@@ -2461,6 +2461,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : basicBarDebug
         applicationId                 : com.example.psd.sample.app.defaultSuffix.barSuffix
         testApplicationId             : com.example.psd.sample.app.default.test
@@ -2567,6 +2568,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : true
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2622,6 +2624,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules2.txt [-]
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 2
             IsMinifyEnabled               : false
@@ -2658,6 +2661,7 @@
             VersionNameSuffix             : vnsSpecial
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3954,6 +3958,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.dyn_feature.test
     - basicVariant:               : release
@@ -4012,6 +4017,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4062,6 +4068,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4260,6 +4267,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.projectwithappandlib.lib.test
     - basicVariant:               : release
@@ -4325,6 +4333,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -4378,6 +4387,7 @@
             ConsumerProguardFiles         : <ROOT>/lib/other.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5270,6 +5280,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested1.test
     - basicVariant:               : release
@@ -5327,6 +5338,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5377,6 +5389,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5560,6 +5573,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested1.deep.test
     - basicVariant:               : release
@@ -5620,6 +5634,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5670,6 +5685,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5860,6 +5876,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : basicDebug
         testApplicationId             : com.example.nested2.test
     - basicVariant:               : paidDebug
@@ -5921,6 +5938,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -5971,6 +5989,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6290,6 +6309,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested2.deep.test
     - basicVariant:               : release
@@ -6347,6 +6367,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6397,6 +6418,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6592,6 +6614,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.nested2.trans.deep2.test
     - basicVariant:               : release
@@ -6649,6 +6672,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : true
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -6699,6 +6723,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication_Agp_4_1_Gradle_6_7_1_V1.txt b/android/testData/snapshots/ideModels/simpleApplication_Agp_4_1_Gradle_6_7_1_V1.txt
index 76ca3f6..7f0ab19 100644
--- a/android/testData/snapshots/ideModels/simpleApplication_Agp_4_1_Gradle_6_7_1_V1.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication_Agp_4_1_Gradle_6_7_1_V1.txt
@@ -889,6 +889,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -957,6 +958,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1004,6 +1006,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication_Agp_4_2_Gradle_6_7_1_V1.txt b/android/testData/snapshots/ideModels/simpleApplication_Agp_4_2_Gradle_6_7_1_V1.txt
index 364932f..ce78877 100644
--- a/android/testData/snapshots/ideModels/simpleApplication_Agp_4_2_Gradle_6_7_1_V1.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication_Agp_4_2_Gradle_6_7_1_V1.txt
@@ -888,6 +888,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -956,6 +957,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1003,6 +1005,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication_Agp_7_0_Gradle_7_0_2_V1.txt b/android/testData/snapshots/ideModels/simpleApplication_Agp_7_0_Gradle_7_0_2_V1.txt
index ae529aa..138081a 100644
--- a/android/testData/snapshots/ideModels/simpleApplication_Agp_7_0_Gradle_7_0_2_V1.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication_Agp_7_0_Gradle_7_0_2_V1.txt
@@ -857,6 +857,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -931,6 +932,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -984,6 +986,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication_Agp_7_1_Gradle_7_2_V1.txt b/android/testData/snapshots/ideModels/simpleApplication_Agp_7_1_Gradle_7_2_V1.txt
index a38b294..2c40c8b 100644
--- a/android/testData/snapshots/ideModels/simpleApplication_Agp_7_1_Gradle_7_2_V1.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication_Agp_7_1_Gradle_7_2_V1.txt
@@ -874,6 +874,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -948,6 +949,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1001,6 +1003,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication_Agp_7_2_Gradle_7_3_3_V1.txt b/android/testData/snapshots/ideModels/simpleApplication_Agp_7_2_Gradle_7_3_3_V1.txt
index 3de748c..861570d 100644
--- a/android/testData/snapshots/ideModels/simpleApplication_Agp_7_2_Gradle_7_3_3_V1.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication_Agp_7_2_Gradle_7_3_3_V1.txt
@@ -874,6 +874,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -948,6 +949,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1003,6 +1005,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication_Agp_7_2_Gradle_7_3_3_V2.txt b/android/testData/snapshots/ideModels/simpleApplication_Agp_7_2_Gradle_7_3_3_V2.txt
index 48d96eb..bd54ee4 100644
--- a/android/testData/snapshots/ideModels/simpleApplication_Agp_7_2_Gradle_7_3_3_V2.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication_Agp_7_2_Gradle_7_3_3_V2.txt
@@ -843,6 +843,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -917,6 +918,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -972,6 +974,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication_Agp_7_3_Gradle_7_4_V2.txt b/android/testData/snapshots/ideModels/simpleApplication_Agp_7_3_Gradle_7_4_V2.txt
index 572ca9b..e822049 100644
--- a/android/testData/snapshots/ideModels/simpleApplication_Agp_7_3_Gradle_7_4_V2.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication_Agp_7_3_Gradle_7_4_V2.txt
@@ -843,6 +843,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -917,6 +918,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -972,6 +974,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication_Agp_7_4_Gradle_7_5_V2.txt b/android/testData/snapshots/ideModels/simpleApplication_Agp_7_4_Gradle_7_5_V2.txt
index 924e9ee..cbe6018 100644
--- a/android/testData/snapshots/ideModels/simpleApplication_Agp_7_4_Gradle_7_5_V2.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication_Agp_7_4_Gradle_7_5_V2.txt
@@ -843,6 +843,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -917,6 +918,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -972,6 +974,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication_Agp_8_0_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/simpleApplication_Agp_8_0_Gradle_8_0_V2.txt
index ff9a74f..cdb64e2 100644
--- a/android/testData/snapshots/ideModels/simpleApplication_Agp_8_0_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication_Agp_8_0_Gradle_8_0_V2.txt
@@ -838,6 +838,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -909,6 +910,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -961,6 +963,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication_Agp_8_1_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/simpleApplication_Agp_8_1_Gradle_8_0_V2.txt
index 26de087e..2efd48c 100644
--- a/android/testData/snapshots/ideModels/simpleApplication_Agp_8_1_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication_Agp_8_1_Gradle_8_0_V2.txt
@@ -838,6 +838,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -909,6 +910,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -961,6 +963,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication_Agp_8_2_Gradle_8_2_V2.txt b/android/testData/snapshots/ideModels/simpleApplication_Agp_8_2_Gradle_8_2_V2.txt
index e8cbc64..d937895 100644
--- a/android/testData/snapshots/ideModels/simpleApplication_Agp_8_2_Gradle_8_2_V2.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication_Agp_8_2_Gradle_8_2_V2.txt
@@ -838,6 +838,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -909,6 +910,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -961,6 +963,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication_V2.txt b/android/testData/snapshots/ideModels/simpleApplication_V2.txt
index 47548c0..13c276e 100644
--- a/android/testData/snapshots/ideModels/simpleApplication_V2.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication_V2.txt
@@ -844,6 +844,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -915,6 +916,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -967,6 +969,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___additionalGradleSourceSets_Agp_7_2_Gradle_7_3_3_V2.txt b/android/testData/snapshots/ideModels/simpleApplication___additionalGradleSourceSets_Agp_7_2_Gradle_7_3_3_V2.txt
index 2385a49..d5665c1 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___additionalGradleSourceSets_Agp_7_2_Gradle_7_3_3_V2.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___additionalGradleSourceSets_Agp_7_2_Gradle_7_3_3_V2.txt
@@ -845,6 +845,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -919,6 +920,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -974,6 +976,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___additionalGradleSourceSets_Agp_7_3_Gradle_7_4_V2.txt b/android/testData/snapshots/ideModels/simpleApplication___additionalGradleSourceSets_Agp_7_3_Gradle_7_4_V2.txt
index 90ecf05..a4fd77c 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___additionalGradleSourceSets_Agp_7_3_Gradle_7_4_V2.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___additionalGradleSourceSets_Agp_7_3_Gradle_7_4_V2.txt
@@ -845,6 +845,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -919,6 +920,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -974,6 +976,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___additionalGradleSourceSets_Agp_7_4_Gradle_7_5_V2.txt b/android/testData/snapshots/ideModels/simpleApplication___additionalGradleSourceSets_Agp_7_4_Gradle_7_5_V2.txt
index ae4bff4..3f5f277 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___additionalGradleSourceSets_Agp_7_4_Gradle_7_5_V2.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___additionalGradleSourceSets_Agp_7_4_Gradle_7_5_V2.txt
@@ -845,6 +845,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -919,6 +920,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -974,6 +976,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___additionalGradleSourceSets_Agp_8_0_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/simpleApplication___additionalGradleSourceSets_Agp_8_0_Gradle_8_0_V2.txt
index 61106b1..61e84b3 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___additionalGradleSourceSets_Agp_8_0_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___additionalGradleSourceSets_Agp_8_0_Gradle_8_0_V2.txt
@@ -840,6 +840,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -911,6 +912,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -963,6 +965,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___additionalGradleSourceSets_Agp_8_1_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/simpleApplication___additionalGradleSourceSets_Agp_8_1_Gradle_8_0_V2.txt
index efacf2d..cc482ba 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___additionalGradleSourceSets_Agp_8_1_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___additionalGradleSourceSets_Agp_8_1_Gradle_8_0_V2.txt
@@ -840,6 +840,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -911,6 +912,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -963,6 +965,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___additionalGradleSourceSets_Agp_8_2_Gradle_8_2_V2.txt b/android/testData/snapshots/ideModels/simpleApplication___additionalGradleSourceSets_Agp_8_2_Gradle_8_2_V2.txt
index 358b7f7..24d5902 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___additionalGradleSourceSets_Agp_8_2_Gradle_8_2_V2.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___additionalGradleSourceSets_Agp_8_2_Gradle_8_2_V2.txt
@@ -840,6 +840,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -911,6 +912,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -963,6 +965,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___additionalGradleSourceSets_V2.txt b/android/testData/snapshots/ideModels/simpleApplication___additionalGradleSourceSets_V2.txt
index 42fcf22..46d7f60 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___additionalGradleSourceSets_V2.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___additionalGradleSourceSets_V2.txt
@@ -846,6 +846,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -917,6 +918,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -969,6 +971,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_Agp_4_1_Gradle_6_7_1_V1.txt b/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_Agp_4_1_Gradle_6_7_1_V1.txt
index 76ca3f6..7f0ab19 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_Agp_4_1_Gradle_6_7_1_V1.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_Agp_4_1_Gradle_6_7_1_V1.txt
@@ -889,6 +889,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -957,6 +958,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1004,6 +1006,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_Agp_4_2_Gradle_6_7_1_V1.txt b/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_Agp_4_2_Gradle_6_7_1_V1.txt
index 364932f..ce78877 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_Agp_4_2_Gradle_6_7_1_V1.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_Agp_4_2_Gradle_6_7_1_V1.txt
@@ -888,6 +888,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -956,6 +957,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1003,6 +1005,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_Agp_7_0_Gradle_7_0_2_V1.txt b/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_Agp_7_0_Gradle_7_0_2_V1.txt
index ae529aa..138081a 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_Agp_7_0_Gradle_7_0_2_V1.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_Agp_7_0_Gradle_7_0_2_V1.txt
@@ -857,6 +857,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -931,6 +932,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -984,6 +986,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_Agp_7_1_Gradle_7_2_V1.txt b/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_Agp_7_1_Gradle_7_2_V1.txt
index a38b294..2c40c8b 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_Agp_7_1_Gradle_7_2_V1.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_Agp_7_1_Gradle_7_2_V1.txt
@@ -874,6 +874,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -948,6 +949,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1001,6 +1003,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_Agp_7_2_Gradle_7_3_3_V1.txt b/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_Agp_7_2_Gradle_7_3_3_V1.txt
index 3de748c..861570d 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_Agp_7_2_Gradle_7_3_3_V1.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_Agp_7_2_Gradle_7_3_3_V1.txt
@@ -874,6 +874,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -948,6 +949,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1003,6 +1005,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_Agp_7_2_Gradle_7_3_3_V2.txt b/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_Agp_7_2_Gradle_7_3_3_V2.txt
index 48d96eb..bd54ee4 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_Agp_7_2_Gradle_7_3_3_V2.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_Agp_7_2_Gradle_7_3_3_V2.txt
@@ -843,6 +843,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -917,6 +918,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -972,6 +974,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_Agp_7_3_Gradle_7_4_V2.txt b/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_Agp_7_3_Gradle_7_4_V2.txt
index 572ca9b..e822049 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_Agp_7_3_Gradle_7_4_V2.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_Agp_7_3_Gradle_7_4_V2.txt
@@ -843,6 +843,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -917,6 +918,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -972,6 +974,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_Agp_7_4_Gradle_7_5_V2.txt b/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_Agp_7_4_Gradle_7_5_V2.txt
index 924e9ee..cbe6018 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_Agp_7_4_Gradle_7_5_V2.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_Agp_7_4_Gradle_7_5_V2.txt
@@ -843,6 +843,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -917,6 +918,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -972,6 +974,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_Agp_8_0_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_Agp_8_0_Gradle_8_0_V2.txt
index ff9a74f..cdb64e2 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_Agp_8_0_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_Agp_8_0_Gradle_8_0_V2.txt
@@ -838,6 +838,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -909,6 +910,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -961,6 +963,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_Agp_8_1_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_Agp_8_1_Gradle_8_0_V2.txt
index 26de087e..2efd48c 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_Agp_8_1_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_Agp_8_1_Gradle_8_0_V2.txt
@@ -838,6 +838,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -909,6 +910,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -961,6 +963,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_Agp_8_2_Gradle_8_2_V2.txt b/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_Agp_8_2_Gradle_8_2_V2.txt
index e8cbc64..d937895 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_Agp_8_2_Gradle_8_2_V2.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_Agp_8_2_Gradle_8_2_V2.txt
@@ -838,6 +838,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -909,6 +910,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -961,6 +963,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_V2.txt b/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_V2.txt
index 47548c0..13c276e 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_V2.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___appViaSymLink_V2.txt
@@ -844,6 +844,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -915,6 +916,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -967,6 +969,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_Agp_4_1_Gradle_6_7_1_V1.txt b/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_Agp_4_1_Gradle_6_7_1_V1.txt
index 6c623e6..d225beb 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_Agp_4_1_Gradle_6_7_1_V1.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_Agp_4_1_Gradle_6_7_1_V1.txt
@@ -889,6 +889,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -957,6 +958,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1004,6 +1006,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_Agp_4_2_Gradle_6_7_1_V1.txt b/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_Agp_4_2_Gradle_6_7_1_V1.txt
index 67c8f7c..e1aae9b 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_Agp_4_2_Gradle_6_7_1_V1.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_Agp_4_2_Gradle_6_7_1_V1.txt
@@ -888,6 +888,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -956,6 +957,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1003,6 +1005,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_Agp_7_0_Gradle_7_0_2_V1.txt b/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_Agp_7_0_Gradle_7_0_2_V1.txt
index 7cd7d83..9685aab 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_Agp_7_0_Gradle_7_0_2_V1.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_Agp_7_0_Gradle_7_0_2_V1.txt
@@ -857,6 +857,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -931,6 +932,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -984,6 +986,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_Agp_7_1_Gradle_7_2_V1.txt b/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_Agp_7_1_Gradle_7_2_V1.txt
index 62bd941..e35a109 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_Agp_7_1_Gradle_7_2_V1.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_Agp_7_1_Gradle_7_2_V1.txt
@@ -874,6 +874,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -948,6 +949,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1001,6 +1003,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_Agp_7_2_Gradle_7_3_3_V1.txt b/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_Agp_7_2_Gradle_7_3_3_V1.txt
index 3b21592..41d2d8b 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_Agp_7_2_Gradle_7_3_3_V1.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_Agp_7_2_Gradle_7_3_3_V1.txt
@@ -874,6 +874,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -948,6 +949,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1003,6 +1005,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_Agp_7_2_Gradle_7_3_3_V2.txt b/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_Agp_7_2_Gradle_7_3_3_V2.txt
index 231891e..9f048b3 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_Agp_7_2_Gradle_7_3_3_V2.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_Agp_7_2_Gradle_7_3_3_V2.txt
@@ -843,6 +843,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -917,6 +918,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -972,6 +974,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_Agp_7_3_Gradle_7_4_V2.txt b/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_Agp_7_3_Gradle_7_4_V2.txt
index 7615edc..89a2079 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_Agp_7_3_Gradle_7_4_V2.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_Agp_7_3_Gradle_7_4_V2.txt
@@ -843,6 +843,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -917,6 +918,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -972,6 +974,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_Agp_7_4_Gradle_7_5_V2.txt b/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_Agp_7_4_Gradle_7_5_V2.txt
index f42ed50..9e14f0b 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_Agp_7_4_Gradle_7_5_V2.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_Agp_7_4_Gradle_7_5_V2.txt
@@ -843,6 +843,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -917,6 +918,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -972,6 +974,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_Agp_8_0_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_Agp_8_0_Gradle_8_0_V2.txt
index ff9a74f..cdb64e2 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_Agp_8_0_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_Agp_8_0_Gradle_8_0_V2.txt
@@ -838,6 +838,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -909,6 +910,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -961,6 +963,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_Agp_8_1_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_Agp_8_1_Gradle_8_0_V2.txt
index 26de087e..2efd48c 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_Agp_8_1_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_Agp_8_1_Gradle_8_0_V2.txt
@@ -838,6 +838,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -909,6 +910,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -961,6 +963,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_Agp_8_2_Gradle_8_2_V2.txt b/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_Agp_8_2_Gradle_8_2_V2.txt
index 89c112c..98fda12 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_Agp_8_2_Gradle_8_2_V2.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_Agp_8_2_Gradle_8_2_V2.txt
@@ -838,6 +838,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -909,6 +910,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -961,6 +963,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_V2.txt b/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_V2.txt
index 01b2710..b1aaf71 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_V2.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___buildConfigAsBytecodeEnabled_V2.txt
@@ -844,6 +844,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -915,6 +916,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -967,6 +969,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___gradleNotAtRoot_V2.txt b/android/testData/snapshots/ideModels/simpleApplication___gradleNotAtRoot_V2.txt
index 6f3a82d..a276746 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___gradleNotAtRoot_V2.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___gradleNotAtRoot_V2.txt
@@ -200,6 +200,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -271,6 +272,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -323,6 +325,7 @@
             ProguardFiles                 : <ROOT>/gradle_project/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___multipleGradleRoots_V2.txt b/android/testData/snapshots/ideModels/simpleApplication___multipleGradleRoots_V2.txt
index 6432320..1bf61b5 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___multipleGradleRoots_V2.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___multipleGradleRoots_V2.txt
@@ -200,6 +200,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -271,6 +272,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -323,6 +325,7 @@
             ProguardFiles                 : <ROOT>/gradle_project_1/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1363,6 +1366,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -1434,6 +1438,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1486,6 +1491,7 @@
             ProguardFiles                 : <ROOT>/gradle_project_2/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_Agp_4_1_Gradle_6_7_1_V1.txt b/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_Agp_4_1_Gradle_6_7_1_V1.txt
index 5855c7b..7ee2424 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_Agp_4_1_Gradle_6_7_1_V1.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_Agp_4_1_Gradle_6_7_1_V1.txt
@@ -238,6 +238,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -306,6 +307,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -353,6 +355,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_Agp_4_2_Gradle_6_7_1_V1.txt b/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_Agp_4_2_Gradle_6_7_1_V1.txt
index d396bef..ef6153e 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_Agp_4_2_Gradle_6_7_1_V1.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_Agp_4_2_Gradle_6_7_1_V1.txt
@@ -237,6 +237,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -305,6 +306,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -352,6 +354,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_Agp_7_0_Gradle_7_0_2_V1.txt b/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_Agp_7_0_Gradle_7_0_2_V1.txt
index 0c0968c..3bb5352 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_Agp_7_0_Gradle_7_0_2_V1.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_Agp_7_0_Gradle_7_0_2_V1.txt
@@ -206,6 +206,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -280,6 +281,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -333,6 +335,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_Agp_7_1_Gradle_7_2_V1.txt b/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_Agp_7_1_Gradle_7_2_V1.txt
index 7563d5c..2bf0d98 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_Agp_7_1_Gradle_7_2_V1.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_Agp_7_1_Gradle_7_2_V1.txt
@@ -223,6 +223,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -297,6 +298,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -350,6 +352,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_Agp_7_2_Gradle_7_3_3_V1.txt b/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_Agp_7_2_Gradle_7_3_3_V1.txt
index 31f5b4f..d237b9b 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_Agp_7_2_Gradle_7_3_3_V1.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_Agp_7_2_Gradle_7_3_3_V1.txt
@@ -223,6 +223,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -297,6 +298,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -352,6 +354,7 @@
             ProguardFiles                 : <ROOT>_sm_src/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_Agp_7_2_Gradle_7_3_3_V2.txt b/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_Agp_7_2_Gradle_7_3_3_V2.txt
index 326f99c..c765876 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_Agp_7_2_Gradle_7_3_3_V2.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_Agp_7_2_Gradle_7_3_3_V2.txt
@@ -223,6 +223,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -297,6 +298,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -352,6 +354,7 @@
             ProguardFiles                 : <ROOT>_sm_src/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_Agp_7_3_Gradle_7_4_V2.txt b/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_Agp_7_3_Gradle_7_4_V2.txt
index 48ed9bd..e559135 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_Agp_7_3_Gradle_7_4_V2.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_Agp_7_3_Gradle_7_4_V2.txt
@@ -223,6 +223,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -297,6 +298,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -352,6 +354,7 @@
             ProguardFiles                 : <ROOT>_sm_src/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_Agp_7_4_Gradle_7_5_V2.txt b/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_Agp_7_4_Gradle_7_5_V2.txt
index d6cafbb..80cab38 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_Agp_7_4_Gradle_7_5_V2.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_Agp_7_4_Gradle_7_5_V2.txt
@@ -223,6 +223,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -297,6 +298,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -352,6 +354,7 @@
             ProguardFiles                 : <ROOT>_sm_src/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_Agp_8_0_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_Agp_8_0_Gradle_8_0_V2.txt
index b0a88a4..3cb7148 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_Agp_8_0_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_Agp_8_0_Gradle_8_0_V2.txt
@@ -218,6 +218,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -289,6 +290,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -341,6 +343,7 @@
             ProguardFiles                 : <ROOT>_sm_src/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_Agp_8_1_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_Agp_8_1_Gradle_8_0_V2.txt
index 81ccad5..239cbdd 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_Agp_8_1_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_Agp_8_1_Gradle_8_0_V2.txt
@@ -218,6 +218,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -289,6 +290,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -341,6 +343,7 @@
             ProguardFiles                 : <ROOT>_sm_src/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_Agp_8_2_Gradle_8_2_V2.txt b/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_Agp_8_2_Gradle_8_2_V2.txt
index e1d27b9..8f7678b 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_Agp_8_2_Gradle_8_2_V2.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_Agp_8_2_Gradle_8_2_V2.txt
@@ -218,6 +218,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -289,6 +290,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -341,6 +343,7 @@
             ProguardFiles                 : <ROOT>_sm_src/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_V2.txt b/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_V2.txt
index 1e84252..e3cd95b 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_V2.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___viaSymLink_V2.txt
@@ -224,6 +224,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -295,6 +296,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -347,6 +349,7 @@
             ProguardFiles                 : <ROOT>_sm_src/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_Agp_4_1_Gradle_6_7_1_V1.txt b/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_Agp_4_1_Gradle_6_7_1_V1.txt
index 1572b74..ddd4144 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_Agp_4_1_Gradle_6_7_1_V1.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_Agp_4_1_Gradle_6_7_1_V1.txt
@@ -892,6 +892,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -961,6 +962,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1008,6 +1010,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_Agp_4_2_Gradle_6_7_1_V1.txt b/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_Agp_4_2_Gradle_6_7_1_V1.txt
index 8f3b796..16a021f 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_Agp_4_2_Gradle_6_7_1_V1.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_Agp_4_2_Gradle_6_7_1_V1.txt
@@ -891,6 +891,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -960,6 +961,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1007,6 +1009,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_Agp_7_0_Gradle_7_0_2_V1.txt b/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_Agp_7_0_Gradle_7_0_2_V1.txt
index 8d14e12..a3080fc 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_Agp_7_0_Gradle_7_0_2_V1.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_Agp_7_0_Gradle_7_0_2_V1.txt
@@ -860,6 +860,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -935,6 +936,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -988,6 +990,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_Agp_7_1_Gradle_7_2_V1.txt b/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_Agp_7_1_Gradle_7_2_V1.txt
index 6be4306..c387082 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_Agp_7_1_Gradle_7_2_V1.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_Agp_7_1_Gradle_7_2_V1.txt
@@ -877,6 +877,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -952,6 +953,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1005,6 +1007,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_Agp_7_2_Gradle_7_3_3_V1.txt b/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_Agp_7_2_Gradle_7_3_3_V1.txt
index 1a92b89..3cd0aba 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_Agp_7_2_Gradle_7_3_3_V1.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_Agp_7_2_Gradle_7_3_3_V1.txt
@@ -877,6 +877,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -952,6 +953,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1007,6 +1009,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_Agp_7_2_Gradle_7_3_3_V2.txt b/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_Agp_7_2_Gradle_7_3_3_V2.txt
index 04f74a7..14855f1 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_Agp_7_2_Gradle_7_3_3_V2.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_Agp_7_2_Gradle_7_3_3_V2.txt
@@ -846,6 +846,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -921,6 +922,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -976,6 +978,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_Agp_7_3_Gradle_7_4_V2.txt b/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_Agp_7_3_Gradle_7_4_V2.txt
index 9185ba2..9baf1be 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_Agp_7_3_Gradle_7_4_V2.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_Agp_7_3_Gradle_7_4_V2.txt
@@ -846,6 +846,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -921,6 +922,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -976,6 +978,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_Agp_7_4_Gradle_7_5_V2.txt b/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_Agp_7_4_Gradle_7_5_V2.txt
index 4bc7d76..a335377 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_Agp_7_4_Gradle_7_5_V2.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_Agp_7_4_Gradle_7_5_V2.txt
@@ -846,6 +846,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -921,6 +922,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -976,6 +978,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_Agp_8_0_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_Agp_8_0_Gradle_8_0_V2.txt
index 85f651b..db2d14c 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_Agp_8_0_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_Agp_8_0_Gradle_8_0_V2.txt
@@ -841,6 +841,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -913,6 +914,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -965,6 +967,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_Agp_8_1_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_Agp_8_1_Gradle_8_0_V2.txt
index 3f0f873..c9ada64 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_Agp_8_1_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_Agp_8_1_Gradle_8_0_V2.txt
@@ -841,6 +841,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -913,6 +914,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -965,6 +967,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_Agp_8_2_Gradle_8_2_V2.txt b/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_Agp_8_2_Gradle_8_2_V2.txt
index 2c824fd..88eaaab 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_Agp_8_2_Gradle_8_2_V2.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_Agp_8_2_Gradle_8_2_V2.txt
@@ -841,6 +841,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -913,6 +914,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -965,6 +967,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_V2.txt b/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_V2.txt
index 3492b22..d466f29 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_V2.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___withAndroidCar_V2.txt
@@ -847,6 +847,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -919,6 +920,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -971,6 +973,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/simpleApplication___withUnnamedDimension_V2.txt b/android/testData/snapshots/ideModels/simpleApplication___withUnnamedDimension_V2.txt
index 330ba21..ba1c182 100644
--- a/android/testData/snapshots/ideModels/simpleApplication___withUnnamedDimension_V2.txt
+++ b/android/testData/snapshots/ideModels/simpleApplication___withUnnamedDimension_V2.txt
@@ -897,6 +897,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : exampleDebug
         applicationId                 : google.simpleapplication
         testApplicationId             : google.simpleapplication.test
@@ -968,6 +969,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1020,6 +1022,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_3_5_Gradle_5_5_V1.txt b/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_3_5_Gradle_5_5_V1.txt
index 9b0c29d..37747d5 100644
--- a/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_3_5_Gradle_5_5_V1.txt
+++ b/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_3_5_Gradle_5_5_V1.txt
@@ -946,6 +946,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.alruiz.transitive_dependencies
         testApplicationId             : com.example.alruiz.transitive_dependencies.test
@@ -1010,6 +1011,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1057,6 +1059,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1768,6 +1771,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library1.test
     - basicVariant:               : release
@@ -1826,6 +1830,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1873,6 +1878,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2457,6 +2463,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library2.test
     - basicVariant:               : release
@@ -2515,6 +2522,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2562,6 +2570,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_4_0_Gradle_6_7_1_V1.txt b/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_4_0_Gradle_6_7_1_V1.txt
index 197d85f..81b2e3c 100644
--- a/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_4_0_Gradle_6_7_1_V1.txt
+++ b/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_4_0_Gradle_6_7_1_V1.txt
@@ -729,6 +729,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.alruiz.transitive_dependencies
         testApplicationId             : com.example.alruiz.transitive_dependencies.test
@@ -795,6 +796,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -842,6 +844,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1303,6 +1306,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library1.test
     - basicVariant:               : release
@@ -1363,6 +1367,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1410,6 +1415,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1801,6 +1807,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library2.test
     - basicVariant:               : release
@@ -1861,6 +1868,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1908,6 +1916,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_4_1_Gradle_6_7_1_V1.txt b/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_4_1_Gradle_6_7_1_V1.txt
index 39da0df..7ad8b53 100644
--- a/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_4_1_Gradle_6_7_1_V1.txt
+++ b/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_4_1_Gradle_6_7_1_V1.txt
@@ -1386,6 +1386,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.alruiz.transitive_dependencies
         testApplicationId             : com.example.alruiz.transitive_dependencies.test
@@ -1455,6 +1456,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1502,6 +1504,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2005,6 +2008,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library1.test
     - basicVariant:               : release
@@ -2065,6 +2069,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2112,6 +2117,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2533,6 +2539,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library2.test
     - basicVariant:               : release
@@ -2593,6 +2600,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2640,6 +2648,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_4_2_Gradle_6_7_1_V1.txt b/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_4_2_Gradle_6_7_1_V1.txt
index 91d962a..8891053 100644
--- a/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_4_2_Gradle_6_7_1_V1.txt
+++ b/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_4_2_Gradle_6_7_1_V1.txt
@@ -1383,6 +1383,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.alruiz.transitive_dependencies
         testApplicationId             : com.example.alruiz.transitive_dependencies.test
@@ -1452,6 +1453,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1499,6 +1501,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2002,6 +2005,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library1.test
     - basicVariant:               : release
@@ -2062,6 +2066,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2109,6 +2114,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2530,6 +2536,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library2.test
     - basicVariant:               : release
@@ -2590,6 +2597,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2637,6 +2645,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_7_0_Gradle_7_0_2_V1.txt b/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_7_0_Gradle_7_0_2_V1.txt
index 45fa33d..7b920df 100644
--- a/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_7_0_Gradle_7_0_2_V1.txt
+++ b/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_7_0_Gradle_7_0_2_V1.txt
@@ -1270,6 +1270,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.alruiz.transitive_dependencies
         testApplicationId             : com.example.alruiz.transitive_dependencies.test
@@ -1345,6 +1346,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1398,6 +1400,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1907,6 +1910,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library1.test
     - basicVariant:               : release
@@ -1973,6 +1977,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2026,6 +2031,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2452,6 +2458,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library2.test
     - basicVariant:               : release
@@ -2518,6 +2525,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2571,6 +2579,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_7_1_Gradle_7_2_V1.txt b/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_7_1_Gradle_7_2_V1.txt
index c2683f1..ceb8ed3 100644
--- a/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_7_1_Gradle_7_2_V1.txt
+++ b/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_7_1_Gradle_7_2_V1.txt
@@ -1321,6 +1321,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.alruiz.transitive_dependencies
         testApplicationId             : com.example.alruiz.transitive_dependencies.test
@@ -1396,6 +1397,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1449,6 +1451,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1958,6 +1961,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library1.test
     - basicVariant:               : release
@@ -2024,6 +2028,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2077,6 +2082,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2503,6 +2509,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library2.test
     - basicVariant:               : release
@@ -2569,6 +2576,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2622,6 +2630,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_7_2_Gradle_7_3_3_V1.txt b/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_7_2_Gradle_7_3_3_V1.txt
index 2e70ed0..2e59801 100644
--- a/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_7_2_Gradle_7_3_3_V1.txt
+++ b/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_7_2_Gradle_7_3_3_V1.txt
@@ -1321,6 +1321,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.alruiz.transitive_dependencies
         testApplicationId             : com.example.alruiz.transitive_dependencies.test
@@ -1396,6 +1397,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1451,6 +1453,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1944,6 +1947,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library1.test
     - basicVariant:               : release
@@ -2010,6 +2014,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2065,6 +2070,7 @@
             ProguardFiles                 : <ROOT>/library1/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2475,6 +2481,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library2.test
     - basicVariant:               : release
@@ -2541,6 +2548,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2596,6 +2604,7 @@
             ProguardFiles                 : <ROOT>/library2/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_7_2_Gradle_7_3_3_V2.txt b/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_7_2_Gradle_7_3_3_V2.txt
index 8164a37..113e4cc 100644
--- a/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_7_2_Gradle_7_3_3_V2.txt
+++ b/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_7_2_Gradle_7_3_3_V2.txt
@@ -1291,6 +1291,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.alruiz.transitive_dependencies
         testApplicationId             : com.example.alruiz.transitive_dependencies.test
@@ -1366,6 +1367,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1421,6 +1423,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2395,6 +2398,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library1.test
     - basicVariant:               : release
@@ -2461,6 +2465,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2516,6 +2521,7 @@
             ProguardFiles                 : <ROOT>/library1/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3476,6 +3482,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library2.test
     - basicVariant:               : release
@@ -3542,6 +3549,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3597,6 +3605,7 @@
             ProguardFiles                 : <ROOT>/library2/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_7_3_Gradle_7_4_V2.txt b/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_7_3_Gradle_7_4_V2.txt
index c0d248f..faf26ef 100644
--- a/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_7_3_Gradle_7_4_V2.txt
+++ b/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_7_3_Gradle_7_4_V2.txt
@@ -1297,6 +1297,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.alruiz.transitive_dependencies
         testApplicationId             : com.example.alruiz.transitive_dependencies.test
@@ -1372,6 +1373,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1427,6 +1429,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2403,6 +2406,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library1.test
     - basicVariant:               : release
@@ -2469,6 +2473,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2524,6 +2529,7 @@
             ProguardFiles                 : <ROOT>/library1/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3486,6 +3492,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library2.test
     - basicVariant:               : release
@@ -3552,6 +3559,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3607,6 +3615,7 @@
             ProguardFiles                 : <ROOT>/library2/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_7_4_Gradle_7_5_V2.txt b/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_7_4_Gradle_7_5_V2.txt
index 91d4dac..5f0569e 100644
--- a/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_7_4_Gradle_7_5_V2.txt
+++ b/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_7_4_Gradle_7_5_V2.txt
@@ -1297,6 +1297,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.alruiz.transitive_dependencies
         testApplicationId             : com.example.alruiz.transitive_dependencies.test
@@ -1372,6 +1373,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1427,6 +1429,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2403,6 +2406,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library1.test
     - basicVariant:               : release
@@ -2469,6 +2473,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2524,6 +2529,7 @@
             ProguardFiles                 : <ROOT>/library1/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3486,6 +3492,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library2.test
     - basicVariant:               : release
@@ -3552,6 +3559,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3607,6 +3615,7 @@
             ProguardFiles                 : <ROOT>/library2/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_8_0_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_8_0_Gradle_8_0_V2.txt
index 75c2211..37b0296 100644
--- a/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_8_0_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_8_0_Gradle_8_0_V2.txt
@@ -1274,6 +1274,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.alruiz.transitive_dependencies
         testApplicationId             : com.example.alruiz.transitive_dependencies.test
@@ -1346,6 +1347,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1398,6 +1400,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2364,6 +2367,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library1.test
     - basicVariant:               : release
@@ -2427,6 +2431,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2479,6 +2484,7 @@
             ProguardFiles                 : <ROOT>/library1/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3431,6 +3437,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library2.test
     - basicVariant:               : release
@@ -3494,6 +3501,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3546,6 +3554,7 @@
             ProguardFiles                 : <ROOT>/library2/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_8_1_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_8_1_Gradle_8_0_V2.txt
index 5f238d8..edb513e 100644
--- a/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_8_1_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_8_1_Gradle_8_0_V2.txt
@@ -1274,6 +1274,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.alruiz.transitive_dependencies
         testApplicationId             : com.example.alruiz.transitive_dependencies.test
@@ -1346,6 +1347,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1398,6 +1400,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2364,6 +2367,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library1.test
     - basicVariant:               : release
@@ -2427,6 +2431,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2479,6 +2484,7 @@
             ProguardFiles                 : <ROOT>/library1/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3431,6 +3437,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library2.test
     - basicVariant:               : release
@@ -3494,6 +3501,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3546,6 +3554,7 @@
             ProguardFiles                 : <ROOT>/library2/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_8_2_Gradle_8_2_V2.txt b/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_8_2_Gradle_8_2_V2.txt
index 7ed3676..3550e86 100644
--- a/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_8_2_Gradle_8_2_V2.txt
+++ b/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_Agp_8_2_Gradle_8_2_V2.txt
@@ -1274,6 +1274,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.alruiz.transitive_dependencies
         testApplicationId             : com.example.alruiz.transitive_dependencies.test
@@ -1346,6 +1347,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1398,6 +1400,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2364,6 +2367,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library1.test
     - basicVariant:               : release
@@ -2427,6 +2431,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2479,6 +2484,7 @@
             ProguardFiles                 : <ROOT>/library1/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3431,6 +3437,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library2.test
     - basicVariant:               : release
@@ -3494,6 +3501,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3546,6 +3554,7 @@
             ProguardFiles                 : <ROOT>/library2/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_V2.txt b/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_V2.txt
index 7654bcd..3f7f073 100644
--- a/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_V2.txt
+++ b/android/testData/snapshots/ideModels/transitiveDependencies____no_target_sdk_in_libs_V2.txt
@@ -1290,6 +1290,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : com.example.alruiz.transitive_dependencies
         testApplicationId             : com.example.alruiz.transitive_dependencies.test
@@ -1362,6 +1363,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -1414,6 +1416,7 @@
             ProguardFiles                 : <ROOT>/app/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2380,6 +2383,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library1.test
     - basicVariant:               : release
@@ -2443,6 +2447,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -2495,6 +2500,7 @@
             ProguardFiles                 : <ROOT>/library1/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3447,6 +3453,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         testApplicationId             : com.example.library2.test
     - basicVariant:               : release
@@ -3510,6 +3517,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -3562,6 +3570,7 @@
             ProguardFiles                 : <ROOT>/library2/proguard-rules.pro
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/withGradleMetadata_Agp_4_1_Gradle_6_7_1_V1.txt b/android/testData/snapshots/ideModels/withGradleMetadata_Agp_4_1_Gradle_6_7_1_V1.txt
index 6547a72..8f0ffb6 100644
--- a/android/testData/snapshots/ideModels/withGradleMetadata_Agp_4_1_Gradle_6_7_1_V1.txt
+++ b/android/testData/snapshots/ideModels/withGradleMetadata_Agp_4_1_Gradle_6_7_1_V1.txt
@@ -276,6 +276,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : come.example.with.gradle.metadata
         testApplicationId             : come.example.with.gradle.metadata.test
@@ -335,6 +336,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -382,6 +384,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/withGradleMetadata_Agp_4_2_Gradle_6_7_1_V1.txt b/android/testData/snapshots/ideModels/withGradleMetadata_Agp_4_2_Gradle_6_7_1_V1.txt
index c5818ba..3058347 100644
--- a/android/testData/snapshots/ideModels/withGradleMetadata_Agp_4_2_Gradle_6_7_1_V1.txt
+++ b/android/testData/snapshots/ideModels/withGradleMetadata_Agp_4_2_Gradle_6_7_1_V1.txt
@@ -275,6 +275,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : come.example.with.gradle.metadata
         testApplicationId             : come.example.with.gradle.metadata.test
@@ -334,6 +335,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -381,6 +383,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/withGradleMetadata_Agp_7_0_Gradle_7_0_2_V1.txt b/android/testData/snapshots/ideModels/withGradleMetadata_Agp_7_0_Gradle_7_0_2_V1.txt
index 8faebbc..3e066bd 100644
--- a/android/testData/snapshots/ideModels/withGradleMetadata_Agp_7_0_Gradle_7_0_2_V1.txt
+++ b/android/testData/snapshots/ideModels/withGradleMetadata_Agp_7_0_Gradle_7_0_2_V1.txt
@@ -244,6 +244,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : come.example.with.gradle.metadata
         testApplicationId             : come.example.with.gradle.metadata.test
@@ -309,6 +310,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -362,6 +364,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/withGradleMetadata_Agp_7_1_Gradle_7_2_V1.txt b/android/testData/snapshots/ideModels/withGradleMetadata_Agp_7_1_Gradle_7_2_V1.txt
index 351dc95..a7a45b9 100644
--- a/android/testData/snapshots/ideModels/withGradleMetadata_Agp_7_1_Gradle_7_2_V1.txt
+++ b/android/testData/snapshots/ideModels/withGradleMetadata_Agp_7_1_Gradle_7_2_V1.txt
@@ -261,6 +261,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : come.example.with.gradle.metadata
         testApplicationId             : come.example.with.gradle.metadata.test
@@ -326,6 +327,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -379,6 +381,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/withGradleMetadata_Agp_7_2_Gradle_7_3_3_V1.txt b/android/testData/snapshots/ideModels/withGradleMetadata_Agp_7_2_Gradle_7_3_3_V1.txt
index aa5da2a..3ae3237 100644
--- a/android/testData/snapshots/ideModels/withGradleMetadata_Agp_7_2_Gradle_7_3_3_V1.txt
+++ b/android/testData/snapshots/ideModels/withGradleMetadata_Agp_7_2_Gradle_7_3_3_V1.txt
@@ -261,6 +261,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : come.example.with.gradle.metadata
         testApplicationId             : come.example.with.gradle.metadata.test
@@ -326,6 +327,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -379,6 +381,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/withGradleMetadata_Agp_7_2_Gradle_7_3_3_V2.txt b/android/testData/snapshots/ideModels/withGradleMetadata_Agp_7_2_Gradle_7_3_3_V2.txt
index 21f1b8f..64c7f64 100644
--- a/android/testData/snapshots/ideModels/withGradleMetadata_Agp_7_2_Gradle_7_3_3_V2.txt
+++ b/android/testData/snapshots/ideModels/withGradleMetadata_Agp_7_2_Gradle_7_3_3_V2.txt
@@ -263,6 +263,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : come.example.with.gradle.metadata
         testApplicationId             : come.example.with.gradle.metadata.test
@@ -328,6 +329,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -381,6 +383,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/withGradleMetadata_Agp_7_3_Gradle_7_4_V2.txt b/android/testData/snapshots/ideModels/withGradleMetadata_Agp_7_3_Gradle_7_4_V2.txt
index dc882fc..b7ace28 100644
--- a/android/testData/snapshots/ideModels/withGradleMetadata_Agp_7_3_Gradle_7_4_V2.txt
+++ b/android/testData/snapshots/ideModels/withGradleMetadata_Agp_7_3_Gradle_7_4_V2.txt
@@ -263,6 +263,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : come.example.with.gradle.metadata
         testApplicationId             : come.example.with.gradle.metadata.test
@@ -328,6 +329,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -381,6 +383,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/withGradleMetadata_Agp_7_4_Gradle_7_5_V2.txt b/android/testData/snapshots/ideModels/withGradleMetadata_Agp_7_4_Gradle_7_5_V2.txt
index 0867405..b03732f 100644
--- a/android/testData/snapshots/ideModels/withGradleMetadata_Agp_7_4_Gradle_7_5_V2.txt
+++ b/android/testData/snapshots/ideModels/withGradleMetadata_Agp_7_4_Gradle_7_5_V2.txt
@@ -263,6 +263,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : come.example.with.gradle.metadata
         testApplicationId             : come.example.with.gradle.metadata.test
@@ -328,6 +329,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -381,6 +383,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/withGradleMetadata_Agp_8_0_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/withGradleMetadata_Agp_8_0_Gradle_8_0_V2.txt
index 6f0613c..ad56b44 100644
--- a/android/testData/snapshots/ideModels/withGradleMetadata_Agp_8_0_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/withGradleMetadata_Agp_8_0_Gradle_8_0_V2.txt
@@ -258,6 +258,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : come.example.with.gradle.metadata
         testApplicationId             : come.example.with.gradle.metadata.test
@@ -320,6 +321,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -370,6 +372,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/withGradleMetadata_Agp_8_1_Gradle_8_0_V2.txt b/android/testData/snapshots/ideModels/withGradleMetadata_Agp_8_1_Gradle_8_0_V2.txt
index 043b7af..fd27816 100644
--- a/android/testData/snapshots/ideModels/withGradleMetadata_Agp_8_1_Gradle_8_0_V2.txt
+++ b/android/testData/snapshots/ideModels/withGradleMetadata_Agp_8_1_Gradle_8_0_V2.txt
@@ -258,6 +258,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : come.example.with.gradle.metadata
         testApplicationId             : come.example.with.gradle.metadata.test
@@ -320,6 +321,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -370,6 +372,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/withGradleMetadata_Agp_8_2_Gradle_8_2_V2.txt b/android/testData/snapshots/ideModels/withGradleMetadata_Agp_8_2_Gradle_8_2_V2.txt
index 705e5bc..b34a460 100644
--- a/android/testData/snapshots/ideModels/withGradleMetadata_Agp_8_2_Gradle_8_2_V2.txt
+++ b/android/testData/snapshots/ideModels/withGradleMetadata_Agp_8_2_Gradle_8_2_V2.txt
@@ -258,6 +258,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : come.example.with.gradle.metadata
         testApplicationId             : come.example.with.gradle.metadata.test
@@ -320,6 +321,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -370,6 +372,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/ideModels/withGradleMetadata_V2.txt b/android/testData/snapshots/ideModels/withGradleMetadata_V2.txt
index fe03d93..4d2a207 100644
--- a/android/testData/snapshots/ideModels/withGradleMetadata_V2.txt
+++ b/android/testData/snapshots/ideModels/withGradleMetadata_V2.txt
@@ -264,6 +264,7 @@
         UseAndroidX                   : false
         UsesCompose                   : false
         MlModelBindingEnabled         : false
+        AndroidResourcesEnabled       : true
     - basicVariant:               : debug
         applicationId                 : come.example.with.gradle.metadata
         testApplicationId             : come.example.with.gradle.metadata.test
@@ -326,6 +327,7 @@
             Name                          : debug
             IsDebuggable                  : true
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
@@ -376,6 +378,7 @@
             Name                          : release
             IsDebuggable                  : false
             IsJniDebuggable               : false
+            IsPseudoLocalesEnabled        : false
             IsRenderscriptDebuggable      : false
             RenderscriptOptimLevel        : 3
             IsMinifyEnabled               : false
diff --git a/android/testData/snapshots/projects/psdSample/Groovy/app/build.gradle b/android/testData/snapshots/projects/psdSample/Groovy/app/build.gradle
index 3b3bb1a..8e6e2f2 100644
--- a/android/testData/snapshots/projects/psdSample/Groovy/app/build.gradle
+++ b/android/testData/snapshots/projects/psdSample/Groovy/app/build.gradle
@@ -57,6 +57,9 @@
         testFunctionalTest false
     }
     buildTypes {
+        debug {
+            pseudoLocalesEnabled = true
+        }
         release {
             applicationIdSuffix "suffix"
             versionNameSuffix "vsuffix"
diff --git a/android/testData/snapshots/projects/psdSample/Kotlin/app/build.gradle.kts b/android/testData/snapshots/projects/psdSample/Kotlin/app/build.gradle.kts
index 94349b8..595b819 100644
--- a/android/testData/snapshots/projects/psdSample/Kotlin/app/build.gradle.kts
+++ b/android/testData/snapshots/projects/psdSample/Kotlin/app/build.gradle.kts
@@ -42,6 +42,9 @@
         setTestFunctionalTest(false)
     }
     buildTypes {
+        debug {
+            isPseudoLocalesEnabled = true
+        }
         getByName("release") {
             applicationIdSuffix = "suffix"
             versionNameSuffix = "vsuffix"
diff --git a/android/testSrc/com/android/tools/idea/analytics/AnalyticsSettingsUiTest.kt b/android/testSrc/com/android/tools/idea/analytics/AnalyticsSettingsUiTest.kt
index 3d2eb26..61b0dfe 100644
--- a/android/testSrc/com/android/tools/idea/analytics/AnalyticsSettingsUiTest.kt
+++ b/android/testSrc/com/android/tools/idea/analytics/AnalyticsSettingsUiTest.kt
@@ -42,7 +42,6 @@
 
   @Test
   fun testSettingsUi() {
-    AndroidStudioAnalytics.initialize(AndroidStudioAnalyticsImpl())
     AnalyticsSettings.setInstanceForTest(AnalyticsSettingsData().apply {
       optedIn = false
     })
diff --git a/android/testSrc/com/android/tools/idea/configurations/ThemeUtilsIndexQueryTest.kt b/android/testSrc/com/android/tools/idea/configurations/ThemeUtilsIndexQueryTest.kt
index 2e5b411..f184eed 100644
--- a/android/testSrc/com/android/tools/idea/configurations/ThemeUtilsIndexQueryTest.kt
+++ b/android/testSrc/com/android/tools/idea/configurations/ThemeUtilsIndexQueryTest.kt
@@ -18,11 +18,16 @@
 import com.android.tools.idea.testing.AndroidProjectRule
 import com.android.tools.idea.util.androidFacet
 import com.google.common.truth.Truth
+import com.intellij.openapi.application.ApplicationManager
+import com.intellij.openapi.application.ex.ApplicationEx
+import com.intellij.openapi.project.DumbService
+import com.intellij.testFramework.DumbModeTestUtils
 import org.intellij.lang.annotations.Language
 import org.jetbrains.android.facet.AndroidFacet
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
+import javax.swing.SwingUtilities
 
 @Language("XML")
 private val appManifest = """
@@ -63,4 +68,30 @@
     Truth.assertThat(facet.module.getThemeNameForActivity("google.simpleapplication.MyActivity")).isEqualTo(
       "@style/AppTheme")
   }
+
+  /**
+   * Regression test for b/322507246.
+   *
+   * [getAllActivityThemeNames] should not deadlock if called in the UI thread without the read lock.
+   */
+  @Test
+  fun testQueryDoesNotDeadlock() {
+    DumbModeTestUtils.runInDumbModeSynchronously(projectRule.project) {
+      ApplicationManager.getApplication().invokeAndWait {
+        Truth.assertThat(facet.module.getAllActivityThemeNames()).containsExactly("@style/AppTheme")
+      }
+    }
+
+    // Run in non-smart mode in the UI thread. These conditions will cause a lock if the methods block to
+    // wait for the smart mode.
+    DumbModeTestUtils.runInDumbModeSynchronously(projectRule.project) {
+      SwingUtilities.invokeAndWait {
+        @Suppress("UnstableApiUsage")
+        (ApplicationManager.getApplication() as ApplicationEx).releaseWriteIntentLock()
+        println(ApplicationManager.getApplication().isReadAccessAllowed)
+        DumbService.getInstance(projectRule.project).isDumb
+        Truth.assertThat(facet.module.getAllActivityThemeNames()).containsExactly("@style/AppTheme")
+      }
+    }
+  }
 }
\ No newline at end of file
diff --git a/apkanalyzer/src/com/android/tools/idea/apk/viewer/arsc/ResourceTablePanel.form b/apkanalyzer/src/com/android/tools/idea/apk/viewer/arsc/ResourceTablePanel.form
index 57a3894..67bd920 100644
--- a/apkanalyzer/src/com/android/tools/idea/apk/viewer/arsc/ResourceTablePanel.form
+++ b/apkanalyzer/src/com/android/tools/idea/apk/viewer/arsc/ResourceTablePanel.form
@@ -8,7 +8,7 @@
     <properties/>
     <border type="none"/>
     <children>
-      <grid id="324c5" layout-manager="FlowLayout" hgap="0" vgap="0" flow-align="0">
+      <grid id="324c5" layout-manager="FlowLayout" hgap="10" vgap="0" flow-align="0">
         <constraints>
           <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="3" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
         </constraints>
diff --git a/apkanalyzer/src/com/android/tools/idea/apk/viewer/arsc/ResourceTablePanel.java b/apkanalyzer/src/com/android/tools/idea/apk/viewer/arsc/ResourceTablePanel.java
index 96614c2..f1c7b3b 100644
--- a/apkanalyzer/src/com/android/tools/idea/apk/viewer/arsc/ResourceTablePanel.java
+++ b/apkanalyzer/src/com/android/tools/idea/apk/viewer/arsc/ResourceTablePanel.java
@@ -16,26 +16,41 @@
 package com.android.tools.idea.apk.viewer.arsc;
 
 import com.google.common.collect.ImmutableList;
-import com.google.devrel.gmscore.tools.apk.arsc.*;
+import com.google.devrel.gmscore.tools.apk.arsc.BinaryResourceFile;
+import com.google.devrel.gmscore.tools.apk.arsc.Chunk;
+import com.google.devrel.gmscore.tools.apk.arsc.PackageChunk;
+import com.google.devrel.gmscore.tools.apk.arsc.ResourceTableChunk;
+import com.google.devrel.gmscore.tools.apk.arsc.TypeSpecChunk;
 import com.intellij.openapi.ui.ComboBox;
 import com.intellij.openapi.ui.Splitter;
-import com.intellij.ui.*;
+import com.intellij.ui.CollectionComboBoxModel;
+import com.intellij.ui.CollectionListModel;
+import com.intellij.ui.IdeBorderFactory;
+import com.intellij.ui.OnePixelSplitter;
+import com.intellij.ui.ScrollPaneFactory;
+import com.intellij.ui.SideBorder;
+import com.intellij.ui.SimpleColoredComponent;
+import com.intellij.ui.SimpleListCellRenderer;
+import com.intellij.ui.SimpleTextAttributes;
 import com.intellij.ui.components.JBLabel;
 import com.intellij.ui.components.JBList;
+import com.intellij.ui.scale.JBUIScale;
 import com.intellij.ui.table.JBTable;
-import org.jetbrains.annotations.NotNull;
-
-import javax.swing.*;
-import java.awt.*;
+import com.intellij.util.ui.JBUI;
+import java.awt.BorderLayout;
 import java.util.Collection;
 import java.util.List;
+import javax.swing.JComponent;
+import javax.swing.JPanel;
+import javax.swing.JTable;
+import org.jetbrains.annotations.NotNull;
 
 public class ResourceTablePanel {
   private JPanel myContainer;
-  private ComboBox myPackageCombo;
+  private ComboBox<PackageChunk> myPackageCombo;
 
   private Splitter mySplitter;
-  private JBList myTypesList;
+  private JBList<TypeSpecChunk> myTypesList;
   private JBTable myResourceTypeTable;
   private SimpleColoredComponent myResourceTableHeader;
 
@@ -45,52 +60,53 @@
       throw new IllegalArgumentException("no chunks");
     }
 
-    if (!(chunks.get(0) instanceof ResourceTableChunk)) {
+    if (!(chunks.get(0) instanceof ResourceTableChunk resourceTableChunk)) {
       throw new IllegalArgumentException("no res table chunk");
     }
 
-    ResourceTableChunk resourceTableChunk = (ResourceTableChunk)chunks.get(0);
     Collection<PackageChunk> packages = resourceTableChunk.getPackages();
+
     myPackageCombo.setModel(new CollectionComboBoxModel<>(ImmutableList.copyOf(packages)));
-    myPackageCombo.setRenderer(SimpleListCellRenderer.create("", PackageChunk::getPackageName));
+    myPackageCombo.setRenderer(SimpleListCellRenderer.create("<No Resources>", PackageChunk::getPackageName));
+    myPackageCombo.setMinimumAndPreferredWidth(JBUIScale.scale(150));
 
-    assert packages.size() == 1;
-    PackageChunk packageChunk = packages.stream().findFirst().get();
+    if (!packages.isEmpty()) {
+      PackageChunk packageChunk = packages.stream().findFirst().get();
+      myTypesList.setModel(new CollectionListModel<>(packageChunk.getTypeSpecChunks()));
+      myTypesList.setCellRenderer(SimpleListCellRenderer.create("", TypeSpecChunk::getTypeName));
+      myTypesList.addListSelectionListener(e -> {
+        TypeSpecChunk selectedValue = myTypesList.getSelectedValue();
+        if (selectedValue == null) {
+          return;
+        }
 
-    myTypesList.setModel(new CollectionListModel<>(packageChunk.getTypeSpecChunks()));
-    myTypesList.setCellRenderer(SimpleListCellRenderer.create("", TypeSpecChunk::getTypeName));
-    myTypesList.addListSelectionListener(e -> {
-      Object selectedValue = myTypesList.getSelectedValue();
-      if (!(selectedValue instanceof TypeSpecChunk)) {
-        return;
-      }
+        myResourceTypeTable
+          .setModel(new ResourceTypeTableModel(resourceTableChunk.getStringPool(), packageChunk, selectedValue));
 
-      TypeSpecChunk typeSpecChunk = (TypeSpecChunk)selectedValue;
-      myResourceTypeTable
-        .setModel(new ResourceTypeTableModel(resourceTableChunk.getStringPool(), packageChunk, typeSpecChunk));
+        myResourceTypeTable.getColumnModel().getColumn(0).setMinWidth(100); // resource id column
+        myResourceTypeTable.getColumnModel().getColumn(1).setMinWidth(250); // resource name column
 
-      myResourceTypeTable.getColumnModel().getColumn(0).setMinWidth(100); // resource id column
-      myResourceTypeTable.getColumnModel().getColumn(1).setMinWidth(250); // resource name column
+        int resourceCount = selectedValue.getResourceCount();
+        int configCount = packageChunk.getTypeChunks(selectedValue.getId()).size();
 
-      int resourceCount = typeSpecChunk.getResourceCount();
-      int configCount = packageChunk.getTypeChunks(typeSpecChunk.getId()).size();
+        // Render a sentence like: "There [is|are] N layout resources across M configuration[s]."
+        myResourceTableHeader.clear();
+        myResourceTableHeader.append("There " + (resourceCount > 1 ? "are " : "is "));
+        myResourceTableHeader.append(Integer.toString(resourceCount), SimpleTextAttributes.REGULAR_BOLD_ATTRIBUTES);
+        myResourceTableHeader.append(" " + selectedValue.getTypeName() + (resourceCount > 1 ? " resources" : " resource") + " across ");
+        myResourceTableHeader.append(Integer.toString(configCount), SimpleTextAttributes.REGULAR_BOLD_ATTRIBUTES);
+        myResourceTableHeader.append(" configuration" + (configCount > 1 ? "s" : ""));
+      });
+    }
 
-      // Render a sentence like: "There [is|are] N layout resources across M configuration[s]."
-      myResourceTableHeader.clear();
-      myResourceTableHeader.append("There " + (resourceCount > 1 ? "are " : "is "));
-      myResourceTableHeader.append(Integer.toString(resourceCount), SimpleTextAttributes.REGULAR_BOLD_ATTRIBUTES);
-      myResourceTableHeader.append(" " + typeSpecChunk.getTypeName() + (resourceCount > 1 ? " resources" : " resource") + " across ");
-      myResourceTableHeader.append(Integer.toString(configCount), SimpleTextAttributes.REGULAR_BOLD_ATTRIBUTES);
-      myResourceTableHeader.append(" configuration" + (configCount > 1 ? "s" : ""));
-    });
   }
 
   private void createUIComponents() {
-    JBLabel label = new JBLabel("Resource Types");
-    myTypesList = new JBList();
+    JBLabel label = new JBLabel("Resource types");
+    myTypesList = new JBList<>();
 
     JPanel resourceTypesPanel = new JPanel(new BorderLayout());
-    resourceTypesPanel.setBorder(IdeBorderFactory.createBorder(SideBorder.TOP));
+    resourceTypesPanel.setBorder(JBUI.Borders.empty(1, 10, 0, 0));
     resourceTypesPanel.add(label, BorderLayout.NORTH);
     resourceTypesPanel.add(ScrollPaneFactory.createScrollPane(myTypesList), BorderLayout.CENTER);
 
diff --git a/app-inspection/inspectors/backgroundtask/ide/src/com/android/tools/idea/appinspection/inspectors/backgroundtask/ide/BackgroundTaskInspectorTabProvider.kt b/app-inspection/inspectors/backgroundtask/ide/src/com/android/tools/idea/appinspection/inspectors/backgroundtask/ide/BackgroundTaskInspectorTabProvider.kt
index bd1b408..207f436 100644
--- a/app-inspection/inspectors/backgroundtask/ide/src/com/android/tools/idea/appinspection/inspectors/backgroundtask/ide/BackgroundTaskInspectorTabProvider.kt
+++ b/app-inspection/inspectors/backgroundtask/ide/src/com/android/tools/idea/appinspection/inspectors/backgroundtask/ide/BackgroundTaskInspectorTabProvider.kt
@@ -101,7 +101,7 @@
         BackgroundTaskInspectorTab(
             client,
             ideServices,
-            IntellijUiComponentsProvider(project),
+            IntellijUiComponentsProvider(project, parentDisposable),
             scope,
             AndroidDispatchers.uiThread,
           )
diff --git a/app-inspection/inspectors/backgroundtask/ide/src/com/android/tools/idea/appinspection/inspectors/backgroundtask/ide/IntellijUiComponentsProvider.kt b/app-inspection/inspectors/backgroundtask/ide/src/com/android/tools/idea/appinspection/inspectors/backgroundtask/ide/IntellijUiComponentsProvider.kt
index 30584c4..903880d 100644
--- a/app-inspection/inspectors/backgroundtask/ide/src/com/android/tools/idea/appinspection/inspectors/backgroundtask/ide/IntellijUiComponentsProvider.kt
+++ b/app-inspection/inspectors/backgroundtask/ide/src/com/android/tools/idea/appinspection/inspectors/backgroundtask/ide/IntellijUiComponentsProvider.kt
@@ -24,9 +24,13 @@
 import com.android.tools.nativeSymbolizer.ProjectSymbolSource
 import com.android.tools.nativeSymbolizer.SymbolFilesLocator
 import com.android.tools.nativeSymbolizer.createNativeSymbolizer
+import com.intellij.openapi.Disposable
 import com.intellij.openapi.project.Project
 
-class IntellijUiComponentsProvider(private val project: Project) : UiComponentsProvider {
+class IntellijUiComponentsProvider(
+  private val project: Project,
+  private val parentDisposable: Disposable,
+) : UiComponentsProvider {
   override val codeNavigator: CodeNavigator
 
   init {
@@ -37,6 +41,6 @@
   }
 
   override fun createStackTraceView(model: StackTraceModel): StackTraceView {
-    return IntelliJStackTraceGroup(project).createStackView(model)
+    return IntelliJStackTraceGroup(project, parentDisposable).createStackView(model)
   }
 }
diff --git a/app-inspection/inspectors/backgroundtask/view/testSrc/com/android/tools/idea/appinspection/inspectors/backgroundtask/view/BackgroundTaskEntriesViewTest.kt b/app-inspection/inspectors/backgroundtask/view/testSrc/com/android/tools/idea/appinspection/inspectors/backgroundtask/view/BackgroundTaskEntriesViewTest.kt
index 154e344..2e01be3 100644
--- a/app-inspection/inspectors/backgroundtask/view/testSrc/com/android/tools/idea/appinspection/inspectors/backgroundtask/view/BackgroundTaskEntriesViewTest.kt
+++ b/app-inspection/inspectors/backgroundtask/view/testSrc/com/android/tools/idea/appinspection/inspectors/backgroundtask/view/BackgroundTaskEntriesViewTest.kt
@@ -34,6 +34,7 @@
 import com.google.wireless.android.sdk.stats.AppInspectionEvent.BackgroundTaskInspectorEvent.Type.TABLE_MODE_SELECTED
 import com.google.wireless.android.sdk.stats.AppInspectionEvent.BackgroundTaskInspectorEvent.Type.WORK_SELECTED
 import com.intellij.openapi.actionSystem.ActionToolbar
+import com.intellij.testFramework.DisposableRule
 import com.intellij.testFramework.RuleChain
 import com.intellij.testFramework.TestActionEvent
 import com.intellij.util.concurrency.EdtExecutorService
@@ -52,8 +53,9 @@
 class BackgroundTaskEntriesViewTest {
   private val projectRule = AndroidProjectRule.inMemory()
   private val usageTrackerRule = UsageTrackerRule()
+  private val disposableRule = DisposableRule()
 
-  @get:Rule val rule = RuleChain(projectRule, usageTrackerRule)
+  @get:Rule val rule = RuleChain(projectRule, usageTrackerRule, disposableRule)
 
   private val scope =
     CoroutineScope(MoreExecutors.directExecutor().asCoroutineDispatcher() + SupervisorJob())
@@ -81,7 +83,7 @@
         BackgroundTaskInspectorTab(
           client,
           AppInspectionIdeServicesAdapter(),
-          IntellijUiComponentsProvider(projectRule.project),
+          IntellijUiComponentsProvider(projectRule.project, disposableRule.disposable),
           scope,
           uiDispatcher,
         )
diff --git a/app-inspection/inspectors/backgroundtask/view/testSrc/com/android/tools/idea/appinspection/inspectors/backgroundtask/view/BackgroundTaskInspectorComponentInteractionTest.kt b/app-inspection/inspectors/backgroundtask/view/testSrc/com/android/tools/idea/appinspection/inspectors/backgroundtask/view/BackgroundTaskInspectorComponentInteractionTest.kt
index de0a72d..323c2c3 100644
--- a/app-inspection/inspectors/backgroundtask/view/testSrc/com/android/tools/idea/appinspection/inspectors/backgroundtask/view/BackgroundTaskInspectorComponentInteractionTest.kt
+++ b/app-inspection/inspectors/backgroundtask/view/testSrc/com/android/tools/idea/appinspection/inspectors/backgroundtask/view/BackgroundTaskInspectorComponentInteractionTest.kt
@@ -38,6 +38,8 @@
 import com.intellij.openapi.actionSystem.AnAction
 import com.intellij.openapi.actionSystem.AnActionEvent
 import com.intellij.openapi.actionSystem.impl.ActionToolbarImpl
+import com.intellij.testFramework.DisposableRule
+import com.intellij.testFramework.RuleChain
 import com.intellij.testFramework.TestActionEvent
 import com.intellij.ui.components.ActionLink
 import com.intellij.ui.components.JBScrollPane
@@ -64,7 +66,9 @@
 
 class BackgroundTaskInspectorComponentInteractionTest {
 
-  @get:Rule val projectRule = AndroidProjectRule.inMemory()
+  private val projectRule = AndroidProjectRule.inMemory()
+  private val disposableRule = DisposableRule()
+  @get:Rule val rule = RuleChain(projectRule, disposableRule)
 
   private lateinit var scope: CoroutineScope
   private lateinit var workMessenger: BackgroundTaskViewTestUtils.FakeAppInspectorMessenger
@@ -96,7 +100,7 @@
         BackgroundTaskInspectorTab(
           client,
           AppInspectionIdeServicesAdapter(),
-          IntellijUiComponentsProvider(projectRule.project),
+          IntellijUiComponentsProvider(projectRule.project, disposableRule.disposable),
           scope,
           uiDispatcher,
         )
diff --git a/app-inspection/inspectors/backgroundtask/view/testSrc/com/android/tools/idea/appinspection/inspectors/backgroundtask/view/BackgroundTaskTreeTableViewTest.kt b/app-inspection/inspectors/backgroundtask/view/testSrc/com/android/tools/idea/appinspection/inspectors/backgroundtask/view/BackgroundTaskTreeTableViewTest.kt
index f7e1328..b9adfae 100644
--- a/app-inspection/inspectors/backgroundtask/view/testSrc/com/android/tools/idea/appinspection/inspectors/backgroundtask/view/BackgroundTaskTreeTableViewTest.kt
+++ b/app-inspection/inspectors/backgroundtask/view/testSrc/com/android/tools/idea/appinspection/inspectors/backgroundtask/view/BackgroundTaskTreeTableViewTest.kt
@@ -50,6 +50,8 @@
 import com.android.tools.idea.testing.AndroidProjectRule
 import com.google.common.truth.Truth.assertThat
 import com.google.common.util.concurrent.MoreExecutors
+import com.intellij.testFramework.DisposableRule
+import com.intellij.testFramework.RuleChain
 import com.intellij.util.concurrency.EdtExecutorService
 import javax.swing.JScrollPane
 import javax.swing.JTree
@@ -67,7 +69,9 @@
 import org.junit.Test
 
 class BackgroundTaskTreeTableViewTest {
-  @get:Rule val projectRule = AndroidProjectRule.inMemory()
+  private val projectRule = AndroidProjectRule.inMemory()
+  private val disposableRule = DisposableRule()
+  @get:Rule val rule = RuleChain(projectRule, disposableRule)
 
   private lateinit var scope: CoroutineScope
   private lateinit var workMessenger: BackgroundTaskViewTestUtils.FakeAppInspectorMessenger
@@ -96,7 +100,7 @@
         BackgroundTaskInspectorTab(
           client,
           AppInspectionIdeServicesAdapter(),
-          IntellijUiComponentsProvider(projectRule.project),
+          IntellijUiComponentsProvider(projectRule.project, disposableRule.disposable),
           scope,
           uiDispatcher,
         )
diff --git a/app-inspection/inspectors/backgroundtask/view/testSrc/com/android/tools/idea/appinspection/inspectors/backgroundtask/view/WorkDependencyGraphViewTest.kt b/app-inspection/inspectors/backgroundtask/view/testSrc/com/android/tools/idea/appinspection/inspectors/backgroundtask/view/WorkDependencyGraphViewTest.kt
index 4ba23bd..d9a6988 100644
--- a/app-inspection/inspectors/backgroundtask/view/testSrc/com/android/tools/idea/appinspection/inspectors/backgroundtask/view/WorkDependencyGraphViewTest.kt
+++ b/app-inspection/inspectors/backgroundtask/view/testSrc/com/android/tools/idea/appinspection/inspectors/backgroundtask/view/WorkDependencyGraphViewTest.kt
@@ -26,6 +26,8 @@
 import com.android.tools.idea.testing.AndroidProjectRule
 import com.google.common.truth.Truth.assertThat
 import com.google.common.util.concurrent.MoreExecutors
+import com.intellij.testFramework.DisposableRule
+import com.intellij.testFramework.RuleChain
 import com.intellij.util.concurrency.EdtExecutorService
 import java.awt.event.ActionEvent
 import kotlinx.coroutines.CoroutineScope
@@ -42,7 +44,9 @@
 import org.mockito.Mockito
 
 class WorkDependencyGraphViewTest {
-  @get:Rule val projectRule = AndroidProjectRule.inMemory()
+  private val projectRule = AndroidProjectRule.inMemory()
+  private val disposableRule = DisposableRule()
+  @get:Rule val rule = RuleChain(projectRule, disposableRule)
 
   private lateinit var scope: CoroutineScope
   private lateinit var workMessenger: BackgroundTaskViewTestUtils.FakeAppInspectorMessenger
@@ -72,7 +76,7 @@
         BackgroundTaskInspectorTab(
           client,
           AppInspectionIdeServicesAdapter(),
-          IntellijUiComponentsProvider(projectRule.project),
+          IntellijUiComponentsProvider(projectRule.project, disposableRule.disposable),
           scope,
           uiDispatcher,
         )
diff --git a/app-inspection/inspectors/network/ide/src/com/android/tools/idea/appinspection/inspectors/network/ide/DefaultUiComponentsProvider.kt b/app-inspection/inspectors/network/ide/src/com/android/tools/idea/appinspection/inspectors/network/ide/DefaultUiComponentsProvider.kt
index 3899ffc..73e897e 100644
--- a/app-inspection/inspectors/network/ide/src/com/android/tools/idea/appinspection/inspectors/network/ide/DefaultUiComponentsProvider.kt
+++ b/app-inspection/inspectors/network/ide/src/com/android/tools/idea/appinspection/inspectors/network/ide/DefaultUiComponentsProvider.kt
@@ -36,14 +36,10 @@
     formatted: Boolean,
   ): DataViewer {
     return when {
-      contentType.isSupportedImageType -> {
-        IntellijImageDataViewer(bytes, parentDisposable)
-      }
-      styleHint == DataViewer.Style.RAW -> {
-        if (contentType.isSupportedTextType) IntellijDataViewer.createRawTextViewer(bytes)
-        else IntellijDataViewer.createInvalidViewer()
-      }
-      styleHint == DataViewer.Style.PRETTY -> {
+      contentType.isSupportedImageType -> IntellijImageDataViewer(bytes, parentDisposable)
+      !contentType.isSupportedTextType -> IntellijDataViewer.createInvalidViewer()
+      styleHint == DataViewer.Style.RAW -> IntellijDataViewer.createRawTextViewer(bytes)
+      styleHint == DataViewer.Style.PRETTY ->
         IntellijDataViewer.createPrettyViewerIfPossible(
           project,
           bytes,
@@ -51,15 +47,11 @@
           formatted,
           parentDisposable,
         )
-      }
-      else -> {
-        // This shouldn't ever happen.
-        throw RuntimeException("DataViewer style is invalid.")
-      }
+      else -> throw RuntimeException("DataViewer style is invalid.")
     }
   }
 
   override fun createStackGroup(): StackTraceGroup {
-    return IntelliJStackTraceGroup(project)
+    return IntelliJStackTraceGroup(project, parentDisposable)
   }
 }
diff --git a/app-inspection/inspectors/network/ide/src/com/android/tools/idea/appinspection/inspectors/network/ide/NetworkInspectorTabProvider.kt b/app-inspection/inspectors/network/ide/src/com/android/tools/idea/appinspection/inspectors/network/ide/NetworkInspectorTabProvider.kt
index 124305f..da2aaa2 100644
--- a/app-inspection/inspectors/network/ide/src/com/android/tools/idea/appinspection/inspectors/network/ide/NetworkInspectorTabProvider.kt
+++ b/app-inspection/inspectors/network/ide/src/com/android/tools/idea/appinspection/inspectors/network/ide/NetworkInspectorTabProvider.kt
@@ -85,6 +85,7 @@
           AndroidDispatchers.workerThread,
           AndroidDispatchers.uiThread,
           usageTracker,
+          ideServices,
         )
       private val networkInspectorTab =
         NetworkInspectorTab(
diff --git a/app-inspection/inspectors/network/ide/testSrc/com/android/tools/idea/appinspection/inspectors/network/ide/UiComponentsProviderTest.kt b/app-inspection/inspectors/network/ide/testSrc/com/android/tools/idea/appinspection/inspectors/network/ide/UiComponentsProviderTest.kt
index 804f31a..faf7eb0 100644
--- a/app-inspection/inspectors/network/ide/testSrc/com/android/tools/idea/appinspection/inspectors/network/ide/UiComponentsProviderTest.kt
+++ b/app-inspection/inspectors/network/ide/testSrc/com/android/tools/idea/appinspection/inspectors/network/ide/UiComponentsProviderTest.kt
@@ -87,6 +87,38 @@
   }
 
   @Test
+  fun createInvalidRawDataViewer() {
+    val componentsProvider =
+      DefaultUiComponentsProvider(projectRule.project, projectRule.testRootDisposable)
+
+    val viewer =
+      componentsProvider.createDataViewer(
+        "csv,file".toByteArray(),
+        ContentType.DEFAULT,
+        DataViewer.Style.RAW,
+        false,
+      )
+    assertThat(viewer).isInstanceOf(IntellijDataViewer::class.java)
+    assertThat(viewer.style).isEqualTo(DataViewer.Style.INVALID)
+  }
+
+  @Test
+  fun createInvalidPrettyDataViewer() {
+    val componentsProvider =
+      DefaultUiComponentsProvider(projectRule.project, projectRule.testRootDisposable)
+
+    val viewer =
+      componentsProvider.createDataViewer(
+        "csv,file".toByteArray(),
+        ContentType.DEFAULT,
+        DataViewer.Style.PRETTY,
+        false,
+      )
+    assertThat(viewer).isInstanceOf(IntellijDataViewer::class.java)
+    assertThat(viewer.style).isEqualTo(DataViewer.Style.INVALID)
+  }
+
+  @Test
   fun createPrettyDataViewer() {
     val componentsProvider =
       DefaultUiComponentsProvider(projectRule.project, projectRule.testRootDisposable)
diff --git a/app-inspection/inspectors/network/model/src/com/android/tools/idea/appinspection/inspectors/network/model/NetworkInspectorClient.kt b/app-inspection/inspectors/network/model/src/com/android/tools/idea/appinspection/inspectors/network/model/NetworkInspectorClient.kt
index 569eb84..9a940e4 100644
--- a/app-inspection/inspectors/network/model/src/com/android/tools/idea/appinspection/inspectors/network/model/NetworkInspectorClient.kt
+++ b/app-inspection/inspectors/network/model/src/com/android/tools/idea/appinspection/inspectors/network/model/NetworkInspectorClient.kt
@@ -20,9 +20,10 @@
 import studio.network.inspection.NetworkInspectorProtocol.InterceptCommand
 import studio.network.inspection.NetworkInspectorProtocol.Response
 import studio.network.inspection.NetworkInspectorProtocol.StartInspectionCommand
+import studio.network.inspection.NetworkInspectorProtocol.StartInspectionResponse
 
 interface NetworkInspectorClient {
-  suspend fun getStartTimeStampNs(): Long
+  suspend fun startInspection(): StartInspectionResponse
 
   suspend fun interceptResponse(command: InterceptCommand)
 }
@@ -30,12 +31,12 @@
 class NetworkInspectorClientImpl(private val messenger: AppInspectorMessenger) :
   NetworkInspectorClient {
 
-  override suspend fun getStartTimeStampNs(): Long {
+  override suspend fun startInspection(): StartInspectionResponse {
     val response =
       messenger.sendRawCommand {
         startInspectionCommand = StartInspectionCommand.getDefaultInstance()
       }
-    return response.startInspectionResponse.timestamp
+    return response.startInspectionResponse
   }
 
   override suspend fun interceptResponse(command: InterceptCommand) {
diff --git a/app-inspection/inspectors/network/model/src/com/android/tools/idea/appinspection/inspectors/network/model/NetworkInspectorServices.kt b/app-inspection/inspectors/network/model/src/com/android/tools/idea/appinspection/inspectors/network/model/NetworkInspectorServices.kt
index 8b2c2eb..f42dc88 100644
--- a/app-inspection/inspectors/network/model/src/com/android/tools/idea/appinspection/inspectors/network/model/NetworkInspectorServices.kt
+++ b/app-inspection/inspectors/network/model/src/com/android/tools/idea/appinspection/inspectors/network/model/NetworkInspectorServices.kt
@@ -17,13 +17,9 @@
 
 import com.android.tools.adtui.model.StopwatchTimer
 import com.android.tools.adtui.model.updater.Updater
+import com.android.tools.idea.appinspection.inspector.api.AppInspectionIdeServices
 import com.android.tools.idea.appinspection.inspectors.network.model.analytics.NetworkInspectorTracker
-import com.android.tools.idea.appinspection.inspectors.network.model.analytics.StubNetworkInspectorTracker
-import com.google.common.util.concurrent.MoreExecutors
-import com.intellij.util.concurrency.EdtExecutorService
 import kotlinx.coroutines.CoroutineDispatcher
-import kotlinx.coroutines.asCoroutineDispatcher
-import studio.network.inspection.NetworkInspectorProtocol
 
 interface NetworkInspectorServices {
   val navigationProvider: CodeNavigationProvider
@@ -32,6 +28,7 @@
   val workerDispatcher: CoroutineDispatcher
   val uiDispatcher: CoroutineDispatcher
   val usageTracker: NetworkInspectorTracker
+  val ideServices: AppInspectionIdeServices
 }
 
 /**
@@ -44,24 +41,7 @@
   override val workerDispatcher: CoroutineDispatcher,
   override val uiDispatcher: CoroutineDispatcher,
   override val usageTracker: NetworkInspectorTracker,
+  override val ideServices: AppInspectionIdeServices,
 ) : NetworkInspectorServices {
   override val updater = Updater(timer)
 }
-
-/** For tests only. */
-class TestNetworkInspectorServices(
-  override val navigationProvider: CodeNavigationProvider,
-  timer: StopwatchTimer,
-  override val client: NetworkInspectorClient =
-    object : NetworkInspectorClient {
-      override suspend fun getStartTimeStampNs() = 0L
-
-      override suspend fun interceptResponse(command: NetworkInspectorProtocol.InterceptCommand) =
-        Unit
-    },
-  override val usageTracker: NetworkInspectorTracker = StubNetworkInspectorTracker(),
-) : NetworkInspectorServices {
-  override val updater = Updater(timer)
-  override val workerDispatcher = MoreExecutors.directExecutor().asCoroutineDispatcher()
-  override val uiDispatcher = EdtExecutorService.getInstance().asCoroutineDispatcher()
-}
diff --git a/app-inspection/inspectors/network/model/src/com/android/tools/idea/appinspection/inspectors/network/model/connections/HttpData.kt b/app-inspection/inspectors/network/model/src/com/android/tools/idea/appinspection/inspectors/network/model/connections/HttpData.kt
index 82112d2..f6af99b 100644
--- a/app-inspection/inspectors/network/model/src/com/android/tools/idea/appinspection/inspectors/network/model/connections/HttpData.kt
+++ b/app-inspection/inspectors/network/model/src/com/android/tools/idea/appinspection/inspectors/network/model/connections/HttpData.kt
@@ -30,7 +30,6 @@
 
 const val APPLICATION_FORM_MIME_TYPE = "application/x-www-form-urlencoded"
 private const val CONTENT_ENCODING = "content-encoding"
-private const val CONTENT_LENGTH = "content-length"
 private const val CONTENT_TYPE = "content-type"
 
 /**
@@ -197,9 +196,6 @@
 
   fun getResponseContentType() = ContentType(responseHeaders[CONTENT_TYPE]?.firstOrNull() ?: "")
 
-  fun getResponseContentLength() =
-    responseHeaders[CONTENT_LENGTH]?.firstOrNull()?.toIntOrNull() ?: -1
-
   class ContentType(private val contentType: String) {
     val isEmpty = contentType.isEmpty()
 
diff --git a/app-inspection/inspectors/network/model/testSrc/com/android/tools/idea/appinspection/inspectors/network/model/TestNetworkInspectorServices.kt b/app-inspection/inspectors/network/model/testSrc/com/android/tools/idea/appinspection/inspectors/network/model/TestNetworkInspectorServices.kt
new file mode 100644
index 0000000..3b0f03c
--- /dev/null
+++ b/app-inspection/inspectors/network/model/testSrc/com/android/tools/idea/appinspection/inspectors/network/model/TestNetworkInspectorServices.kt
@@ -0,0 +1,68 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.tools.idea.appinspection.inspectors.network.model
+
+import com.android.tools.adtui.model.StopwatchTimer
+import com.android.tools.adtui.model.updater.Updater
+import com.android.tools.idea.appinspection.inspector.api.AppInspectionIdeServices
+import com.android.tools.idea.appinspection.inspectors.network.model.analytics.NetworkInspectorTracker
+import com.android.tools.idea.appinspection.inspectors.network.model.analytics.StubNetworkInspectorTracker
+import com.google.common.util.concurrent.MoreExecutors
+import com.intellij.util.concurrency.EdtExecutorService
+import kotlinx.coroutines.asCoroutineDispatcher
+import studio.network.inspection.NetworkInspectorProtocol
+
+/** Test implementation of [NetworkInspectorServices]. */
+class TestNetworkInspectorServices(
+  override val navigationProvider: CodeNavigationProvider,
+  timer: StopwatchTimer,
+  override val client: NetworkInspectorClient =
+    object : NetworkInspectorClient {
+      override suspend fun startInspection(): NetworkInspectorProtocol.StartInspectionResponse =
+        NetworkInspectorProtocol.StartInspectionResponse.getDefaultInstance()
+
+      override suspend fun interceptResponse(command: NetworkInspectorProtocol.InterceptCommand) =
+        Unit
+    },
+  override val usageTracker: NetworkInspectorTracker = StubNetworkInspectorTracker(),
+) : NetworkInspectorServices {
+  override val updater = Updater(timer)
+  override val workerDispatcher = MoreExecutors.directExecutor().asCoroutineDispatcher()
+  override val uiDispatcher = EdtExecutorService.getInstance().asCoroutineDispatcher()
+  override val ideServices =
+    object : AppInspectionIdeServices {
+      override fun showToolWindow() {
+        TODO("Not yet implemented")
+      }
+
+      override fun showNotification(
+        content: String,
+        title: String,
+        severity: AppInspectionIdeServices.Severity,
+        hyperlinkClicked: () -> Unit,
+      ) {
+        TODO("Not yet implemented")
+      }
+
+      override suspend fun navigateTo(codeLocation: AppInspectionIdeServices.CodeLocation) {
+        TODO("Not yet implemented")
+      }
+
+      override fun isTabSelected(inspectorId: String): Boolean {
+        TODO("Not yet implemented")
+      }
+    }
+}
diff --git a/app-inspection/inspectors/network/view/src/com/android/tools/idea/appinspection/inspectors/network/view/NetworkInspectorTab.kt b/app-inspection/inspectors/network/view/src/com/android/tools/idea/appinspection/inspectors/network/view/NetworkInspectorTab.kt
index 3492b15..23197a7 100644
--- a/app-inspection/inspectors/network/view/src/com/android/tools/idea/appinspection/inspectors/network/view/NetworkInspectorTab.kt
+++ b/app-inspection/inspectors/network/view/src/com/android/tools/idea/appinspection/inspectors/network/view/NetworkInspectorTab.kt
@@ -25,15 +25,19 @@
 import com.android.tools.adtui.stdui.CommonToggleButton
 import com.android.tools.adtui.stdui.DefaultContextMenuItem
 import com.android.tools.adtui.stdui.TooltipLayeredPane
+import com.android.tools.idea.appinspection.inspector.api.AppInspectionIdeServices.Severity
 import com.android.tools.idea.appinspection.inspectors.network.model.NetworkInspectorDataSource
 import com.android.tools.idea.appinspection.inspectors.network.model.NetworkInspectorModel
 import com.android.tools.idea.appinspection.inspectors.network.model.NetworkInspectorServices
 import com.android.tools.idea.appinspection.inspectors.network.view.constants.DEFAULT_BACKGROUND
 import com.android.tools.idea.appinspection.inspectors.network.view.constants.H4_FONT
 import com.android.tools.idea.appinspection.inspectors.network.view.constants.TOOLBAR_HEIGHT
+import com.android.tools.idea.concurrency.AndroidDispatchers
 import com.android.tools.idea.flags.StudioFlags
 import com.intellij.icons.AllIcons
 import com.intellij.openapi.Disposable
+import com.intellij.openapi.fileChooser.FileChooserFactory
+import com.intellij.openapi.fileChooser.FileSaverDescriptor
 import com.intellij.openapi.project.Project
 import com.intellij.openapi.ui.ThreeComponentsSplitter
 import com.intellij.openapi.util.Disposer
@@ -47,6 +51,7 @@
 import java.awt.event.InputEvent.CTRL_DOWN_MASK
 import java.awt.event.InputEvent.META_DOWN_MASK
 import java.awt.event.KeyEvent
+import java.nio.file.Path
 import java.util.concurrent.TimeUnit
 import javax.swing.JPanel
 import javax.swing.KeyStroke
@@ -55,6 +60,7 @@
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Job
 import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
 import org.jetbrains.annotations.VisibleForTesting
 
 private const val ZOOM_IN = "Zoom in"
@@ -62,16 +68,17 @@
 private const val RESET_ZOOM = "Reset zoom"
 private const val ZOOM_TO_SELECTION = "Zoom to selection"
 private const val CLEAR_DATA = "Clear data"
+private const val EXPORT_CONNECTIONS = "Export connections"
 private const val ATTACH_LIVE = "Attach to live"
 private const val DETACH_LIVE = "Detach live"
 private val SHORTCUT_MODIFIER_MASK_NUMBER = if (SystemInfo.isMac) META_DOWN_MASK else CTRL_DOWN_MASK
 
 class NetworkInspectorTab(
-  project: Project,
+  private val project: Project,
   componentsProvider: UiComponentsProvider,
   dataSource: NetworkInspectorDataSource,
   private val services: NetworkInspectorServices,
-  scope: CoroutineScope,
+  private val scope: CoroutineScope,
   parentDisposable: Disposable,
 ) : AspectObserver(), Disposable {
 
@@ -87,7 +94,7 @@
     Disposer.register(parentDisposable, this)
     val parentPanel = JPanel(BorderLayout())
     parentPanel.background = DEFAULT_BACKGROUND
-    val splitter = ThreeComponentsSplitter(parentDisposable)
+    val splitter = ThreeComponentsSplitter()
     splitter.focusTraversalPolicy = LayoutFocusTraversalPolicy()
     splitter.dividerWidth = 0
     splitter.setDividerMouseZoneSize(-1)
@@ -106,14 +113,23 @@
     model = NetworkInspectorModel(services, dataSource, scope)
     launchJob =
       scope.launch(services.workerDispatcher) {
+        val response = services.client.startInspection()
         if (StudioFlags.NETWORK_INSPECTOR_STATIC_TIMELINE.get()) {
-          val startTimeStampUs =
-            TimeUnit.NANOSECONDS.toMicros(services.client.getStartTimeStampNs()).toDouble()
+          val startTimeStampUs = TimeUnit.NANOSECONDS.toMicros(response.timestamp).toDouble()
           model.timeline.dataRange.set(startTimeStampUs, startTimeStampUs)
         } else {
-          val startTimeStampNs = services.client.getStartTimeStampNs()
+          val startTimeStampNs = response.timestamp
           (model.timeline as StreamingTimeline).reset(startTimeStampNs, startTimeStampNs)
         }
+        withContext(AndroidDispatchers.uiThread) {
+          if (!response.speedCollectionStarted) {
+            services.ideServices.showNotification(
+              "Failed to collect speed data. See device Logcat for more information",
+              "Network Inspector",
+              Severity.ERROR,
+            )
+          }
+        }
       }
 
     view =
@@ -132,6 +148,18 @@
     toolbar.add(actionsToolBar, BorderLayout.EAST)
     actionsToolBar.border = JBUI.Borders.emptyRight(2)
 
+    val exportConnectionsButton = CommonButton(StudioIcons.Common.EXPORT)
+    exportConnectionsButton.name = EXPORT_CONNECTIONS
+    exportConnectionsButton.disabledIcon = IconLoader.getDisabledIcon(StudioIcons.Common.EXPORT)
+    exportConnectionsButton.addActionListener { exportConnections() }
+    val exportConnectionsAction =
+      DefaultContextMenuItem.Builder(EXPORT_CONNECTIONS)
+        .setContainerComponent(splitter)
+        .setActionRunnable { exportConnectionsButton.doClick(0) }
+        .build()
+    exportConnectionsButton.toolTipText = exportConnectionsAction.defaultToolTipText
+    actionsToolBar.add(exportConnectionsButton)
+
     val clearDataButton = CommonButton(StudioIcons.Common.DELETE)
     clearDataButton.name = CLEAR_DATA
     clearDataButton.disabledIcon = IconLoader.getDisabledIcon(StudioIcons.Common.DELETE)
@@ -273,6 +301,17 @@
     model.reset()
   }
 
+  private fun exportConnections() {
+    val descriptor = FileSaverDescriptor("Export Connections", "", "json")
+    val dialog = FileChooserFactory.getInstance().createSaveFileDialog(descriptor, project)
+    val baseDir = Path.of(System.getProperty("user.home"), "Downloads")
+    val fileWrapper = dialog.save(baseDir, "connections.json") ?: return
+    scope.launch {
+      val path = fileWrapper.file.toPath()
+      view.connectionsView.exportConnections(path)
+    }
+  }
+
   fun stopInspection() {
     assert(!StudioFlags.NETWORK_INSPECTOR_STATIC_TIMELINE.get())
     (model.timeline as StreamingTimeline).setIsPaused(true)
diff --git a/app-inspection/inspectors/network/view/src/com/android/tools/idea/appinspection/inspectors/network/view/connectionsview/ConnectionsTableModel.kt b/app-inspection/inspectors/network/view/src/com/android/tools/idea/appinspection/inspectors/network/view/connectionsview/ConnectionsTableModel.kt
index b6ea3fd..14f2253 100644
--- a/app-inspection/inspectors/network/view/src/com/android/tools/idea/appinspection/inspectors/network/view/connectionsview/ConnectionsTableModel.kt
+++ b/app-inspection/inspectors/network/view/src/com/android/tools/idea/appinspection/inspectors/network/view/connectionsview/ConnectionsTableModel.kt
@@ -21,7 +21,7 @@
 
 internal class ConnectionsTableModel(selectionRangeDataFetcher: SelectionRangeDataFetcher) :
   AbstractTableModel() {
-  private lateinit var dataList: List<ConnectionData>
+  private var dataList: List<ConnectionData> = emptyList()
 
   init {
     selectionRangeDataFetcher.addOnChangedListener { list ->
@@ -41,5 +41,7 @@
 
   override fun getColumnClass(columnIndex: Int) = ConnectionColumn.values()[columnIndex].type
 
-  fun getConnectionData(rowIndex: Int) = dataList[rowIndex]
+  fun getConnectionData(rowIndex: Int): ConnectionData = dataList[rowIndex]
+
+  fun getConnectionDataList() = dataList
 }
diff --git a/app-inspection/inspectors/network/view/src/com/android/tools/idea/appinspection/inspectors/network/view/connectionsview/ConnectionsView.kt b/app-inspection/inspectors/network/view/src/com/android/tools/idea/appinspection/inspectors/network/view/connectionsview/ConnectionsView.kt
index be451e2..ed37fc7 100644
--- a/app-inspection/inspectors/network/view/src/com/android/tools/idea/appinspection/inspectors/network/view/connectionsview/ConnectionsView.kt
+++ b/app-inspection/inspectors/network/view/src/com/android/tools/idea/appinspection/inspectors/network/view/connectionsview/ConnectionsView.kt
@@ -22,6 +22,7 @@
 import com.android.tools.idea.appinspection.inspectors.network.model.NetworkInspectorModel
 import com.android.tools.idea.appinspection.inspectors.network.model.NetworkInspectorModel.DetailContent
 import com.android.tools.idea.appinspection.inspectors.network.model.connections.ConnectionData
+import com.android.tools.idea.appinspection.inspectors.network.model.connections.GrpcData
 import com.android.tools.idea.appinspection.inspectors.network.model.connections.HttpData
 import com.android.tools.idea.appinspection.inspectors.network.view.NetworkInspectorViewState
 import com.android.tools.idea.appinspection.inspectors.network.view.connectionsview.ConnectionColumn.TIMELINE
@@ -29,6 +30,8 @@
 import com.android.tools.idea.appinspection.inspectors.network.view.constants.ROW_HEIGHT_PADDING
 import com.android.tools.idea.appinspection.inspectors.network.view.rules.registerEnterKeyAction
 import com.android.tools.idea.flags.StudioFlags
+import com.android.tools.idea.protobuf.ByteString
+import com.google.gson.GsonBuilder
 import com.intellij.openapi.actionSystem.AnAction
 import com.intellij.openapi.actionSystem.DataContext.EMPTY_CONTEXT
 import com.intellij.openapi.actionSystem.DefaultActionGroup
@@ -37,10 +40,13 @@
 import java.awt.KeyboardFocusManager
 import java.awt.event.MouseAdapter
 import java.awt.event.MouseEvent
+import java.nio.file.Path
+import java.util.Base64
 import javax.swing.JComponent
 import javax.swing.ListSelectionModel
 import javax.swing.event.ListSelectionEvent
 import javax.swing.table.TableCellRenderer
+import kotlin.io.path.writer
 
 /**
  * This class responsible for displaying table of connections information (e.g. url, duration,
@@ -164,8 +170,73 @@
       connectionsTable.clearSelection()
     }
   }
+
+  /**
+   * Export connection data list to a file
+   *
+   * Although [ConnectionData] are data classes and can be serialized directly, that results in
+   * undesirable representation of the data. Instead, we convert [HttpData] and [GrpcData] to a
+   * [Map<String, Any>].
+   */
+  fun exportConnections(path: Path) {
+    val gson = GsonBuilder().setPrettyPrinting().create()
+    val export =
+      tableModel.getConnectionDataList().mapNotNull {
+        when (it) {
+          is HttpData -> it.forExport()
+          is GrpcData -> it.forExport()
+          else -> null
+        }
+      }
+    path.writer().use { it.write(gson.toJson(export)) }
+  }
 }
 
+private fun HttpData.forExport(): Map<String, Any> {
+  return sortedMapOf(
+    "url" to url,
+    "method" to method,
+    "transport" to httpTransport.name,
+    "stack-trace" to trace,
+    "threads" to threads.joinToString { it.name },
+    "request-headers" to requestHeaders.forExport(),
+    "response-headers" to responseHeaders.forExport(),
+    "request-content-type" to getRequestContentType().mimeType,
+    "response-content-type" to getResponseContentType().mimeType,
+    "request-payload-base64" to requestPayload.forExport(),
+    "response-payload-base64" to getReadableResponsePayload().forExport(),
+    "response-code" to responseCode,
+    "duration-microseconds" to connectionEndTimeUs - requestStartTimeUs,
+  )
+}
+
+private fun GrpcData.forExport(): Map<String, Any> {
+  return sortedMapOf(
+    "address" to address,
+    "service" to service,
+    "method" to method,
+    "transport" to "gRPC",
+    "stack-trace" to trace,
+    "threads" to threads.joinToString { it.name },
+    "request-headers" to requestHeaders.forExport(),
+    "response-headers" to responseHeaders.forExport(),
+    "request-type" to requestType,
+    "response-type" to responseType,
+    "request-payload-base64" to requestPayload.forExport(),
+    "response-payload-base64" to responsePayload.forExport(),
+    "status" to status,
+    "error" to error,
+    "duration-microseconds" to connectionEndTimeUs - requestStartTimeUs,
+  )
+}
+
+/** Collapse [List<String>] to a single string using a join */
+private fun Map<String, List<String>>.forExport() =
+  entries.associate { e -> e.key to e.value.joinToString { it } }
+
+/** Export as a [Base64] string */
+private fun ByteString.forExport() = Base64.getEncoder().encode(toByteArray()).decodeToString()
+
 private fun ConnectionData.getActions(): List<AnAction> {
   val data = this@getActions
   return buildList {
diff --git a/app-inspection/inspectors/network/view/testSrc/com/android/tools/idea/appinspection/inspectors/network/view/details/ConnectionDataDetailsViewTest.kt b/app-inspection/inspectors/network/view/testSrc/com/android/tools/idea/appinspection/inspectors/network/view/details/ConnectionDataDetailsViewTest.kt
index c7321f0..3118348 100644
--- a/app-inspection/inspectors/network/view/testSrc/com/android/tools/idea/appinspection/inspectors/network/view/details/ConnectionDataDetailsViewTest.kt
+++ b/app-inspection/inspectors/network/view/testSrc/com/android/tools/idea/appinspection/inspectors/network/view/details/ConnectionDataDetailsViewTest.kt
@@ -66,6 +66,7 @@
 import org.junit.Rule
 import org.junit.Test
 import studio.network.inspection.NetworkInspectorProtocol
+import studio.network.inspection.NetworkInspectorProtocol.StartInspectionResponse
 
 private const val FAKE_TRACE = "com.google.downloadUrlToStream(ImageFetcher.java:274)"
 private val FAKE_RESPONSE_HEADERS =
@@ -111,15 +112,12 @@
   return tabs.filterIsInstance(tabClass).firstOrNull()
 }
 
-private fun <C : Component> allDescendantsWithType(root: Component, type: Class<C>): List<C> {
-  return TreeWalker(root).descendants().filterIsInstance(type)
-}
-
 @RunsInEdt
 class ConnectionDataDetailsViewTest {
 
   private class TestNetworkInspectorClient : NetworkInspectorClient {
-    override suspend fun getStartTimeStampNs() = 0L
+    override suspend fun startInspection(): StartInspectionResponse =
+      StartInspectionResponse.getDefaultInstance()
 
     override suspend fun interceptResponse(command: NetworkInspectorProtocol.InterceptCommand) =
       Unit
@@ -338,10 +336,6 @@
       .inOrder()
   }
 
-  private fun assertUiContainsLabelAndValue(uiText: String, label: String, value: String) {
-    assert(uiText == "$label $value")
-  }
-
   @Test
   fun expectedDisplayNameForContentTypes() {
     assertThat(HttpDataComponentFactory.getDisplayName(HttpData.ContentType(""))).isEqualTo("")
diff --git a/app-inspection/inspectors/network/view/testSrc/com/android/tools/idea/appinspection/inspectors/network/view/details/NetworkInspectorDetailsPanelTest.kt b/app-inspection/inspectors/network/view/testSrc/com/android/tools/idea/appinspection/inspectors/network/view/details/NetworkInspectorDetailsPanelTest.kt
index 4c1b318..9a6a694 100644
--- a/app-inspection/inspectors/network/view/testSrc/com/android/tools/idea/appinspection/inspectors/network/view/details/NetworkInspectorDetailsPanelTest.kt
+++ b/app-inspection/inspectors/network/view/testSrc/com/android/tools/idea/appinspection/inspectors/network/view/details/NetworkInspectorDetailsPanelTest.kt
@@ -46,12 +46,14 @@
 import org.junit.Rule
 import org.junit.Test
 import studio.network.inspection.NetworkInspectorProtocol.InterceptCommand
+import studio.network.inspection.NetworkInspectorProtocol.StartInspectionResponse
 
 @RunsInEdt
 class NetworkInspectorDetailsPanelTest {
 
   private class TestNetworkInspectorClient : NetworkInspectorClient {
-    override suspend fun getStartTimeStampNs() = 0L
+    override suspend fun startInspection(): StartInspectionResponse =
+      StartInspectionResponse.getDefaultInstance()
 
     override suspend fun interceptResponse(command: InterceptCommand) = Unit
   }
diff --git a/app-inspection/inspectors/network/view/testSrc/com/android/tools/idea/appinspection/inspectors/network/view/details/RuleDetailsViewTest.kt b/app-inspection/inspectors/network/view/testSrc/com/android/tools/idea/appinspection/inspectors/network/view/details/RuleDetailsViewTest.kt
index 0c8c887..0ff75af 100644
--- a/app-inspection/inspectors/network/view/testSrc/com/android/tools/idea/appinspection/inspectors/network/view/details/RuleDetailsViewTest.kt
+++ b/app-inspection/inspectors/network/view/testSrc/com/android/tools/idea/appinspection/inspectors/network/view/details/RuleDetailsViewTest.kt
@@ -67,6 +67,7 @@
 import studio.network.inspection.NetworkInspectorProtocol.InterceptCommand
 import studio.network.inspection.NetworkInspectorProtocol.InterceptCriteria
 import studio.network.inspection.NetworkInspectorProtocol.MatchingText.Type
+import studio.network.inspection.NetworkInspectorProtocol.StartInspectionResponse
 
 @RunsInEdt
 class RuleDetailsViewTest {
@@ -75,7 +76,8 @@
     private var latestRegularCommand = InterceptCommand.getDefaultInstance()
     private var latestReorderCommand = InterceptCommand.getDefaultInstance()
 
-    override suspend fun getStartTimeStampNs() = 0L
+    override suspend fun startInspection(): StartInspectionResponse =
+      StartInspectionResponse.getDefaultInstance()
 
     override suspend fun interceptResponse(command: InterceptCommand) {
       if (command.hasReorderInterceptRules()) {
diff --git a/app-quality-insights/api/src/com/android/tools/idea/insights/AppInsightsModel.kt b/app-quality-insights/api/src/com/android/tools/idea/insights/AppInsightsModel.kt
index 62c60dc..83e9125 100644
--- a/app-quality-insights/api/src/com/android/tools/idea/insights/AppInsightsModel.kt
+++ b/app-quality-insights/api/src/com/android/tools/idea/insights/AppInsightsModel.kt
@@ -30,6 +30,9 @@
   /** The user is not signed in, App Insights will not work until they do. */
   object Unauthenticated : AppInsightsModel()
 
+  /** Studio failed the gradle sync at startup and AQI could not determine app names. */
+  object InitialSyncFailed : AppInsightsModel()
+
   /**
    * When the user is signed in, we pass in [AppInsightsProjectLevelController] which manages App
    * Insights state data.
diff --git a/app-quality-insights/api/src/com/android/tools/idea/insights/FailureType.kt b/app-quality-insights/api/src/com/android/tools/idea/insights/FailureType.kt
index 9bad401..edb2504 100644
--- a/app-quality-insights/api/src/com/android/tools/idea/insights/FailureType.kt
+++ b/app-quality-insights/api/src/com/android/tools/idea/insights/FailureType.kt
@@ -46,11 +46,11 @@
 fun convertSeverityList(
   fatalities: List<FailureType>
 ): AppQualityInsightsUsageEvent.AppQualityInsightsFetchDetails.SeverityFilter {
-  if (fatalities.size < 1 || fatalities.size > 2) {
+  if (fatalities.isEmpty() || fatalities.size > 3) {
     return AppQualityInsightsUsageEvent.AppQualityInsightsFetchDetails.SeverityFilter
       .UNKNOWN_SEVERITY
   }
-  if (fatalities.size == 2) {
+  if (fatalities.size == 3) {
     return AppQualityInsightsUsageEvent.AppQualityInsightsFetchDetails.SeverityFilter.ALL
   }
   return when (fatalities[0]) {
diff --git a/app-quality-insights/ide/src/com/android/tools/idea/insights/inspection/AppInsightsExternalAnnotator.kt b/app-quality-insights/ide/src/com/android/tools/idea/insights/inspection/AppInsightsExternalAnnotator.kt
index b61fdf2..59fcdba 100644
--- a/app-quality-insights/ide/src/com/android/tools/idea/insights/inspection/AppInsightsExternalAnnotator.kt
+++ b/app-quality-insights/ide/src/com/android/tools/idea/insights/inspection/AppInsightsExternalAnnotator.kt
@@ -160,13 +160,13 @@
               logger.debug("Found ${it.size} ${controller.key} insights for ${file.name}")
             }
           }
-          is AppInsightsModel.Unauthenticated -> {
+          AppInsightsModel.Unauthenticated -> {
             logger.debug(
               "Skip annotation collection for ${tabProvider.displayName} because it is unauthenticated."
             )
             emptyList()
           }
-          is AppInsightsModel.Uninitialized -> {
+          AppInsightsModel.Uninitialized -> {
             // This should only happen at project startup, when things are initializing.
             // Skip collection until the insights model is authenticated, after which the
             // framework will call to collect again and get the correct annotations.
@@ -175,6 +175,13 @@
             )
             emptyList()
           }
+          AppInsightsModel.InitialSyncFailed -> {
+            // This only happens at project startup and sync failure.
+            logger.debug(
+              "Skip annotation collection for ${tabProvider.displayName} because it initial sync failed."
+            )
+            emptyList()
+          }
         }
       }
       .flatten()
diff --git a/app-quality-insights/play-vitals/ide/src/com/android/tools/idea/vitals/ui/VitalsTabProvider.kt b/app-quality-insights/play-vitals/ide/src/com/android/tools/idea/vitals/ui/VitalsTabProvider.kt
index bcf92ba..0549d84 100644
--- a/app-quality-insights/play-vitals/ide/src/com/android/tools/idea/vitals/ui/VitalsTabProvider.kt
+++ b/app-quality-insights/play-vitals/ide/src/com/android/tools/idea/vitals/ui/VitalsTabProvider.kt
@@ -75,7 +75,7 @@
                 )
               )
             }
-            AppInsightsModel.Uninitialized -> {}
+            else -> {}
           }
         }
       }
diff --git a/build-attribution/testSrc/com/android/build/attribution/ui/view/BuildOverviewPageViewTest.kt b/build-attribution/testSrc/com/android/build/attribution/ui/view/BuildOverviewPageViewTest.kt
index bd61113..008fd2f 100644
--- a/build-attribution/testSrc/com/android/build/attribution/ui/view/BuildOverviewPageViewTest.kt
+++ b/build-attribution/testSrc/com/android/build/attribution/ui/view/BuildOverviewPageViewTest.kt
@@ -212,5 +212,8 @@
   private fun clearHtml(html: String): String = UIUtil.getHtmlBody(html)
     .trimIndent()
     .replace("\n","")
+    // java21 uses NNBSP prefix to AM/PM in time formats
+    // https://bugs.openjdk.org/browse/JDK-8284840
+    .replace("&#8239;", "\u202F")
     .replace("<br>","\n")
 }
\ No newline at end of file
diff --git a/compose-designer/src/com/android/tools/idea/compose/ComposePreviewElementsModel.kt b/compose-designer/src/com/android/tools/idea/compose/ComposePreviewElementsModel.kt
index 2ec1e7f..5b7172b 100644
--- a/compose-designer/src/com/android/tools/idea/compose/ComposePreviewElementsModel.kt
+++ b/compose-designer/src/com/android/tools/idea/compose/ComposePreviewElementsModel.kt
@@ -15,10 +15,10 @@
  */
 package com.android.tools.idea.compose
 
-import com.android.tools.idea.compose.preview.PreviewGroup
 import com.android.tools.idea.concurrency.FlowableCollection
 import com.android.tools.idea.concurrency.filter
 import com.android.tools.idea.concurrency.flatMap
+import com.android.tools.idea.preview.groups.PreviewGroup
 import com.android.tools.preview.ComposePreviewElement
 import com.android.tools.preview.ComposePreviewElementInstance
 import kotlinx.coroutines.flow.Flow
diff --git a/compose-designer/src/com/android/tools/idea/compose/UiCheckModeFilter.kt b/compose-designer/src/com/android/tools/idea/compose/UiCheckModeFilter.kt
index 93d8773..8c41f0a 100644
--- a/compose-designer/src/com/android/tools/idea/compose/UiCheckModeFilter.kt
+++ b/compose-designer/src/com/android/tools/idea/compose/UiCheckModeFilter.kt
@@ -21,11 +21,11 @@
 import com.android.tools.configurations.DEVICE_CLASS_PHONE_ID
 import com.android.tools.configurations.DEVICE_CLASS_TABLET_ID
 import com.android.tools.idea.common.model.NlModel
-import com.android.tools.idea.compose.preview.PreviewGroup
 import com.android.tools.idea.compose.preview.message
 import com.android.tools.idea.concurrency.FlowableCollection
 import com.android.tools.idea.concurrency.asCollection
 import com.android.tools.idea.flags.StudioFlags
+import com.android.tools.idea.preview.groups.PreviewGroup
 import com.android.tools.idea.uibuilder.visual.colorblindmode.ColorBlindMode
 import com.android.tools.idea.uibuilder.visual.colorblindmode.ColorConverter
 import com.android.tools.preview.ComposePreviewElementInstance
diff --git a/compose-designer/src/com/android/tools/idea/compose/preview/ComposePreviewBundle.properties b/compose-designer/src/com/android/tools/idea/compose/preview/ComposePreviewBundle.properties
index d316129..33e9d261 100644
--- a/compose-designer/src/com/android/tools/idea/compose/preview/ComposePreviewBundle.properties
+++ b/compose-designer/src/com/android/tools/idea/compose/preview/ComposePreviewBundle.properties
@@ -11,10 +11,7 @@
 action.run.description=Run this preview in isolation on the emulator or running device
 action.run.essentials.mode.description=Run Preview is not available in Compose Preview Essentials Mode
 action.run.description.test.files=Running the preview is not supported in test files
-action.group.switch.title=Switch Preview Group
 action.jump.to.definition=Jump to Definition
-action.scene.view.control.title=View Control
-action.scene.view.control.description=Control the views and layout of preview elements
 action.scene.view.control.essentials.mode.description=Some actions are not available in Compose Preview Essentials Mode
 action.scene.view.control.show.inspection.tooltip=Show Inspection Tooltips
 action.scene.view.control.start.filter.preview.mode=Filter Previews
@@ -40,7 +37,6 @@
 action.open.issues.panel.title=Open Issues Panel
 action.view.problems=View Problems
 action.zoom.to.selection=Zoom to Selection
-group.switch.all=All
 action.gallery.show.hidden=Show Hidden Tabs
 
 picker.preview.annotator.name=Preview configuration picker
diff --git a/compose-designer/src/com/android/tools/idea/compose/preview/ComposePreviewManager.kt b/compose-designer/src/com/android/tools/idea/compose/preview/ComposePreviewManager.kt
index 7a255ba..65804fe 100644
--- a/compose-designer/src/com/android/tools/idea/compose/preview/ComposePreviewManager.kt
+++ b/compose-designer/src/com/android/tools/idea/compose/preview/ComposePreviewManager.kt
@@ -16,6 +16,8 @@
 package com.android.tools.idea.compose.preview
 
 import com.android.tools.idea.concurrency.FlowableCollection
+import com.android.tools.idea.preview.groups.PreviewGroup
+import com.android.tools.idea.preview.groups.PreviewGroupManager
 import com.android.tools.idea.preview.modes.PreviewMode
 import com.android.tools.idea.preview.modes.PreviewModeManager
 import com.android.tools.preview.ComposePreviewElementInstance
@@ -27,7 +29,7 @@
 import org.jetbrains.annotations.ApiStatus
 
 /** Interface that provides access to the Compose Preview logic. */
-interface ComposePreviewManager : Disposable, PreviewModeManager {
+interface ComposePreviewManager : Disposable, PreviewModeManager, PreviewGroupManager {
 
   /**
    * Status of the preview.
@@ -54,21 +56,10 @@
 
   fun status(): Status
 
-  /**
-   * [StateFlow] of available named groups in this preview. The editor can contain multiple groups
-   * and only one will be displayed at a given time.
-   */
-  val availableGroupsFlow: StateFlow<Set<PreviewGroup.Named>>
-
   /** [StateFlow] of available elements in this preview with no filters applied. */
   val allPreviewElementsInFileFlow: StateFlow<FlowableCollection<ComposePreviewElementInstance>>
 
   /**
-   * Currently selected group from [availableGroupsFlow] or [PreviewGroup.All] if none is selected.
-   */
-  var groupFilter: PreviewGroup
-
-  /**
    * The [PsiFile] that this preview is representing, if any. For cases where the preview is
    * rendering synthetic previews or elements from multiple files, this can be null.
    */
diff --git a/compose-designer/src/com/android/tools/idea/compose/preview/ComposePreviewRefreshManager.kt b/compose-designer/src/com/android/tools/idea/compose/preview/ComposePreviewRefreshManager.kt
index c13e0eb..822c7b2 100644
--- a/compose-designer/src/com/android/tools/idea/compose/preview/ComposePreviewRefreshManager.kt
+++ b/compose-designer/src/com/android/tools/idea/compose/preview/ComposePreviewRefreshManager.kt
@@ -15,14 +15,18 @@
  */
 package com.android.tools.idea.compose.preview
 
+import com.android.tools.idea.common.surface.DesignSurface
 import com.android.tools.idea.concurrency.AndroidCoroutineScope
 import com.android.tools.idea.concurrency.wrapCompletableDeferredCollection
 import com.android.tools.idea.preview.PreviewRefreshManager
 import com.android.tools.idea.preview.PreviewRefreshRequest
 import com.android.tools.idea.preview.RefreshResult
 import com.android.tools.idea.preview.RefreshType
+import com.android.tools.idea.preview.analytics.PreviewRefreshEventBuilder
+import com.android.tools.idea.preview.analytics.PreviewRefreshTracker
 import com.android.tools.rendering.RenderAsyncActionExecutor
 import com.android.tools.rendering.RenderService
+import com.google.wireless.android.sdk.stats.PreviewRefreshEvent
 import com.intellij.openapi.Disposable
 import com.intellij.openapi.components.Service
 import com.intellij.openapi.project.Project
@@ -56,6 +60,8 @@
 /**
  * A [PreviewRefreshRequest] specific for Compose Preview.
  *
+ * @param surface the surface where the previews are located. Actually used for finding the
+ *   application id when tracking refresh metrics.
  * @param clientId see [PreviewRefreshRequest.clientId]
  * @param delegateRefresh method responsible for performing the refresh
  * @param completableDeferred optional completable that will be completed once the refresh is
@@ -67,6 +73,7 @@
  * @param requestId identifier used for testing and logging/debugging.
  */
 class ComposePreviewRefreshRequest(
+  surface: DesignSurface<*>?,
   override val clientId: String,
   private val delegateRefresh: (ComposePreviewRefreshRequest) -> Job,
   private var completableDeferred: CompletableDeferred<Unit>?,
@@ -74,6 +81,12 @@
   val requestId: String = UUID.randomUUID().toString().substring(0, 5),
 ) : PreviewRefreshRequest {
 
+  override val refreshEventBuilder =
+    PreviewRefreshEventBuilder(
+      PreviewRefreshEvent.PreviewType.COMPOSE,
+      PreviewRefreshTracker.getInstance(surface),
+    )
+
   var requestSources: List<Throwable> = listOf(Throwable())
     private set
 
diff --git a/compose-designer/src/com/android/tools/idea/compose/preview/ComposePreviewRepresentationProvider.kt b/compose-designer/src/com/android/tools/idea/compose/preview/ComposePreviewRepresentationProvider.kt
index b2840da..0ec7ddd 100644
--- a/compose-designer/src/com/android/tools/idea/compose/preview/ComposePreviewRepresentationProvider.kt
+++ b/compose-designer/src/com/android/tools/idea/compose/preview/ComposePreviewRepresentationProvider.kt
@@ -26,7 +26,6 @@
 import com.android.tools.idea.compose.preview.actions.ComposeNotificationGroup
 import com.android.tools.idea.compose.preview.actions.ComposeViewControlAction
 import com.android.tools.idea.compose.preview.actions.ComposeViewSingleWordFilter
-import com.android.tools.idea.compose.preview.actions.GroupSwitchAction
 import com.android.tools.idea.compose.preview.actions.ShowDebugBoundaries
 import com.android.tools.idea.compose.preview.actions.StopUiCheckPreviewAction
 import com.android.tools.idea.compose.preview.actions.UiCheckDropDownAction
@@ -36,28 +35,27 @@
 import com.android.tools.idea.concurrency.asCollection
 import com.android.tools.idea.editors.sourcecode.isKotlinFileType
 import com.android.tools.idea.flags.StudioFlags
+import com.android.tools.idea.preview.actions.GroupSwitchAction
 import com.android.tools.idea.preview.actions.StopAnimationInspectorAction
 import com.android.tools.idea.preview.actions.StopInteractivePreviewAction
+import com.android.tools.idea.preview.actions.findPreviewManager
 import com.android.tools.idea.preview.actions.visibleOnlyInStaticPreview
 import com.android.tools.idea.preview.modes.PREVIEW_LAYOUT_GALLERY_OPTION
 import com.android.tools.idea.preview.modes.PreviewMode
 import com.android.tools.idea.preview.representation.CommonRepresentationEditorFileType
 import com.android.tools.idea.preview.representation.InMemoryLayoutVirtualFile
 import com.android.tools.idea.projectsystem.getModuleSystem
-import com.android.tools.idea.uibuilder.editor.multirepresentation.MultiRepresentationPreview
 import com.android.tools.idea.uibuilder.editor.multirepresentation.PreferredVisibility
 import com.android.tools.idea.uibuilder.editor.multirepresentation.PreferredVisibility.FULL
 import com.android.tools.idea.uibuilder.editor.multirepresentation.PreferredVisibility.HIDDEN
 import com.android.tools.idea.uibuilder.editor.multirepresentation.PreferredVisibility.SPLIT
 import com.android.tools.idea.uibuilder.editor.multirepresentation.PreviewRepresentationProvider
-import com.android.tools.idea.uibuilder.editor.multirepresentation.TextEditorWithMultiRepresentationPreview
 import com.android.tools.idea.uibuilder.surface.LayoutManagerSwitcher
 import com.android.tools.preview.ComposePreviewElementInstance
 import com.google.wireless.android.sdk.stats.LayoutEditorState
 import com.intellij.openapi.actionSystem.ActionGroup
 import com.intellij.openapi.actionSystem.ActionUpdateThread
 import com.intellij.openapi.actionSystem.AnActionEvent
-import com.intellij.openapi.actionSystem.CommonDataKeys
 import com.intellij.openapi.actionSystem.DataContext
 import com.intellij.openapi.actionSystem.DataKey
 import com.intellij.openapi.actionSystem.DefaultActionGroup
@@ -66,8 +64,6 @@
 import com.intellij.openapi.application.readAction
 import com.intellij.openapi.diagnostic.debug
 import com.intellij.openapi.diagnostic.thisLogger
-import com.intellij.openapi.fileEditor.FileEditor
-import com.intellij.openapi.fileEditor.FileEditorManager
 import com.intellij.openapi.project.Project
 import com.intellij.openapi.roots.ProjectRootManager
 import com.intellij.openapi.vfs.VirtualFile
@@ -92,7 +88,13 @@
           ComposeFilterTextAction(ComposeViewSingleWordFilter())
         },
         // TODO(b/292057010) Enable group filtering for Gallery mode.
-        GroupSwitchAction().visibleOnlyInComposeDefaultPreview(),
+        GroupSwitchAction(
+            isEnabled = { !isPreviewRefreshing(it.dataContext) },
+            isVisible = {
+              it.dataContext.findPreviewManager(COMPOSE_PREVIEW_MANAGER)?.isFilterEnabled != true
+            },
+          )
+          .visibleOnlyInComposeDefaultPreview(),
         ComposeViewControlAction(
             layoutManagers = PREVIEW_LAYOUT_MANAGER_OPTIONS,
             isSurfaceLayoutActionEnabled = {
@@ -106,7 +108,11 @@
                 // TODO (b/292057010) If group filtering is enabled - first element in this group
                 // should be selected.
                 val element =
-                  manager.allPreviewElementsInFileFlow.value.asCollection().firstOrNull()
+                  (manager as? ComposePreviewManager)
+                    ?.allPreviewElementsInFileFlow
+                    ?.value
+                    ?.asCollection()
+                    ?.firstOrNull()
                 manager.setMode(PreviewMode.Gallery(element))
               } else if (manager.mode.value is PreviewMode.Gallery) {
                 // When switching from Gallery mode to Default layout mode - need to set back
@@ -227,32 +233,11 @@
 @TestOnly fun getComposePreviewManagerKeyForTests() = COMPOSE_PREVIEW_MANAGER
 
 /**
- * Returns a [ComposePreviewManager] related to the current context (which is implied to be bound to
- * a particular file), or null if one is not found. The search is done among the open preview parts
- * and `PreviewRepresentation` of the selected file editor.
- *
- * This call might access the [CommonDataKeys.VIRTUAL_FILE] so it should not be called in the EDT
- * thread. For actions using it, they should use [ActionUpdateThread.BGT].
- */
-internal fun findComposePreviewManagerForContext(context: DataContext): ComposePreviewManager? {
-  context.getData(COMPOSE_PREVIEW_MANAGER)?.let {
-    // The context is associated to a ComposePreviewManager so return it
-    return it
-  }
-
-  // Fallback to finding the ComposePreviewManager by looking into the selected editor
-  val project = context.getData(CommonDataKeys.PROJECT) ?: return null
-  val file = context.getData(CommonDataKeys.VIRTUAL_FILE) ?: return null
-
-  return FileEditorManager.getInstance(project)?.getSelectedEditor(file)?.getComposePreviewManager()
-}
-
-/**
  * Returns whether the [ComposePreviewManager] corresponding to the given [DataContext] is currently
  * refreshing.
  */
 internal fun isPreviewRefreshing(context: DataContext) =
-  findComposePreviewManagerForContext(context)?.status()?.isRefreshing == true
+  context.findPreviewManager(COMPOSE_PREVIEW_MANAGER)?.status()?.isRefreshing == true
 
 /** Returns whether the filter of preview is enabled. */
 internal fun isPreviewFilterEnabled(context: DataContext): Boolean {
@@ -266,12 +251,3 @@
     EditorMode.DESIGN -> FULL
     null -> defaultValue
   }
-
-/** Returns the [ComposePreviewManager] or null if this [FileEditor] is not a Compose preview. */
-fun FileEditor.getComposePreviewManager(): ComposePreviewManager? =
-  when (this) {
-    is MultiRepresentationPreview -> this.currentRepresentation as? ComposePreviewManager
-    is TextEditorWithMultiRepresentationPreview<out MultiRepresentationPreview> ->
-      this.preview.currentRepresentation as? ComposePreviewManager
-    else -> null
-  }
diff --git a/compose-designer/src/com/android/tools/idea/compose/preview/ComposePreviewTroubleInfoCollector.kt b/compose-designer/src/com/android/tools/idea/compose/preview/ComposePreviewTroubleInfoCollector.kt
index ee648c4..4b365a1 100644
--- a/compose-designer/src/com/android/tools/idea/compose/preview/ComposePreviewTroubleInfoCollector.kt
+++ b/compose-designer/src/com/android/tools/idea/compose/preview/ComposePreviewTroubleInfoCollector.kt
@@ -16,12 +16,13 @@
 package com.android.tools.idea.compose.preview
 
 import com.android.tools.idea.compose.preview.essentials.ComposePreviewEssentialsModeManager
+import com.android.tools.idea.preview.actions.getPreviewManager
 import com.intellij.openapi.fileEditor.FileEditorManager
 import com.intellij.openapi.project.Project
 import com.intellij.troubleshooting.TroubleInfoCollector
 
 private fun findAllComposePreviewManagers(project: Project): Collection<ComposePreviewManager> =
-  FileEditorManager.getInstance(project)?.allEditors?.mapNotNull { it.getComposePreviewManager() }
+  FileEditorManager.getInstance(project)?.allEditors?.mapNotNull { it.getPreviewManager() }
     ?: emptyList()
 
 private fun collectComposePreviewManagerInfo(project: Project): String =
diff --git a/compose-designer/src/com/android/tools/idea/compose/preview/ComposeVisualLintIssueProvider.kt b/compose-designer/src/com/android/tools/idea/compose/preview/ComposeVisualLintIssueProvider.kt
index 09aef76..6b7f86d 100644
--- a/compose-designer/src/com/android/tools/idea/compose/preview/ComposeVisualLintIssueProvider.kt
+++ b/compose-designer/src/com/android/tools/idea/compose/preview/ComposeVisualLintIssueProvider.kt
@@ -16,7 +16,6 @@
 package com.android.tools.idea.compose.preview
 
 import com.android.tools.idea.common.error.Issue
-import com.android.tools.idea.common.model.NlModel
 import com.android.tools.idea.compose.pickers.preview.utils.addNewValueArgument
 import com.android.tools.idea.compose.preview.util.previewElement
 import com.android.tools.idea.kotlin.fqNameMatches
@@ -30,7 +29,9 @@
 import com.intellij.openapi.Disposable
 import com.intellij.openapi.application.runReadAction
 import com.intellij.openapi.command.WriteCommandAction
+import com.intellij.openapi.project.Project
 import com.intellij.psi.util.parentOfType
+import org.jetbrains.android.facet.AndroidFacet
 import org.jetbrains.kotlin.idea.base.codeInsight.ShortenReferencesFacility
 import org.jetbrains.kotlin.psi.KtAnnotationEntry
 import org.jetbrains.kotlin.psi.KtFunction
@@ -40,6 +41,16 @@
 class ComposeVisualLintIssueProvider(parentDisposable: Disposable) :
   VisualLintIssueProvider(parentDisposable) {
 
+  fun onUiCheckStart(instanceId: String) {
+    uiCheckInstanceId = instanceId
+    getIssues().forEach { it.unfreeze() }
+  }
+
+  fun onUiCheckStop() {
+    uiCheckInstanceId = null
+    getIssues().forEach { it.freeze() }
+  }
+
   override fun customizeIssue(issue: VisualLintRenderIssue) {
     val model = issue.models.firstOrNull() ?: return
     val previewElement = model.dataContext.previewElement() ?: return
@@ -67,10 +78,15 @@
       Issue.Suppress(
         message("ui.check.mode.suppress.action.title"),
         message("ui.check.mode.suppress.action.description", issue.type),
-        ComposeVisualLintSuppressTask(model, previewElement, issue.type),
+        ComposeVisualLintSuppressTask(model.facet, model.project, previewElement, issue.type),
       )
     )
   }
+
+  override fun dispose() {
+    super.dispose()
+    onUiCheckStop()
+  }
 }
 
 /**
@@ -79,16 +95,17 @@
  * argument to the annotation.
  */
 class ComposeVisualLintSuppressTask(
-  private val model: NlModel,
+  private val facet: AndroidFacet,
+  private val project: Project,
   private val previewElement: ComposePreviewElement,
   private val issueType: VisualLintErrorType,
 ) : VisualLintSuppressTask {
 
   override fun run() {
     VisualLintUsageTracker.getInstance()
-      .trackIssueIgnored(issueType, VisualLintOrigin.UI_CHECK, model.facet)
+      .trackIssueIgnored(issueType, VisualLintOrigin.UI_CHECK, facet)
     WriteCommandAction.runWriteCommandAction(
-      model.project,
+      project,
       issueType.toSuppressActionDescription(),
       null,
       {
@@ -99,12 +116,12 @@
             composableFunction.annotationEntries.find { it.fqNameMatches("kotlin.Suppress") }
           if (suppress != null) {
             suppress.addNewValueArgument(
-              KtPsiFactory(model.project).createArgument("\"${issueType.ignoredAttributeValue}\""),
-              KtPsiFactory(model.project),
+              KtPsiFactory(project).createArgument("\"${issueType.ignoredAttributeValue}\""),
+              KtPsiFactory(project),
             )
           } else {
             suppress =
-              KtPsiFactory(model.project)
+              KtPsiFactory(project)
                 .createAnnotationEntry("@kotlin.Suppress(\"${issueType.ignoredAttributeValue}\")")
             ShortenReferencesFacility.getInstance()
               .shorten(composableFunction.addAnnotationEntry(suppress))
diff --git a/compose-designer/src/com/android/tools/idea/compose/preview/Preview.kt b/compose-designer/src/com/android/tools/idea/compose/preview/Preview.kt
index 50f9c70..228e53f 100644
--- a/compose-designer/src/com/android/tools/idea/compose/preview/Preview.kt
+++ b/compose-designer/src/com/android/tools/idea/compose/preview/Preview.kt
@@ -62,6 +62,8 @@
 import com.android.tools.idea.preview.SimpleRenderQualityManager
 import com.android.tools.idea.preview.actions.BuildAndRefresh
 import com.android.tools.idea.preview.getDefaultPreviewQuality
+import com.android.tools.idea.preview.groups.PreviewGroup
+import com.android.tools.idea.preview.groups.PreviewGroupManager
 import com.android.tools.idea.preview.interactive.InteractivePreviewManager
 import com.android.tools.idea.preview.interactive.analytics.InteractivePreviewUsageTracker
 import com.android.tools.idea.preview.lifecycle.PreviewLifecycleManager
@@ -180,7 +182,8 @@
   override fun getData(dataId: String): Any? =
     when (dataId) {
       COMPOSE_PREVIEW_MANAGER.name,
-      PreviewModeManager.KEY.name -> composePreviewManager
+      PreviewModeManager.KEY.name,
+      PreviewGroupManager.KEY.name -> composePreviewManager
       COMPOSE_PREVIEW_ELEMENT_INSTANCE.name,
       PREVIEW_ELEMENT_INSTANCE.name -> previewElement
       CommonDataKeys.PROJECT.name -> project
@@ -640,20 +643,18 @@
   fun createUiCheckTab(instance: ComposePreviewElementInstance) {
     val uiCheckIssuePanel = UiCheckPanelProvider(instance, psiFilePointer).getPanel()
     uiCheckIssuePanel.issueProvider.registerUpdateListener(postIssueUpdateListenerForUiCheck)
+    uiCheckIssuePanel.issueProvider.activate()
     uiCheckIssuePanel.addIssueSelectionListener(surface.issueListener, surface)
-    surface.visualLintIssueProvider.uiCheckInstanceId = instance.instanceId
+    (surface.visualLintIssueProvider as? ComposeVisualLintIssueProvider)?.onUiCheckStart(
+      instance.instanceId
+    )
   }
 
   private suspend fun onUiCheckPreviewStop() {
     qualityManager.resume()
     postIssueUpdateListenerForUiCheck.deactivate()
-    uiCheckFilterFlow.value.basePreviewInstance?.let {
-      val panel =
-        ProblemsViewToolWindowUtils.getTabById(project, it.instanceId) as? DesignerCommonIssuePanel
-      panel?.removeIssueSelectionListener(surface.issueListener)
-      panel?.issueProvider?.removeUpdateListener(postIssueUpdateListenerForUiCheck)
-      surface.visualLintIssueProvider.uiCheckInstanceId = null
-    }
+    uiCheckFilterFlow.value.basePreviewInstance?.let { uiCheckPanelCleanup(it.instanceId) }
+    (surface.visualLintIssueProvider as? ComposeVisualLintIssueProvider)?.onUiCheckStop()
     uiCheckFilterFlow.value = UiCheckModeFilter.Disabled
     withContext(uiThread) {
       surface.layeredPane.remove(emptyUiCheckPanel)
@@ -661,6 +662,14 @@
     }
   }
 
+  private fun uiCheckPanelCleanup(instanceId: String) {
+    val panel =
+      ProblemsViewToolWindowUtils.getTabById(project, instanceId) as? DesignerCommonIssuePanel
+    panel?.removeIssueSelectionListener(surface.issueListener)
+    panel?.issueProvider?.removeUpdateListener(postIssueUpdateListenerForUiCheck)
+    panel?.issueProvider?.deactivate()
+  }
+
   private fun onInteractivePreviewStop() {
     requestVisibilityAndNotificationsUpdate()
     interactiveManager.stop()
@@ -694,7 +703,8 @@
   private val dataProvider = DataProvider {
     when (it) {
       COMPOSE_PREVIEW_MANAGER.name,
-      PreviewModeManager.KEY.name -> this@ComposePreviewRepresentation
+      PreviewModeManager.KEY.name,
+      PreviewGroupManager.KEY.name -> this@ComposePreviewRepresentation
       PlatformCoreDataKeys.BGT_DATA_PROVIDER.name -> DataProvider { slowId -> getSlowData(slowId) }
       CommonDataKeys.PROJECT.name -> project
       else -> null
@@ -950,6 +960,8 @@
     isDisposed.set(true)
     if (mode.value is PreviewMode.Interactive) {
       interactiveManager.stop()
+    } else if (mode.value is PreviewMode.UiCheck) {
+      uiCheckFilterFlow.value.basePreviewInstance?.let { uiCheckPanelCleanup(it.instanceId) }
     }
   }
 
@@ -1163,7 +1175,13 @@
     }
 
     refreshManager.requestRefresh(
-      ComposePreviewRefreshRequest(this.hashCode().toString(), ::refresh, completableDeferred, type)
+      ComposePreviewRefreshRequest(
+        surface,
+        this.hashCode().toString(),
+        ::refresh,
+        completableDeferred,
+        type,
+      )
     )
   }
 
@@ -1457,7 +1475,7 @@
 
   private suspend fun requestFastPreviewRefreshAndTrack(): CompilationResult {
     val previewFile =
-      psiFilePointer.element
+      readAction { psiFilePointer.element }
         ?: return CompilationResult.RequestException(
           IllegalStateException("Preview File is no valid")
         )
diff --git a/compose-designer/src/com/android/tools/idea/compose/preview/PreviewElementFinderUtils.kt b/compose-designer/src/com/android/tools/idea/compose/preview/PreviewElementFinderUtils.kt
index f3db3be..bd8c81d 100644
--- a/compose-designer/src/com/android/tools/idea/compose/preview/PreviewElementFinderUtils.kt
+++ b/compose-designer/src/com/android/tools/idea/compose/preview/PreviewElementFinderUtils.kt
@@ -33,7 +33,9 @@
 import com.google.wireless.android.sdk.stats.ComposeMultiPreviewEvent
 import com.intellij.openapi.application.ReadAction
 import com.intellij.openapi.application.runReadAction
+import com.intellij.openapi.util.ThrowableComputable
 import com.intellij.psi.PsiClass
+import com.intellij.util.SlowOperations
 import com.intellij.util.containers.sequenceOfNotNull
 import org.jetbrains.uast.UAnnotation
 import org.jetbrains.uast.UMethod
@@ -73,7 +75,9 @@
  * indirect annotations with MultiPreview when the flag is enabled
  */
 internal fun UMethod?.hasPreviewElements() =
-  this?.let { getPreviewElements(it).firstOrNull() } != null
+  SlowOperations.allowSlowOperations(
+    ThrowableComputable { this?.let { getPreviewElements(it).firstOrNull() } != null }
+  )
 
 /**
  * Returns true if this is not a Preview annotation, but a MultiPreview annotation, i.e. an
@@ -88,7 +92,7 @@
  * Given a Composable method, return a sequence of [ComposePreviewElement] corresponding to its
  * Preview annotations
  */
-internal fun getPreviewElements(uMethod: UMethod, overrideGroupName: String? = null) =
+private fun getPreviewElements(uMethod: UMethod, overrideGroupName: String? = null) =
   getPreviewNodes(uMethod, overrideGroupName, false).mapNotNull { it as? ComposePreviewElement }
 
 /**
diff --git a/compose-designer/src/com/android/tools/idea/compose/preview/actions/ComposeViewControlAction.kt b/compose-designer/src/com/android/tools/idea/compose/preview/actions/ComposeViewControlAction.kt
index 89d1ec4..f227df3 100644
--- a/compose-designer/src/com/android/tools/idea/compose/preview/actions/ComposeViewControlAction.kt
+++ b/compose-designer/src/com/android/tools/idea/compose/preview/actions/ComposeViewControlAction.kt
@@ -15,40 +15,33 @@
  */
 package com.android.tools.idea.compose.preview.actions
 
-import com.android.tools.adtui.actions.DropDownAction
 import com.android.tools.adtui.actions.ZoomActualAction
 import com.android.tools.adtui.actions.ZoomInAction
 import com.android.tools.adtui.actions.ZoomOutAction
-import com.android.tools.idea.compose.preview.ComposePreviewManager
-import com.android.tools.idea.compose.preview.analytics.PreviewCanvasTracker
 import com.android.tools.idea.compose.preview.essentials.ComposePreviewEssentialsModeManager
 import com.android.tools.idea.compose.preview.isPreviewFilterEnabled
 import com.android.tools.idea.compose.preview.isPreviewRefreshing
 import com.android.tools.idea.compose.preview.message
 import com.android.tools.idea.flags.StudioFlags
+import com.android.tools.idea.preview.actions.SwitchSurfaceLayoutManagerAction
+import com.android.tools.idea.preview.actions.ViewControlAction
+import com.android.tools.idea.preview.analytics.PreviewCanvasTracker
+import com.android.tools.idea.preview.modes.PreviewModeManager
 import com.android.tools.idea.preview.modes.SurfaceLayoutManagerOption
-import com.intellij.icons.AllIcons
 import com.intellij.openapi.actionSystem.ActionUpdateThread
 import com.intellij.openapi.actionSystem.AnAction
 import com.intellij.openapi.actionSystem.AnActionEvent
-import com.intellij.ui.icons.copyIcon
 
-// When using [AllIcons.Debugger.RestoreLayout] as the icon, this action is considered as a
-// multi-choice group, even
-// Presentation.setMultiChoice() sets to false. (See
-// [com.intellij.openapi.actionSystem.impl.Utils.isMultiChoiceGroup])
-//
-// We clone the icon here so we can control the multi-choice state of this action ourselves.
 class ComposeViewControlAction(
   layoutManagers: List<SurfaceLayoutManagerOption>,
   isSurfaceLayoutActionEnabled: (AnActionEvent) -> Boolean = { true },
-  updateMode: (SurfaceLayoutManagerOption, ComposePreviewManager) -> Unit,
+  updateMode: (SurfaceLayoutManagerOption, PreviewModeManager) -> Unit,
   additionalActionProvider: AnAction? = null,
 ) :
-  DropDownAction(
-    message("action.scene.view.control.title"),
-    message("action.scene.view.control.description"),
-    copyIcon(AllIcons.Debugger.RestoreLayout, null, true),
+  ViewControlAction(
+    isEnabled = { !isPreviewRefreshing(it.dataContext) },
+    isEssentialsModeEnabled = { ComposePreviewEssentialsModeManager.isEssentialsModeEnabled },
+    essentialModeDescription = message("action.scene.view.control.essentials.mode.description"),
   ) {
   init {
     if (
@@ -87,17 +80,9 @@
 
   override fun update(e: AnActionEvent) {
     super.update(e)
-    e.presentation.isEnabled = !isPreviewRefreshing(e.dataContext)
     e.presentation.isVisible = !isPreviewFilterEnabled(e.dataContext)
-    e.presentation.description =
-      if (ComposePreviewEssentialsModeManager.isEssentialsModeEnabled)
-        message("action.scene.view.control.essentials.mode.description")
-      else message("action.scene.view.control.description")
   }
 
-  // Actions calling isAnyPreviewRefreshing in the update method, must run in BGT
-  override fun getActionUpdateThread(): ActionUpdateThread = ActionUpdateThread.BGT
-
   /**
    * Zoom actions have the icons, which we don't want to display in [ComposeViewControlAction]. We
    * also want to change the display text of the zoom action. (E.g. The text of [ZoomActualAction]
diff --git a/compose-designer/src/com/android/tools/idea/compose/preview/actions/DebugBoundariesAction.kt b/compose-designer/src/com/android/tools/idea/compose/preview/actions/DebugBoundariesAction.kt
index 8c6a437..4b06a5a 100644
--- a/compose-designer/src/com/android/tools/idea/compose/preview/actions/DebugBoundariesAction.kt
+++ b/compose-designer/src/com/android/tools/idea/compose/preview/actions/DebugBoundariesAction.kt
@@ -15,8 +15,9 @@
  */
 package com.android.tools.idea.compose.preview.actions
 
+import com.android.tools.idea.compose.preview.COMPOSE_PREVIEW_MANAGER
 import com.android.tools.idea.compose.preview.ComposePreviewManagerEx
-import com.android.tools.idea.compose.preview.findComposePreviewManagerForContext
+import com.android.tools.idea.preview.actions.findPreviewManager
 import com.intellij.openapi.actionSystem.AnActionEvent
 import com.intellij.openapi.actionSystem.ToggleAction
 
@@ -27,11 +28,11 @@
 internal class ShowDebugBoundaries : ToggleAction("$SHOW Composable Bounds", null, null) {
 
   override fun isSelected(e: AnActionEvent): Boolean =
-    (findComposePreviewManagerForContext(e.dataContext) as? ComposePreviewManagerEx)
+    (e.dataContext.findPreviewManager(COMPOSE_PREVIEW_MANAGER) as? ComposePreviewManagerEx)
       ?.showDebugBoundaries == true
 
   override fun setSelected(e: AnActionEvent, isSelected: Boolean) {
-    (findComposePreviewManagerForContext(e.dataContext) as? ComposePreviewManagerEx)
+    (e.dataContext.findPreviewManager(COMPOSE_PREVIEW_MANAGER) as? ComposePreviewManagerEx)
       ?.showDebugBoundaries = isSelected
   }
 
diff --git a/compose-designer/src/com/android/tools/idea/compose/preview/actions/PreviewIssueNotificationAction.kt b/compose-designer/src/com/android/tools/idea/compose/preview/actions/PreviewIssueNotificationAction.kt
index c0a59f1..0eb0e19 100644
--- a/compose-designer/src/com/android/tools/idea/compose/preview/actions/PreviewIssueNotificationAction.kt
+++ b/compose-designer/src/com/android/tools/idea/compose/preview/actions/PreviewIssueNotificationAction.kt
@@ -25,7 +25,6 @@
 import com.android.tools.idea.common.surface.DesignSurface
 import com.android.tools.idea.compose.preview.COMPOSE_PREVIEW_MANAGER
 import com.android.tools.idea.compose.preview.ComposePreviewManager
-import com.android.tools.idea.compose.preview.findComposePreviewManagerForContext
 import com.android.tools.idea.compose.preview.isPreviewFilterEnabled
 import com.android.tools.idea.compose.preview.message
 import com.android.tools.idea.editors.fast.fastPreviewManager
@@ -37,6 +36,7 @@
 import com.android.tools.idea.preview.actions.ReEnableFastPreview
 import com.android.tools.idea.preview.actions.ShowEventLogAction
 import com.android.tools.idea.preview.actions.ShowProblemsPanel
+import com.android.tools.idea.preview.actions.findPreviewManager
 import com.android.tools.idea.projectsystem.needsBuild
 import com.android.tools.idea.projectsystem.requestBuild
 import com.intellij.ide.DataManager
@@ -302,7 +302,7 @@
 
     // The ComposePreviewManager will avoid refreshing its corresponding preview if it detects
     // that nothing has changed. But we want to always force a refresh when this button is pressed.
-    findComposePreviewManagerForContext(e.dataContext)?.invalidate()
+    e.dataContext.findPreviewManager(COMPOSE_PREVIEW_MANAGER)?.invalidate()
 
     if (!requestBuildForSurface(surface)) {
       // If there are no models in the surface, we can not infer which models we should trigger
@@ -314,7 +314,7 @@
   override fun update(e: AnActionEvent) {
     val presentation = e.presentation
     val isRefreshing =
-      findComposePreviewManagerForContext(e.dataContext)?.let {
+      e.dataContext.findPreviewManager(COMPOSE_PREVIEW_MANAGER)?.let {
         e.updateSession.compute(this, "Check Preview Status", ActionUpdateThread.EDT) {
           it.status().isRefreshing
         }
diff --git a/compose-designer/src/com/android/tools/idea/compose/preview/actions/ReRunUiCheckModeAction.kt b/compose-designer/src/com/android/tools/idea/compose/preview/actions/ReRunUiCheckModeAction.kt
index d8c9dc6..009e6e2 100644
--- a/compose-designer/src/com/android/tools/idea/compose/preview/actions/ReRunUiCheckModeAction.kt
+++ b/compose-designer/src/com/android/tools/idea/compose/preview/actions/ReRunUiCheckModeAction.kt
@@ -18,10 +18,11 @@
 import com.android.tools.idea.common.editor.SplitEditor
 import com.android.tools.idea.common.error.DESIGNER_COMMON_ISSUE_PANEL
 import com.android.tools.idea.common.error.DesignToolsIssueProvider
-import com.android.tools.idea.compose.preview.getComposePreviewManager
+import com.android.tools.idea.compose.preview.ComposePreviewManager
 import com.android.tools.idea.compose.preview.uicheck.TAB_VIRTUAL_FILE
 import com.android.tools.idea.concurrency.AndroidCoroutineScope
 import com.android.tools.idea.concurrency.asCollection
+import com.android.tools.idea.preview.actions.getPreviewManager
 import com.android.tools.idea.preview.modes.PreviewMode
 import com.intellij.analysis.problemsView.toolWindow.ProblemsView
 import com.intellij.openapi.actionSystem.ActionUpdateThread
@@ -52,7 +53,7 @@
     val editors = FileEditorManager.getInstance(project).getAllEditors(file)
     val isUiCheckRunning =
       editors
-        .mapNotNull { it.getComposePreviewManager() }
+        .mapNotNull { it.getPreviewManager<ComposePreviewManager>() }
         .any { it.mode.value is PreviewMode.UiCheck }
     e.presentation.isVisible = true
     e.presentation.isEnabled = !isUiCheckRunning
@@ -72,12 +73,12 @@
     val editors = FileEditorManager.getInstance(project).openFile(file, true, true)
     val relevantEditor =
       editors.filterIsInstance<SplitEditor<*>>().firstOrNull {
-        it.getComposePreviewManager() != null
+        it.getPreviewManager<ComposePreviewManager>() != null
       } ?: return
     if (relevantEditor.isTextMode()) {
       relevantEditor.selectSplitMode(false)
     }
-    val manager = relevantEditor.getComposePreviewManager() ?: return
+    val manager = relevantEditor.getPreviewManager<ComposePreviewManager>() ?: return
     AndroidCoroutineScope(manager).launch {
       manager.allPreviewElementsInFileFlow.collectLatest { flow ->
         flow
diff --git a/compose-designer/src/com/android/tools/idea/compose/preview/actions/StopUiCheckPreviewAction.kt b/compose-designer/src/com/android/tools/idea/compose/preview/actions/StopUiCheckPreviewAction.kt
index cc4e062..f3c8e76 100644
--- a/compose-designer/src/com/android/tools/idea/compose/preview/actions/StopUiCheckPreviewAction.kt
+++ b/compose-designer/src/com/android/tools/idea/compose/preview/actions/StopUiCheckPreviewAction.kt
@@ -15,8 +15,9 @@
  */
 package com.android.tools.idea.compose.preview.actions
 
-import com.android.tools.idea.compose.preview.findComposePreviewManagerForContext
+import com.android.tools.idea.compose.preview.COMPOSE_PREVIEW_MANAGER
 import com.android.tools.idea.compose.preview.message
+import com.android.tools.idea.preview.actions.findPreviewManager
 import com.android.tools.idea.preview.actions.navigateBack
 import com.android.tools.idea.preview.modes.PreviewMode
 import com.intellij.openapi.actionSystem.ActionUpdateThread
@@ -33,9 +34,9 @@
   override fun displayTextInToolbar(): Boolean = true
 
   override fun updateButton(e: AnActionEvent) {
-    val composePreviewManagers = findComposePreviewManagerForContext(e.dataContext)
-    e.presentation.isEnabled = composePreviewManagers?.status()?.isRefreshing != true
-    e.presentation.isVisible = composePreviewManagers?.mode?.value is PreviewMode.UiCheck
+    val composePreviewManager = e.dataContext.findPreviewManager(COMPOSE_PREVIEW_MANAGER)
+    e.presentation.isEnabled = composePreviewManager?.status()?.isRefreshing != true
+    e.presentation.isVisible = composePreviewManager?.mode?.value is PreviewMode.UiCheck
   }
 
   override fun actionPerformed(e: AnActionEvent) {
diff --git a/compose-designer/src/com/android/tools/idea/compose/preview/actions/ToggleFastPreviewAction.kt b/compose-designer/src/com/android/tools/idea/compose/preview/actions/ToggleFastPreviewAction.kt
index 7a325ae..49aa5e4 100644
--- a/compose-designer/src/com/android/tools/idea/compose/preview/actions/ToggleFastPreviewAction.kt
+++ b/compose-designer/src/com/android/tools/idea/compose/preview/actions/ToggleFastPreviewAction.kt
@@ -15,12 +15,13 @@
  */
 package com.android.tools.idea.compose.preview.actions
 
+import com.android.tools.idea.compose.preview.COMPOSE_PREVIEW_MANAGER
 import com.android.tools.idea.compose.preview.essentials.ComposePreviewEssentialsModeManager
 import com.android.tools.idea.compose.preview.fast.FastPreviewSurface
-import com.android.tools.idea.compose.preview.findComposePreviewManagerForContext
 import com.android.tools.idea.compose.preview.message
 import com.android.tools.idea.editors.fast.ManualDisabledReason
 import com.android.tools.idea.editors.fast.fastPreviewManager
+import com.android.tools.idea.preview.actions.findPreviewManager
 import com.intellij.openapi.actionSystem.ActionUpdateThread
 import com.intellij.openapi.actionSystem.AnAction
 import com.intellij.openapi.actionSystem.AnActionEvent
@@ -28,8 +29,7 @@
 
 /** Action that toggles the Fast Preview state. */
 class ToggleFastPreviewAction : AnAction(null, null, null) {
-  // BGT is needed when calling findComposePreviewManagersForContext because it accesses the
-  // VirtualFile
+  /** BGT is needed when calling [findPreviewManager] because it accesses the VirtualFile */
   override fun getActionUpdateThread() = ActionUpdateThread.BGT
 
   override fun actionPerformed(e: AnActionEvent) {
@@ -40,7 +40,7 @@
       fastPreviewManager.enable()
 
       // Automatically refresh when re-enabling
-      (findComposePreviewManagerForContext(e.dataContext) as? FastPreviewSurface)
+      (e.dataContext.findPreviewManager(COMPOSE_PREVIEW_MANAGER) as? FastPreviewSurface)
         ?.requestFastPreviewRefreshAsync()
     } else fastPreviewManager.disable(ManualDisabledReason)
     // We have changed the state of Fast Preview, update notifications
diff --git a/compose-designer/src/com/android/tools/idea/compose/preview/animation/AnimationPreview.kt b/compose-designer/src/com/android/tools/idea/compose/preview/animation/AnimationPreview.kt
index 50d6ec2..704362e 100644
--- a/compose-designer/src/com/android/tools/idea/compose/preview/animation/AnimationPreview.kt
+++ b/compose-designer/src/com/android/tools/idea/compose/preview/animation/AnimationPreview.kt
@@ -61,6 +61,7 @@
 import javax.swing.LayoutFocusTraversalPolicy
 import javax.swing.border.MatteBorder
 import kotlin.math.max
+import org.jetbrains.kotlin.utils.findIsInstanceAnd
 
 private val LOG = Logger.getInstance(AnimationPreview::class.java)
 
@@ -118,28 +119,24 @@
 
   private inner class TabChangeListener : TabsListener {
     override fun selectionChanged(oldSelection: TabInfo?, newSelection: TabInfo?) {
+      if (newSelection == oldSelection) return
+
       val component = tabbedPane.selectedInfo?.component ?: return
       // If single supported animation tab is selected.
       // We assume here only supported animations could be opened.
-      animations
-        .find { it is SupportedAnimationManager && it.tabComponent == component }
-        ?.let { tab ->
-          if (tab !is SupportedAnimationManager) return@let
-          if (newSelection == oldSelection) return
-          // Swing components cannot be placed into different containers, so we add the shared
-          // timeline to the active tab on tab change.
-          tab.addTimeline()
-          selectedAnimation = tab
-          tab.loadProperties()
-          createTimelineElements(listOf(tab))
-          return@selectionChanged
-        }
-      // If coordination tab is selected.
-      if (component is AllTabPanel) {
+      val selectedSupportedAnimation =
+        animations.findIsInstanceAnd<SupportedAnimationManager> { it.tabComponent == component }
+      if (selectedSupportedAnimation != null) {
+        // Swing components cannot be placed into different containers, so we add the shared
+        // timeline to the active tab on tab change.
+        selectedSupportedAnimation.addTimeline()
+        selectedAnimation = selectedSupportedAnimation
+        selectedSupportedAnimation.loadProperties()
+      } else if (component is AllTabPanel) { // If coordination tab is selected.
+        selectedAnimation = null
         coordinationTab.addTimeline(timeline)
-        createTimelineElements(animations)
       }
-      selectedAnimation = null
+      updateTimelineElements()
     }
   }
 
@@ -222,10 +219,7 @@
     }
 
   /** Create list of [TimelineElement] for selected [SupportedAnimationManager]s. */
-  private fun createTimelineElements(
-    tabs: Collection<AnimationManager>,
-    elementsCreated: () -> Unit = {},
-  ) {
+  private fun updateTimelineElements(elementsCreated: () -> Unit = {}) {
     executeOnRenderThread(false) {
       var minY = InspectorLayout.timelineHeaderHeightScaled()
       // Call once to update all sizes as all curves / lines required it.
@@ -234,29 +228,30 @@
         timeline.repaint()
         timeline.sliderUI.elements.forEach { it.dispose() }
         timeline.sliderUI.elements =
-          if (tabs.size == 1 && selectedAnimation != null) {
+          if (selectedAnimation != null) {
             // Paint single selected animation.
+            val selected = selectedAnimation!!
             val curve =
               TransitionCurve.create(
-                tabs.first().elementState,
-                tabs.first().currentTransition,
+                selected.elementState,
+                selected.currentTransition,
                 minY,
                 timeline.sliderUI.positionProxy,
               )
-            tabs.first().selectedPropertiesCallback = { curve.timelineUnits = it }
-            curve.timelineUnits = tabs.first().selectedProperties
-            mutableListOf(curve)
+            selected.selectedPropertiesCallback = { curve.timelineUnits = it }
+            curve.timelineUnits = selected.selectedProperties
+            listOf(curve)
           } else
-            tabs
-              .map { tab ->
+            animations.map { tab ->
+              if (tab is SupportedAnimationManager) {
                 tab.card.expandedSize = TransitionCurve.expectedHeight(tab.currentTransition)
-                val line =
-                  tab.createTimelineElement(timeline, minY, timeline.sliderUI.positionProxy)
-                minY += line.heightScaled()
                 tab.card.setDuration(tab.currentTransition.duration)
-                line
               }
-              .toMutableList()
+
+              tab.createTimelineElement(timeline, minY, timeline.sliderUI.positionProxy).apply {
+                minY += heightScaled()
+              }
+            }
         elementsCreated()
       }
       timeline.revalidate()
@@ -264,11 +259,6 @@
     }
   }
 
-  /** Update currently displayed [TimelineElement]s. */
-  private fun updateTimelineElements(elementsCreated: () -> Unit = {}) {
-    createTimelineElements(selectedAnimation?.let { listOf(it) } ?: animations, elementsCreated)
-  }
-
   /**
    * Set clock time
    *
@@ -318,11 +308,7 @@
 
   private fun updateTimelineMaximum() {
     val timelineMax =
-      animations
-        .mapNotNull { it.timelineMaximumMs }
-        .maxOrNull()
-        ?.toLong()
-        ?.let { max(it, maxDurationPerIteration) } ?: maxDurationPerIteration
+      max(animations.maxOf { it.timelineMaximumMs }.toLong(), maxDurationPerIteration)
     clockControl.updateMaxDuration(max(timelineMax, MINIMUM_TIMELINE_DURATION_MS))
     updateTimelineElements()
   }
@@ -519,6 +505,18 @@
   private open inner class SupportedAnimationManager(animation: ComposeAnimation) :
     AnimationManager(animation, tabNames.createName(animation)) {
 
+    /** Animation [Transition]. Could be empty for unsupported or not yet loaded transitions. */
+    var currentTransition = Transition()
+      protected set(value) {
+        field = value
+        // If transition has changed, reset it offset.
+        elementState.valueOffset = 0
+        updateTimelineElements { invokeLater { coordinationTab.updateCardSize(card) } }
+      }
+
+    override val timelineMaximumMs: Int
+      get() = currentTransition.endMillis?.let { max(it + elementState.valueOffset, it) } ?: 0
+
     val stateComboBox = animation.createState(tracker, animation.findCallback())
 
     /** State of animation, shared between single animation tab and coordination panel. */
@@ -586,12 +584,6 @@
 
     private val cachedTransitions: MutableMap<Int, Transition> = mutableMapOf()
 
-    init {
-      currentTransitionCallback = {
-        updateTimelineElements { invokeLater { coordinationTab.updateCardSize(card) } }
-      }
-    }
-
     /**
      * Updates the `initial` and `target` state combo boxes to display the states of the given
      * animation, and resets the timeline. Invokes a given callback once everything is populated.
diff --git a/compose-designer/src/com/android/tools/idea/compose/preview/animation/TimelinePanel.kt b/compose-designer/src/com/android/tools/idea/compose/preview/animation/TimelinePanel.kt
index 5f64164..0d6d7a5 100644
--- a/compose-designer/src/com/android/tools/idea/compose/preview/animation/TimelinePanel.kt
+++ b/compose-designer/src/com/android/tools/idea/compose/preview/animation/TimelinePanel.kt
@@ -187,7 +187,7 @@
   val panelThumbRect: () -> Rectangle = { thumbRect }
 
   /** List of elements to display. */
-  var elements: MutableList<TimelineElement> = mutableListOf()
+  var elements: List<TimelineElement> = listOf()
 
   /** Element currently hovered or dragged. */
   var activeElement: TimelineElement? = null
diff --git a/compose-designer/src/com/android/tools/idea/compose/preview/animation/managers/AnimationManager.kt b/compose-designer/src/com/android/tools/idea/compose/preview/animation/managers/AnimationManager.kt
index cd97f86..48cc7e0 100644
--- a/compose-designer/src/com/android/tools/idea/compose/preview/animation/managers/AnimationManager.kt
+++ b/compose-designer/src/com/android/tools/idea/compose/preview/animation/managers/AnimationManager.kt
@@ -19,12 +19,10 @@
 import com.android.tools.idea.compose.preview.animation.AnimationPreview
 import com.android.tools.idea.compose.preview.animation.Card
 import com.android.tools.idea.compose.preview.animation.ComposeUnit
-import com.android.tools.idea.compose.preview.animation.Transition
 import com.android.tools.idea.compose.preview.animation.timeline.ElementState
 import com.android.tools.idea.compose.preview.animation.timeline.PositionProxy
 import com.android.tools.idea.compose.preview.animation.timeline.TimelineElement
 import javax.swing.JComponent
-import kotlin.math.max
 
 /**
  * [AnimationManager] is handling the state of one subscribed [animation]. Each [animation] is
@@ -38,17 +36,6 @@
   /** [Card] for the current animation in the coordination panel. */
   abstract val card: Card
 
-  /** Callback when [currentTransition] has been changed. */
-  var currentTransitionCallback: (Transition) -> Unit = {}
-  /** Animation [Transition]. Could be empty for unsupported or not yet loaded transitions. */
-  var currentTransition = Transition()
-    protected set(value) {
-      field = value
-      // If transition has changed, reset it offset.
-      elementState.valueOffset = 0
-      currentTransitionCallback(value)
-    }
-
   /** Callback when [selectedProperties] has been changed. */
   var selectedPropertiesCallback: (List<ComposeUnit.TimelineUnit>) -> Unit = {}
   /**
@@ -75,6 +62,5 @@
   abstract fun setup(callback: () -> Unit)
 
   /** Maximum ms for [currentTransition] required in the timeline. */
-  val timelineMaximumMs: Int?
-    get() = currentTransition.endMillis?.let { max(it + elementState.valueOffset, it) }
+  abstract val timelineMaximumMs: Int
 }
diff --git a/compose-designer/src/com/android/tools/idea/compose/preview/animation/managers/UnsupportedAnimationManager.kt b/compose-designer/src/com/android/tools/idea/compose/preview/animation/managers/UnsupportedAnimationManager.kt
index 10b3235..e0dadf3 100644
--- a/compose-designer/src/com/android/tools/idea/compose/preview/animation/managers/UnsupportedAnimationManager.kt
+++ b/compose-designer/src/com/android/tools/idea/compose/preview/animation/managers/UnsupportedAnimationManager.kt
@@ -41,6 +41,8 @@
     callback.invoke()
   }
 
+  override val timelineMaximumMs = 0
+
   override fun createTimelineElement(
     parent: JComponent,
     minY: Int,
diff --git a/compose-designer/src/com/android/tools/idea/compose/preview/flow/ComposePreviewFlowManager.kt b/compose-designer/src/com/android/tools/idea/compose/preview/flow/ComposePreviewFlowManager.kt
index f4b7e55..39d0f96 100644
--- a/compose-designer/src/com/android/tools/idea/compose/preview/flow/ComposePreviewFlowManager.kt
+++ b/compose-designer/src/com/android/tools/idea/compose/preview/flow/ComposePreviewFlowManager.kt
@@ -17,7 +17,6 @@
 
 import com.android.tools.idea.compose.ComposePreviewElementsModel
 import com.android.tools.idea.compose.UiCheckModeFilter
-import com.android.tools.idea.compose.preview.PreviewGroup
 import com.android.tools.idea.compose.preview.essentials.ComposePreviewEssentialsModeManager
 import com.android.tools.idea.compose.preview.util.isFastPreviewAvailable
 import com.android.tools.idea.concurrency.AndroidDispatchers.uiThread
@@ -33,6 +32,7 @@
 import com.android.tools.idea.editors.build.outOfDateKtFiles
 import com.android.tools.idea.flags.StudioFlags.COMPOSE_INVALIDATE_ON_RESOURCE_CHANGE
 import com.android.tools.idea.modes.essentials.EssentialsMode
+import com.android.tools.idea.preview.groups.PreviewGroup
 import com.android.tools.idea.preview.modes.PreviewMode
 import com.android.tools.idea.preview.modes.PreviewModeManager
 import com.android.tools.idea.preview.sortByDisplayAndSourcePosition
diff --git a/compose-designer/src/com/android/tools/idea/compose/preview/gallery/ComposeGalleryMode.kt b/compose-designer/src/com/android/tools/idea/compose/preview/gallery/ComposeGalleryMode.kt
index a79f658..c9c1fef 100644
--- a/compose-designer/src/com/android/tools/idea/compose/preview/gallery/ComposeGalleryMode.kt
+++ b/compose-designer/src/com/android/tools/idea/compose/preview/gallery/ComposeGalleryMode.kt
@@ -15,8 +15,9 @@
  */
 package com.android.tools.idea.compose.preview.gallery
 
-import com.android.tools.idea.compose.preview.findComposePreviewManagerForContext
+import com.android.tools.idea.compose.preview.COMPOSE_PREVIEW_MANAGER
 import com.android.tools.idea.concurrency.asCollection
+import com.android.tools.idea.preview.actions.findPreviewManager
 import com.android.tools.idea.preview.modes.PreviewMode
 import com.android.tools.preview.ComposePreviewElementInstance
 import com.intellij.openapi.actionSystem.DataContext
@@ -33,13 +34,14 @@
 
   private val tabChangeListener: (DataContext, PreviewElementKey?) -> Unit = { dataContext, tab ->
     val previewElement = tab?.element
-    findComposePreviewManagerForContext(dataContext)?.let { previewManager ->
+    dataContext.findPreviewManager(COMPOSE_PREVIEW_MANAGER)?.let { previewManager ->
       previewElement?.let { previewManager.setMode(PreviewMode.Gallery(previewElement)) }
     }
   }
 
   private val keysProvider: (DataContext) -> Set<PreviewElementKey> = { dataContext ->
-    findComposePreviewManagerForContext(dataContext)
+    dataContext
+      .findPreviewManager(COMPOSE_PREVIEW_MANAGER)
       ?.allPreviewElementsInFileFlow
       ?.value
       ?.asCollection()
@@ -48,7 +50,7 @@
   }
 
   private val selectedProvider: (DataContext) -> PreviewElementKey? = { dataContext ->
-    findComposePreviewManagerForContext(dataContext)?.let { previewManager ->
+    dataContext.findPreviewManager(COMPOSE_PREVIEW_MANAGER)?.let { previewManager ->
       (previewManager.mode.value as? PreviewMode.Gallery)?.selected?.let { PreviewElementKey(it) }
     }
   }
diff --git a/compose-designer/src/com/android/tools/idea/compose/preview/runconfiguration/ComposePreviewRunConfiguration.kt b/compose-designer/src/com/android/tools/idea/compose/preview/runconfiguration/ComposePreviewRunConfiguration.kt
index 542bada..7c7b7d5 100644
--- a/compose-designer/src/com/android/tools/idea/compose/preview/runconfiguration/ComposePreviewRunConfiguration.kt
+++ b/compose-designer/src/com/android/tools/idea/compose/preview/runconfiguration/ComposePreviewRunConfiguration.kt
@@ -18,7 +18,6 @@
 import com.android.tools.idea.compose.preview.hasPreviewElements
 import com.android.tools.idea.compose.preview.message
 import com.android.tools.idea.execution.common.stats.RunStats
-import com.android.tools.idea.gradle.project.build.invoker.TestCompileType
 import com.android.tools.idea.run.AndroidRunConfiguration
 import com.android.tools.idea.run.AndroidRunConfigurationBase
 import com.android.tools.idea.run.ValidationError
@@ -66,9 +65,6 @@
    */
   override fun isTestConfiguration() = true
 
-  override val testCompileMode: TestCompileType
-    get() = TestCompileType.ANDROID_TESTS
-
   override fun checkConfiguration(facet: AndroidFacet): List<ValidationError> {
     return emptyList()
   }
diff --git a/compose-designer/testSrc/com/android/tools/idea/compose/gradle/preview/ComposeVisualLintSuppressTaskTest.kt b/compose-designer/testSrc/com/android/tools/idea/compose/gradle/preview/ComposeVisualLintSuppressTaskTest.kt
index 97880d5..e777789 100644
--- a/compose-designer/testSrc/com/android/tools/idea/compose/gradle/preview/ComposeVisualLintSuppressTaskTest.kt
+++ b/compose-designer/testSrc/com/android/tools/idea/compose/gradle/preview/ComposeVisualLintSuppressTaskTest.kt
@@ -128,12 +128,23 @@
     assertEquals(2, issueProvider.getIssues().size)
     assertEquals(2, issueProvider.getUnsuppressedIssues().size)
 
-    ComposeVisualLintSuppressTask(nlModel, previewElement, VisualLintErrorType.BUTTON_SIZE).run()
+    ComposeVisualLintSuppressTask(
+        facet,
+        projectRule.project,
+        previewElement,
+        VisualLintErrorType.BUTTON_SIZE,
+      )
+      .run()
     assertEquals(2, issueProvider.getIssues().size)
     assertEquals(1, issueProvider.getUnsuppressedIssues().size)
     assertEquals(VisualLintErrorType.TEXT_FIELD_SIZE, issueProvider.getUnsuppressedIssues()[0].type)
 
-    ComposeVisualLintSuppressTask(nlModel, previewElement, VisualLintErrorType.TEXT_FIELD_SIZE)
+    ComposeVisualLintSuppressTask(
+        facet,
+        projectRule.project,
+        previewElement,
+        VisualLintErrorType.TEXT_FIELD_SIZE,
+      )
       .run()
     assertEquals(2, issueProvider.getIssues().size)
     assertEquals(0, issueProvider.getUnsuppressedIssues().size)
diff --git a/compose-designer/testSrc/com/android/tools/idea/compose/gradle/preview/RenderErrorTest.kt b/compose-designer/testSrc/com/android/tools/idea/compose/gradle/preview/RenderErrorTest.kt
index 1ee10b6..9456f95 100644
--- a/compose-designer/testSrc/com/android/tools/idea/compose/gradle/preview/RenderErrorTest.kt
+++ b/compose-designer/testSrc/com/android/tools/idea/compose/gradle/preview/RenderErrorTest.kt
@@ -286,23 +286,24 @@
         )
         .forEach { modelWithIssues ->
           launch {
-            startUiCheckForModel(modelWithIssues)
+              startUiCheckForModel(modelWithIssues)
 
-            val issues = visualLintRenderIssues()
-            // 1-2% of the time we get two issues instead of one. Only one of the issues has a
-            // component
-            // field that is populated. We attempt to retrieve it here.
-            val issue = runInEdtAndGet {
-              issues.first { it.components.firstOrNull()?.navigatable is OpenFileDescriptor }
+              val issues = visualLintRenderIssues()
+              // 1-2% of the time we get two issues instead of one. Only one of the issues has a
+              // component
+              // field that is populated. We attempt to retrieve it here.
+              val issue = runInEdtAndGet {
+                issues.first { it.components.firstOrNull()?.navigatable is OpenFileDescriptor }
+              }
+
+              assertEquals("Visual Lint Issue", issue.category)
+              val navigatable = issue.components[0].navigatable
+              assertTrue(navigatable is OpenFileDescriptor)
+              assertEquals("RenderError.kt", (navigatable as OpenFileDescriptor).file.name)
+
+              stopUiCheck()
             }
-
-            assertEquals("Visual Lint Issue", issue.category)
-            val navigatable = issue.components[0].navigatable
-            assertTrue(navigatable is OpenFileDescriptor)
-            assertEquals("RenderError.kt", (navigatable as OpenFileDescriptor).file.name)
-
-            stopUiCheck()
-          }
+            .join()
         }
     }
 
@@ -377,7 +378,7 @@
     var issues = emptyList<VisualLintRenderIssue>()
     delayUntilCondition(delayPerIterationMs = 300, timeout = 1.minutes) {
       issues = issueModel.issues.filterIsInstance<VisualLintRenderIssue>().filter(filter)
-      issues.isNotEmpty()
+      issues.any { it.components.isNotEmpty() }
     }
     return issues
   }
diff --git a/compose-designer/testSrc/com/android/tools/idea/compose/preview/ComposePreviewElementsModelTest.kt b/compose-designer/testSrc/com/android/tools/idea/compose/preview/ComposePreviewElementsModelTest.kt
index 904fe72..b312a1f 100644
--- a/compose-designer/testSrc/com/android/tools/idea/compose/preview/ComposePreviewElementsModelTest.kt
+++ b/compose-designer/testSrc/com/android/tools/idea/compose/preview/ComposePreviewElementsModelTest.kt
@@ -16,9 +16,9 @@
 package com.android.tools.idea.compose.preview
 
 import com.android.tools.idea.compose.ComposePreviewElementsModel
-import com.android.tools.idea.compose.preview.PreviewGroup.Companion.namedGroup
 import com.android.tools.idea.concurrency.FlowableCollection
 import com.android.tools.idea.concurrency.asCollection
+import com.android.tools.idea.preview.groups.PreviewGroup.Companion.namedGroup
 import com.android.tools.preview.ComposePreviewElement
 import com.android.tools.preview.ComposePreviewElementInstance
 import com.android.tools.preview.SingleComposePreviewElementInstance
diff --git a/compose-designer/testSrc/com/android/tools/idea/compose/preview/ComposePreviewRefreshManagerTest.kt b/compose-designer/testSrc/com/android/tools/idea/compose/preview/ComposePreviewRefreshManagerTest.kt
index b99f670..7f873dd 100644
--- a/compose-designer/testSrc/com/android/tools/idea/compose/preview/ComposePreviewRefreshManagerTest.kt
+++ b/compose-designer/testSrc/com/android/tools/idea/compose/preview/ComposePreviewRefreshManagerTest.kt
@@ -79,6 +79,7 @@
     val completable2 = CompletableDeferred<Unit>()
     refreshManager.requestRefresh(
       ComposePreviewRefreshRequest(
+        surface = null,
         "test_id",
         ::testRefresh,
         completable1,
@@ -89,6 +90,7 @@
     startLatch.await()
     refreshManager.requestRefresh(
       ComposePreviewRefreshRequest(
+        surface = null,
         "test_id",
         ::testRefresh,
         completable2,
@@ -120,6 +122,7 @@
     val completable3 = CompletableDeferred<Unit>()
     refreshManager.requestRefresh(
       ComposePreviewRefreshRequest(
+        surface = null,
         "test_id",
         ::testRefresh,
         completable1,
@@ -131,6 +134,7 @@
     // Use lower priority for 2 and 3 to ensure that the first request is not cancelled.
     refreshManager.requestRefresh(
       ComposePreviewRefreshRequest(
+        surface = null,
         "test_id",
         ::testRefresh,
         completable2,
@@ -140,6 +144,7 @@
     )
     refreshManager.requestRefresh(
       ComposePreviewRefreshRequest(
+        surface = null,
         "test_id",
         ::testRefresh,
         completable3,
diff --git a/compose-designer/testSrc/com/android/tools/idea/compose/preview/ComposePreviewRepresentationTest.kt b/compose-designer/testSrc/com/android/tools/idea/compose/preview/ComposePreviewRepresentationTest.kt
index 6fad379..f66c358 100644
--- a/compose-designer/testSrc/com/android/tools/idea/compose/preview/ComposePreviewRepresentationTest.kt
+++ b/compose-designer/testSrc/com/android/tools/idea/compose/preview/ComposePreviewRepresentationTest.kt
@@ -35,6 +35,8 @@
 import com.android.tools.idea.editors.build.ProjectStatus
 import com.android.tools.idea.editors.fast.FastPreviewManager
 import com.android.tools.idea.flags.StudioFlags
+import com.android.tools.idea.preview.actions.getPreviewManager
+import com.android.tools.idea.preview.groups.PreviewGroupManager
 import com.android.tools.idea.preview.modes.GRID_LAYOUT_MANAGER_OPTIONS
 import com.android.tools.idea.preview.modes.LIST_LAYOUT_MANAGER_OPTION
 import com.android.tools.idea.preview.modes.PreviewMode
@@ -811,6 +813,69 @@
     }
 
   @Test
+  fun testPreviewGroupManagerShouldBeRegisteredInDataProvider() =
+    runBlocking(workerThread) {
+      val composeTest = runWriteActionAndWait {
+        fixture.addFileToProjectAndInvalidate(
+          "Test.kt",
+          // language=kotlin
+          """
+        import androidx.compose.ui.tooling.preview.Preview
+        import androidx.compose.runtime.Composable
+
+        @Composable
+        @Preview
+        fun Preview() {
+        }
+      """
+            .trimIndent(),
+        )
+      }
+
+      val mainSurface = NlDesignSurface.builder(project, fixture.testRootDisposable).build()
+      val modelRenderedLatch = CountDownLatch(2)
+
+      mainSurface.addListener(
+        object : DesignSurfaceListener {
+          override fun modelChanged(surface: DesignSurface<*>, model: NlModel?) {
+            val id = UUID.randomUUID().toString().substring(0, 5)
+            logger.info("modelChanged ($id)")
+            (surface.getSceneManager(model!!) as? LayoutlibSceneManager)?.addRenderListener {
+              logger.info("renderListener ($id)")
+              modelRenderedLatch.countDown()
+            }
+          }
+        }
+      )
+
+      val composeView = TestComposePreviewView(mainSurface)
+      lateinit var dataProvider: DataProvider
+      val preview =
+        ComposePreviewRepresentation(composeTest, PreferredVisibility.SPLIT) {
+          _,
+          _,
+          _,
+          provider,
+          _,
+          _ ->
+          dataProvider = provider
+          composeView
+        }
+      Disposer.register(fixture.testRootDisposable, preview)
+      withContext(Dispatchers.IO) {
+        logger.info("compile")
+        ProjectSystemService.getInstance(project).projectSystem.getBuildManager().compileProject()
+        logger.info("activate")
+        preview.onActivate()
+
+        modelRenderedLatch.await()
+        delayWhileRefreshingOrDumb(preview)
+      }
+
+      assertEquals(preview, dataProvider.getData(PreviewGroupManager.KEY.name))
+    }
+
+  @Test
   fun testActivationDoesNotCleanOverlayClassLoader() =
     runBlocking(workerThread) {
       val composeTest = runWriteActionAndWait {
@@ -880,8 +945,9 @@
             FileEditorManager.getInstance(project).openFile(composeTest.virtualFile, true, true)
           (editors[0] as TextEditorWithMultiRepresentationPreview<*>)
         }
-      delayUntilCondition(250) { editor.getComposePreviewManager() != null }
-      val preview = editor.getComposePreviewManager() as ComposePreviewRepresentation
+      delayUntilCondition(250) { editor.getPreviewManager<ComposePreviewManager>() != null }
+      val preview =
+        editor.getPreviewManager<ComposePreviewManager>() as ComposePreviewRepresentation
       val surface = withContext(uiThread) { editor.getDesignSurface()!! }
 
       val modelRenderedLatch = CountDownLatch(2)
diff --git a/compose-designer/testSrc/com/android/tools/idea/compose/preview/TestComposePreviewManager.kt b/compose-designer/testSrc/com/android/tools/idea/compose/preview/TestComposePreviewManager.kt
index f97a642..3c42185 100644
--- a/compose-designer/testSrc/com/android/tools/idea/compose/preview/TestComposePreviewManager.kt
+++ b/compose-designer/testSrc/com/android/tools/idea/compose/preview/TestComposePreviewManager.kt
@@ -16,6 +16,7 @@
 package com.android.tools.idea.compose.preview
 
 import com.android.tools.idea.concurrency.FlowableCollection
+import com.android.tools.idea.preview.groups.PreviewGroup
 import com.android.tools.idea.preview.modes.PreviewMode
 import com.android.tools.preview.ComposePreviewElementInstance
 import com.intellij.psi.PsiFile
diff --git a/compose-designer/testSrc/com/android/tools/idea/compose/preview/animation/TimelinePanelTest.kt b/compose-designer/testSrc/com/android/tools/idea/compose/preview/animation/TimelinePanelTest.kt
index 84f8b6c..59c8e58 100644
--- a/compose-designer/testSrc/com/android/tools/idea/compose/preview/animation/TimelinePanelTest.kt
+++ b/compose-designer/testSrc/com/android/tools/idea/compose/preview/animation/TimelinePanelTest.kt
@@ -125,8 +125,11 @@
       if (!enableCoordinationDrag) return@invokeAndWait
       val slider = TestUtils.createTestSlider()
       slider.sliderUI.apply {
-        elements.add(TestUtils.TestTimelineElement(50, 50, positionProxy))
-        elements.add(TestUtils.TestTimelineElement(50, 150, positionProxy))
+        elements =
+          listOf(
+            TestUtils.TestTimelineElement(50, 50, positionProxy),
+            TestUtils.TestTimelineElement(50, 150, positionProxy),
+          )
       }
 
       val ui = FakeUi(slider.parent)
@@ -155,8 +158,11 @@
       if (enableCoordinationDrag) return@invokeAndWait
       val slider = TestUtils.createTestSlider()
       slider.sliderUI.apply {
-        elements.add(TestUtils.TestTimelineElement(50, 50, positionProxy))
-        elements.add(TestUtils.TestTimelineElement(50, 150, positionProxy))
+        elements =
+          listOf(
+            TestUtils.TestTimelineElement(50, 50, positionProxy),
+            TestUtils.TestTimelineElement(50, 150, positionProxy),
+          )
       }
       val ui = FakeUi(slider.parent)
       // Hover the first element.
@@ -171,7 +177,9 @@
   fun `dragging timeline`() =
     ApplicationManager.getApplication().invokeAndWait {
       val slider = TestUtils.createTestSlider()
-      slider.sliderUI.apply { elements.add(TestUtils.TestTimelineElement(50, 50, positionProxy)) }
+      slider.sliderUI.apply {
+        elements = listOf(TestUtils.TestTimelineElement(50, 50, positionProxy))
+      }
       val ui = FakeUi(slider.parent)
       // Nothing is selected.
       assertNull(slider.sliderUI.activeElement)
@@ -190,8 +198,11 @@
       if (!enableCoordinationDrag) return@invokeAndWait
       val slider = TestUtils.createTestSlider()
       slider.sliderUI.apply {
-        elements.add(TestUtils.TestTimelineElement(50, 50, positionProxy))
-        elements.add(TestUtils.TestTimelineElement(50, 100, positionProxy))
+        elements =
+          listOf(
+            TestUtils.TestTimelineElement(50, 50, positionProxy),
+            TestUtils.TestTimelineElement(50, 100, positionProxy),
+          )
       }
       val ui = FakeUi(slider.parent)
       // Nothing is selected.
@@ -213,8 +224,11 @@
       if (!enableCoordinationDrag) return@invokeAndWait
       val slider = TestUtils.createTestSlider()
       slider.sliderUI.apply {
-        elements.add(TestUtils.TestTimelineElement(50, 50, positionProxy))
-        elements.add(TestUtils.TestTimelineElement(50, 100, positionProxy))
+        elements =
+          listOf(
+            TestUtils.TestTimelineElement(50, 50, positionProxy),
+            TestUtils.TestTimelineElement(50, 100, positionProxy),
+          )
       }
       val ui = FakeUi(slider.parent)
       // Nothing is selected.
@@ -250,8 +264,11 @@
       if (enableCoordinationDrag) return@invokeAndWait
       val slider = TestUtils.createTestSlider()
       slider.sliderUI.apply {
-        elements.add(TestUtils.TestTimelineElement(50, 50, positionProxy))
-        elements.add(TestUtils.TestTimelineElement(50, 100, positionProxy))
+        elements =
+          listOf(
+            TestUtils.TestTimelineElement(50, 50, positionProxy),
+            TestUtils.TestTimelineElement(50, 100, positionProxy),
+          )
       }
       val ui = FakeUi(slider.parent)
       // Nothing is selected.
@@ -285,7 +302,7 @@
       val child2 = TestUtils.TestTimelineElement(100, 100, slider.sliderUI.positionProxy)
       val parent =
         ParentTimelineElement(ElementState(), listOf(child1, child2), slider.sliderUI.positionProxy)
-      slider.sliderUI.elements.add(parent)
+      slider.sliderUI.elements = listOf(parent)
       // Nothing is selected.
       assertNull(slider.sliderUI.activeElement)
       // Hover the first child - parent and both child are hovered.
@@ -314,7 +331,9 @@
       // Only if coordination drag is enabled.
       if (!enableCoordinationDrag) return@invokeAndWait
       val slider = TestUtils.createTestSlider()
-      slider.sliderUI.apply { elements.add(TestUtils.TestTimelineElement(50, 50, positionProxy)) }
+      slider.sliderUI.apply {
+        elements = listOf(TestUtils.TestTimelineElement(50, 50, positionProxy))
+      }
       val ui = FakeUi(slider.parent)
       // Drag element
       ui.mouse.moveTo(149, 55)
@@ -332,7 +351,9 @@
       // Only if coordination drag is enabled.
       if (!enableCoordinationDrag) return@invokeAndWait
       val slider = TestUtils.createTestSlider()
-      slider.sliderUI.apply { elements.add(TestUtils.TestTimelineElement(50, 50, positionProxy)) }
+      slider.sliderUI.apply {
+        elements = listOf(TestUtils.TestTimelineElement(50, 50, positionProxy))
+      }
       val ui = FakeUi(slider.parent)
       // Drag element
       ui.mouse.moveTo(51, 55)
@@ -351,8 +372,11 @@
       // Call layoutAndDispatchEvents() so positionProxy returns correct values
       val ui = FakeUi(slider.parent).apply { layoutAndDispatchEvents() }
       slider.sliderUI.apply {
-        elements.add(TestUtils.TestTimelineElement(50, 50, positionProxy))
-        elements.add(TestUtils.TestTimelineElement(50, 100, positionProxy))
+        elements =
+          listOf(
+            TestUtils.TestTimelineElement(50, 50, positionProxy),
+            TestUtils.TestTimelineElement(50, 100, positionProxy),
+          )
       }
       assertEquals(
         setOf(TooltipInfo("50", "50"), TooltipInfo("50", "100")),
@@ -383,10 +407,13 @@
     ApplicationManager.getApplication().invokeAndWait {
       val slider = TestUtils.createTestSlider().apply { value = 1000 }
       (slider.ui as TimelineSliderUI).apply {
-        elements.add(TestUtils.TestTimelineElement(50, 50, positionProxy).apply { frozen = true })
-        elements.add(TestUtils.TestTimelineElement(50, 150, positionProxy).apply { frozen = false })
-        elements.add(TestUtils.TestTimelineElement(50, 250, positionProxy).apply { frozen = true })
-        elements.add(TestUtils.TestTimelineElement(50, 350, positionProxy).apply { frozen = false })
+        elements =
+          listOf(
+            TestUtils.TestTimelineElement(50, 50, positionProxy).apply { frozen = true },
+            TestUtils.TestTimelineElement(50, 150, positionProxy).apply { frozen = false },
+            TestUtils.TestTimelineElement(50, 250, positionProxy).apply { frozen = true },
+            TestUtils.TestTimelineElement(50, 350, positionProxy).apply { frozen = false },
+          )
       }
       val ui = FakeUi(slider.parent)
       // Uncomment to preview ui.
@@ -399,10 +426,13 @@
     ApplicationManager.getApplication().invokeAndWait {
       val slider = TestUtils.createTestSlider().apply { value = 1000 }
       (slider.ui as TimelineSliderUI).apply {
-        elements.add(TestUtils.TestTimelineElement(50, 50, positionProxy))
-        elements.add(TestUtils.TestTimelineElement(50, 150, positionProxy))
-        elements.add(TestUtils.TestTimelineElement(50, 250, positionProxy))
-        elements.add(TestUtils.TestTimelineElement(50, 350, positionProxy))
+        elements =
+          listOf(
+            TestUtils.TestTimelineElement(50, 50, positionProxy),
+            TestUtils.TestTimelineElement(50, 150, positionProxy),
+            TestUtils.TestTimelineElement(50, 250, positionProxy),
+            TestUtils.TestTimelineElement(50, 350, positionProxy),
+          )
       }
       val ui = FakeUi(slider.parent)
       // Uncomment to preview ui.
@@ -415,7 +445,7 @@
     ApplicationManager.getApplication().invokeAndWait {
       val slider = TestUtils.createTestSlider().apply { value = 1000 }
       (slider.ui as TimelineSliderUI).apply {
-        elements.add(TestUtils.TestTimelineElement(50, 50, positionProxy))
+        elements = listOf(TestUtils.TestTimelineElement(50, 50, positionProxy))
       }
       val ui = FakeUi(slider.parent)
       // Uncomment to preview ui.
@@ -428,7 +458,8 @@
     ApplicationManager.getApplication().invokeAndWait {
       val slider = TestUtils.createTestSlider().apply { value = 1000 }
       (slider.ui as TimelineSliderUI).apply {
-        elements.add(TestUtils.TestTimelineElement(50, 50, positionProxy).apply { frozen = true })
+        elements =
+          listOf(TestUtils.TestTimelineElement(50, 50, positionProxy).apply { frozen = true })
       }
       val ui = FakeUi(slider.parent)
       // Uncomment to preview ui.
diff --git a/compose-designer/testSrc/com/android/tools/idea/compose/preview/animation/managers/UnsupportedAnimationManagerTest.kt b/compose-designer/testSrc/com/android/tools/idea/compose/preview/animation/managers/UnsupportedAnimationManagerTest.kt
index 2e17245..5d8a0ee 100644
--- a/compose-designer/testSrc/com/android/tools/idea/compose/preview/animation/managers/UnsupportedAnimationManagerTest.kt
+++ b/compose-designer/testSrc/com/android/tools/idea/compose/preview/animation/managers/UnsupportedAnimationManagerTest.kt
@@ -21,7 +21,6 @@
 import com.intellij.testFramework.assertInstanceOf
 import kotlin.test.assertNotNull
 import org.junit.Assert.assertEquals
-import org.junit.Assert.assertNull
 import org.junit.Test
 
 class UnsupportedAnimationManagerTest {
@@ -34,7 +33,7 @@
     assertNotNull(manager.elementState)
     assertNotNull(manager.card)
     assertInstanceOf<LabelCard>(manager.card)
-    assertNull(manager.timelineMaximumMs)
+    assertEquals(manager.timelineMaximumMs, 0)
     manager.loadProperties()
   }
 
diff --git a/compose-designer/testSrc/com/android/tools/idea/compose/preview/animation/timeline/ComponentCurveTest.kt b/compose-designer/testSrc/com/android/tools/idea/compose/preview/animation/timeline/ComponentCurveTest.kt
index a641161..7f17c6b 100644
--- a/compose-designer/testSrc/com/android/tools/idea/compose/preview/animation/timeline/ComponentCurveTest.kt
+++ b/compose-designer/testSrc/com/android/tools/idea/compose/preview/animation/timeline/ComponentCurveTest.kt
@@ -50,7 +50,7 @@
           positionProxy = slider.sliderUI.positionProxy,
           colorIndex = 0,
         )
-      slider.sliderUI.elements.add(componentCurve)
+      slider.sliderUI.elements = listOf(componentCurve)
       val curveBaseLine = componentCurve.curveBaseY - 1 // Minus 1 so point is inside the curve.
 
       // No tooltips.
diff --git a/compose-designer/testSrc/com/android/tools/idea/compose/preview/animation/timeline/PropertyCurveTest.kt b/compose-designer/testSrc/com/android/tools/idea/compose/preview/animation/timeline/PropertyCurveTest.kt
index f87221e..045d219 100644
--- a/compose-designer/testSrc/com/android/tools/idea/compose/preview/animation/timeline/PropertyCurveTest.kt
+++ b/compose-designer/testSrc/com/android/tools/idea/compose/preview/animation/timeline/PropertyCurveTest.kt
@@ -61,8 +61,7 @@
           slider.sliderUI.positionProxy,
         )
 
-      slider.sliderUI.elements.add(propertyCurveOne)
-      slider.sliderUI.elements.add(propertyCurveTwo)
+      slider.sliderUI.elements = listOf(propertyCurveOne, propertyCurveTwo)
 
       // Component has tooltips.
       ui.render() // paint() method within render() should be called to update BoxedLabel positions.
diff --git a/compose-designer/testSrc/com/android/tools/idea/compose/preview/animation/timeline/TimelineLineTest.kt b/compose-designer/testSrc/com/android/tools/idea/compose/preview/animation/timeline/TimelineLineTest.kt
index 006bcd7..d01439c 100644
--- a/compose-designer/testSrc/com/android/tools/idea/compose/preview/animation/timeline/TimelineLineTest.kt
+++ b/compose-designer/testSrc/com/android/tools/idea/compose/preview/animation/timeline/TimelineLineTest.kt
@@ -55,22 +55,19 @@
     ApplicationManager.getApplication().invokeAndWait {
       val slider = TestUtils.createTestSlider().apply { value = 1000 }
       slider.sliderUI.apply {
-        elements.add(
-          TimelineLine(ElementState(), 50, 150, 50, positionProxy).apply {
-            status = TimelineElementStatus.Hovered
-          }
-        )
-        elements.add(
-          TimelineLine(ElementState(), 50, 150, 150, positionProxy).apply {
-            status = TimelineElementStatus.Dragged
-          }
-        )
-        elements.add(
-          TimelineLine(ElementState(), 50, 150, 250, positionProxy).apply {
-            status = TimelineElementStatus.Inactive
-          }
-        )
-        elements.add(TimelineLine(ElementState(), 50, 150, 350, positionProxy).apply {})
+        elements =
+          listOf(
+            TimelineLine(ElementState(), 50, 150, 50, positionProxy).apply {
+              status = TimelineElementStatus.Hovered
+            },
+            TimelineLine(ElementState(), 50, 150, 150, positionProxy).apply {
+              status = TimelineElementStatus.Dragged
+            },
+            TimelineLine(ElementState(), 50, 150, 250, positionProxy).apply {
+              status = TimelineElementStatus.Inactive
+            },
+            TimelineLine(ElementState(), 50, 150, 350, positionProxy).apply {},
+          )
       }
       // Call layoutAndDispatchEvents() so positionProxy returns correct values
       val ui = FakeUi(slider.parent).apply { layoutAndDispatchEvents() }
diff --git a/compose-designer/testSrc/com/android/tools/idea/compose/preview/animation/timeline/TransitionCurveTest.kt b/compose-designer/testSrc/com/android/tools/idea/compose/preview/animation/timeline/TransitionCurveTest.kt
index 168c30c..cadedcf 100644
--- a/compose-designer/testSrc/com/android/tools/idea/compose/preview/animation/timeline/TransitionCurveTest.kt
+++ b/compose-designer/testSrc/com/android/tools/idea/compose/preview/animation/timeline/TransitionCurveTest.kt
@@ -70,8 +70,7 @@
           ComposeUnit.TimelineUnit("Property Two", ComposeUnit.IntSize(5, 5)),
         )
 
-      slider.sliderUI.elements.add(transitionCurveOne)
-      slider.sliderUI.elements.add(transitionCurveTwo)
+      slider.sliderUI.elements = listOf(transitionCurveOne, transitionCurveTwo)
 
       // Timeline has tooltips
       ui.render() // paint() method within render() should be called to update BoxedLabel positions.
@@ -104,7 +103,7 @@
           rowMinY = InspectorLayout.timelineHeaderHeightScaled(),
           positionProxy = slider.sliderUI.positionProxy,
         )
-      slider.sliderUI.elements.add(transitionCurve)
+      slider.sliderUI.elements = listOf(transitionCurve)
       // No tooltips.
       ui.render() // paint() method within render() should be called to update BoxedLabel positions.
       assertEquals(0, slider.scanForTooltips().size)
@@ -128,7 +127,7 @@
         )
       transitionCurve.timelineUnits =
         listOf(null, null, ComposeUnit.TimelineUnit("Property", ComposeUnit.IntSize(5, 5)))
-      slider.sliderUI.elements.add(transitionCurve)
+      slider.sliderUI.elements = listOf(transitionCurve)
       // Timeline has tooltips.
       ui.render() // paint() method within render() should be called to update BoxedLabel positions.
       val tooltips = slider.scanForTooltips()
@@ -158,7 +157,7 @@
         )
       transitionCurve.timelineUnits =
         listOf(ComposeUnit.TimelineUnit("Property Two", ComposeUnit.IntSize(5, 5)))
-      slider.sliderUI.elements.add(transitionCurve)
+      slider.sliderUI.elements = listOf(transitionCurve)
       // Timeline has tooltips.
       ui.render() // paint() method within render() should be called to update BoxedLabel positions.
       val tooltips = slider.scanForTooltips()
@@ -192,8 +191,7 @@
           ComposeUnit.TimelineUnit("Property Two", ComposeUnit.IntSize(0, 0)),
           ComposeUnit.TimelineUnit("Property Three", ComposeUnit.IntSize(5, 5)),
         )
-      slider.sliderUI.elements.add(transitionCurve)
-      slider.sliderUI.elements.add(transitionCurve)
+      slider.sliderUI.elements = listOf(transitionCurve, transitionCurve)
       // Timeline has tooltips.
       ui.render() // paint() method within render() should be called to update BoxedLabel positions.
       val tooltips = slider.scanForTooltips()
@@ -224,7 +222,7 @@
           positionProxy = slider.sliderUI.positionProxy,
         )
 
-      slider.sliderUI.elements.add(transitionCurve)
+      slider.sliderUI.elements = listOf(transitionCurve)
 
       // There are no tooltips.
       ui.render() // paint() method within render() should be called to update BoxedLabel positions.
diff --git a/compose-designer/testSrc/com/android/tools/idea/compose/preview/animation/timeline/UnsupportedLabelTest.kt b/compose-designer/testSrc/com/android/tools/idea/compose/preview/animation/timeline/UnsupportedLabelTest.kt
index b3c7180..79aed92 100644
--- a/compose-designer/testSrc/com/android/tools/idea/compose/preview/animation/timeline/UnsupportedLabelTest.kt
+++ b/compose-designer/testSrc/com/android/tools/idea/compose/preview/animation/timeline/UnsupportedLabelTest.kt
@@ -79,11 +79,11 @@
 
       var height = 25
       for (i in 0..4) {
-        slider.sliderUI.elements.add(
-          UnsupportedLabel(slider, ElementState(""), height, slider.sliderUI.positionProxy).apply {
-            height += this.height
-          }
-        )
+        slider.sliderUI.elements =
+          listOf(
+            UnsupportedLabel(slider, ElementState(""), height, slider.sliderUI.positionProxy)
+              .apply { height += this.height }
+          )
       }
 
       // Call layoutAndDispatchEvents() so all JComponents are updated and visible.
diff --git a/databinding/src/com/android/tools/idea/databinding/module/LayoutBindingModuleCache.kt b/databinding/src/com/android/tools/idea/databinding/module/LayoutBindingModuleCache.kt
index 90d14ab..ed1933d 100644
--- a/databinding/src/com/android/tools/idea/databinding/module/LayoutBindingModuleCache.kt
+++ b/databinding/src/com/android/tools/idea/databinding/module/LayoutBindingModuleCache.kt
@@ -42,8 +42,11 @@
 import com.intellij.openapi.diagnostic.thisLogger
 import com.intellij.openapi.module.Module
 import com.intellij.openapi.project.DumbService
+import com.intellij.openapi.project.Project
 import com.intellij.openapi.util.Key
 import com.intellij.psi.PsiManager
+import com.intellij.psi.util.CachedValueProvider
+import com.intellij.psi.util.CachedValuesManager
 import net.jcip.annotations.GuardedBy
 import net.jcip.annotations.ThreadSafe
 import org.jetbrains.android.facet.AndroidFacet
@@ -165,14 +168,6 @@
       }
     }
 
-  /**
-   * A modification tracker for module resources.
-   *
-   * We keep track of it to know when to regenerate [BindingLayoutGroup]s, since they depend on
-   * resources. See also [bindingLayoutGroups].
-   */
-  @GuardedBy("lock") private var lastResourcesModificationCount = Long.MIN_VALUE
-
   @GuardedBy("lock") private var _bindingLayoutGroups = emptySet<BindingLayoutGroup>()
   /**
    * Returns all [BindingLayoutGroup] instances associated with this module, representing all
@@ -197,29 +192,41 @@
         return _bindingLayoutGroups
       }
 
+      synchronized(lock) {
+        _bindingLayoutGroups =
+          CachedValuesManager.getManager(project)
+            .getCachedValue(facet, BindingLayoutGroupCachedValueProvider(facet, project))
+      }
+
+      return _bindingLayoutGroups
+    }
+
+  private class BindingLayoutGroupCachedValueProvider(
+    private val facet: AndroidFacet,
+    private val project: Project,
+  ) : CachedValueProvider<Set<BindingLayoutGroup>> {
+
+    override fun compute(): CachedValueProvider.Result<Set<BindingLayoutGroup>> {
+      val moduleResources = StudioResourceRepositoryManager.getModuleResources(facet)
+      val layoutResources =
+        moduleResources.getResources(ResourceNamespace.RES_AUTO, ResourceType.LAYOUT)
+      val bindingLayoutGroups =
+        layoutResources
+          .values()
+          .mapNotNull { resource -> BindingLayout.tryCreate(facet, resource) }
+          .groupBy { info -> info.file.name }
+          .map { entry -> BindingLayoutGroup(entry.value) }
+          .toSet()
+
       // Note: LocalResourceRepository and BindingXmlIndex are updated at different times,
       // so we must incorporate both into the modification count (see b/283753328).
-      val moduleResources = StudioResourceRepositoryManager.getModuleResources(facet)
-      val bindingIndexModificationCount =
-        BindingXmlIndexModificationTracker.getInstance(project).modificationCount
-      val modificationCount = moduleResources.modificationCount + bindingIndexModificationCount
-      synchronized(lock) {
-        if (modificationCount != lastResourcesModificationCount) {
-          val layoutResources =
-            moduleResources.getResources(ResourceNamespace.RES_AUTO, ResourceType.LAYOUT)
-          _bindingLayoutGroups =
-            layoutResources
-              .values()
-              .mapNotNull { resource -> BindingLayout.tryCreate(facet, resource) }
-              .groupBy { info -> info.file.name }
-              .map { entry -> BindingLayoutGroup(entry.value) }
-              .toSet()
-          lastResourcesModificationCount = modificationCount
-        }
-
-        return _bindingLayoutGroups
-      }
+      return CachedValueProvider.Result(
+        bindingLayoutGroups,
+        moduleResources,
+        BindingXmlIndexModificationTracker.getInstance(project),
+      )
     }
+  }
 
   /**
    * Returns a list of [LightBindingClass] instances corresponding to the layout XML files related
diff --git a/designer/BUILD b/designer/BUILD
index 9c9db9b..fa0e416 100644
--- a/designer/BUILD
+++ b/designer/BUILD
@@ -53,6 +53,7 @@
         "//tools/adt/idea/render-resources:intellij.android.render-resources[module]",
         "//tools/adt/idea/rendering:intellij.android.rendering[module]",
         "//tools/adt/idea/layoutlib-loader:intellij.android.layoutlib-loader[module]",
+        "//tools/adt/idea/ml-api:intellij.android.ml-api[module]",
     ],
 )
 
diff --git a/designer/customview/BUILD b/designer/customview/BUILD
index 6672257..66e5a00 100644
--- a/designer/customview/BUILD
+++ b/designer/customview/BUILD
@@ -15,7 +15,6 @@
         "//tools/adt/idea/android:intellij.android.core[module]",
         "//tools/adt/idea/designer:intellij.android.designer[module]",
         "//tools/adt/idea/adt-ui:intellij.android.adt.ui[module]",
-        "//tools/adt/idea/project-system-gradle:intellij.android.projectSystem.gradle[module]",
         "//tools/adt/idea/project-system:intellij.android.projectSystem[module]",
         "//tools/base/flags:studio.android.sdktools.flags[module]",
         "//tools/adt/idea/android-common:intellij.android.common[module]",
diff --git a/designer/customview/intellij.android.designer.customview.iml b/designer/customview/intellij.android.designer.customview.iml
index 51f574e..5a4d76e 100644
--- a/designer/customview/intellij.android.designer.customview.iml
+++ b/designer/customview/intellij.android.designer.customview.iml
@@ -12,7 +12,6 @@
     <orderEntry type="module" module-name="intellij.android.core" />
     <orderEntry type="module" module-name="intellij.android.designer" />
     <orderEntry type="module" module-name="intellij.android.adt.ui" />
-    <orderEntry type="module" module-name="intellij.android.projectSystem.gradle" />
     <orderEntry type="module" module-name="intellij.android.projectSystem" />
     <orderEntry type="module" module-name="android.sdktools.flags" />
     <orderEntry type="module" module-name="intellij.android.common" />
diff --git a/designer/customview/src/com/android/tools/idea/customview/preview/CustomViewPreviewNotificationProvider.kt b/designer/customview/src/com/android/tools/idea/customview/preview/CustomViewPreviewNotificationProvider.kt
index 5c3bd51..495611d 100644
--- a/designer/customview/src/com/android/tools/idea/customview/preview/CustomViewPreviewNotificationProvider.kt
+++ b/designer/customview/src/com/android/tools/idea/customview/preview/CustomViewPreviewNotificationProvider.kt
@@ -19,15 +19,11 @@
 import com.android.tools.idea.common.surface.DesignSurface
 import com.android.tools.idea.editors.shortcuts.asString
 import com.android.tools.idea.editors.shortcuts.getBuildAndRefreshShortcut
-import com.android.tools.idea.gradle.project.build.GradleBuildState
-import com.android.tools.idea.gradle.project.build.invoker.GradleBuildInvoker
-import com.android.tools.idea.gradle.project.build.invoker.TestCompileType
+import com.android.tools.idea.projectsystem.getProjectSystem
 import com.intellij.openapi.actionSystem.ActionUpdateThread
 import com.intellij.openapi.actionSystem.AnAction
 import com.intellij.openapi.actionSystem.AnActionEvent
 import com.intellij.openapi.fileEditor.FileEditor
-import com.intellij.openapi.module.Module
-import com.intellij.openapi.module.ModuleUtil
 import com.intellij.openapi.project.Project
 import com.intellij.openapi.vfs.VirtualFile
 import com.intellij.ui.AnimatedIcon
@@ -39,17 +35,12 @@
 private const val PREVIEW_OUT_OF_DATE = "The preview is out of date"
 private const val BUILD_AND_REFRESH = "Build & Refresh"
 
-private fun requestBuild(project: Project, module: Module) =
-  GradleBuildInvoker.getInstance(project)
-    .compileJava(setOf(module).toTypedArray(), TestCompileType.NONE)
-
 internal class CustomViewPreviewNotificationProvider : EditorNotificationProvider {
 
   override fun collectNotificationData(
     project: Project,
     file: VirtualFile,
   ): Function<FileEditor, EditorNotificationPanel?>? {
-    val module = ModuleUtil.findModuleForFile(file, project) ?: return null
     return Function { fileEditor ->
       val previewManager = fileEditor.getCustomViewPreviewManager() ?: return@Function null
       when (previewManager.notificationsState) {
@@ -57,7 +48,7 @@
           EditorNotificationPanel(fileEditor, EditorNotificationPanel.Status.Info).apply {
             setText(PREVIEW_OUT_OF_DATE)
             createActionLabel("$BUILD_AND_REFRESH${getBuildAndRefreshShortcut().asString()}") {
-              requestBuild(project, module)
+              project.getProjectSystem().getBuildManager().compileFilesAndDependencies(listOf(file))
             }
           }
         CustomViewPreviewManager.NotificationsState.BUILDING ->
@@ -76,7 +67,8 @@
 }
 
 internal fun requestBuildForSurface(surface: DesignSurface<*>) {
-  surface.models.map { it.module }.distinct().forEach { requestBuild(surface.project, it) }
+  val buildManager = surface.project.getProjectSystem().getBuildManager()
+  buildManager.compileFilesAndDependencies(surface.models.map { it.virtualFile })
 }
 
 /**
@@ -92,6 +84,6 @@
   override fun update(e: AnActionEvent) {
     val project = e.project ?: return
     val presentation = e.presentation
-    presentation.isEnabled = !GradleBuildState.getInstance(project).isBuildInProgress
+    presentation.isEnabled = !project.getProjectSystem().getBuildManager().isBuilding
   }
 }
diff --git a/designer/customview/src/com/android/tools/idea/customview/preview/CustomViewPreviewRepresentation.kt b/designer/customview/src/com/android/tools/idea/customview/preview/CustomViewPreviewRepresentation.kt
index e71c3f1..8cb34ee 100644
--- a/designer/customview/src/com/android/tools/idea/customview/preview/CustomViewPreviewRepresentation.kt
+++ b/designer/customview/src/com/android/tools/idea/customview/preview/CustomViewPreviewRepresentation.kt
@@ -32,8 +32,9 @@
 import com.android.tools.idea.configurations.ConfigurationManager
 import com.android.tools.idea.editors.setupChangeListener
 import com.android.tools.idea.editors.shortcuts.getBuildAndRefreshShortcut
-import com.android.tools.idea.gradle.project.build.GradleBuildState
 import com.android.tools.idea.projectsystem.BuildListener
+import com.android.tools.idea.projectsystem.ProjectSystemBuildManager
+import com.android.tools.idea.projectsystem.getProjectSystem
 import com.android.tools.idea.projectsystem.setupBuildListener
 import com.android.tools.idea.uibuilder.editor.multirepresentation.PreferredVisibility
 import com.android.tools.idea.uibuilder.editor.multirepresentation.PreviewRepresentation
@@ -82,11 +83,14 @@
 }
 
 fun getBuildState(project: Project): CustomViewVisualStateTracker.BuildState {
-  val gradleState = GradleBuildState.getInstance(project)
-  val prevBuildStatus = gradleState.lastFinishedBuildSummary?.status
+  val buildManager = project.getProjectSystem().getBuildManager()
+  val prevBuildStatus = buildManager.getLastBuildResult()
+  // TODO(?) shouldn't we be doing something different if the last BuildResult is from a
+  //  CLEAN build task?
   return when {
-    gradleState.isBuildInProgress -> CustomViewVisualStateTracker.BuildState.IN_PROGRESS
-    prevBuildStatus == null || prevBuildStatus.isBuildSuccessful ->
+    buildManager.isBuilding -> CustomViewVisualStateTracker.BuildState.IN_PROGRESS
+    prevBuildStatus.status == ProjectSystemBuildManager.BuildStatus.UNKNOWN ||
+      prevBuildStatus.status == ProjectSystemBuildManager.BuildStatus.SUCCESS ->
       CustomViewVisualStateTracker.BuildState.SUCCESSFUL
     else -> CustomViewVisualStateTracker.BuildState.FAILED
   }
diff --git a/designer/intellij.android.designer.iml b/designer/intellij.android.designer.iml
index 17a84a6..c019aa4 100644
--- a/designer/intellij.android.designer.iml
+++ b/designer/intellij.android.designer.iml
@@ -69,5 +69,6 @@
     <orderEntry type="module" module-name="intellij.android.render-resources" />
     <orderEntry type="module" module-name="intellij.android.rendering" />
     <orderEntry type="module" module-name="intellij.android.layoutlib-loader" />
+    <orderEntry type="module" module-name="intellij.android.ml-api" />
   </component>
 </module>
\ No newline at end of file
diff --git a/designer/src/com/android/tools/idea/common/surface/ZoomController.kt b/designer/src/com/android/tools/adtui/ZoomController.kt
similarity index 83%
rename from designer/src/com/android/tools/idea/common/surface/ZoomController.kt
rename to designer/src/com/android/tools/adtui/ZoomController.kt
index 4b0cf70..fc17725 100644
--- a/designer/src/com/android/tools/idea/common/surface/ZoomController.kt
+++ b/designer/src/com/android/tools/adtui/ZoomController.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2023 The Android Open Source Project
+ * Copyright (C) 2024 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -13,9 +13,10 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.android.tools.idea.common.surface
+package com.android.tools.adtui
 
-import com.android.tools.adtui.Zoomable
+import com.android.tools.adtui.common.SwingCoordinate
+import com.android.tools.idea.common.surface.SurfaceScale
 
 /** Applies zoom changes to a Zoomable surface */
 interface ZoomController : Zoomable {
@@ -29,7 +30,7 @@
    * @param y the vertical coordinate to where to focus the scaling
    * @return True if the scaling was changed, false otherwise.
    */
-  fun setScale(@SurfaceScale scale: Double, x: Int, y: Int): Boolean
+  fun setScale(@SurfaceScale scale: Double, @SwingCoordinate x: Int, @SwingCoordinate y: Int): Boolean
 
   /**
    * Set the scale factor used to multiply the content size.
diff --git a/designer/src/com/android/tools/idea/annotations/AnnotatedMethodsFinder.kt b/designer/src/com/android/tools/idea/annotations/AnnotatedMethodsFinder.kt
index 5711190..6ebe535 100644
--- a/designer/src/com/android/tools/idea/annotations/AnnotatedMethodsFinder.kt
+++ b/designer/src/com/android/tools/idea/annotations/AnnotatedMethodsFinder.kt
@@ -146,7 +146,7 @@
   dataHolder: UserDataHolder,
   key: Key<CachedValue<T>>,
   provider: CachedValueProvider<T>,
-): T = runReadAction { this.getCachedValue(dataHolder, key, provider, false) }
+): T = this.getCachedValue(dataHolder, key, provider, false)
 
 /**
  * Finds if [vFile] in [project] has any of the given [annotationFqn] FQCN or the given
@@ -193,16 +193,14 @@
     psiFile,
     CacheKeysManager.getInstance(project).getKey(shortAnnotationName),
   ) {
-    val scope = GlobalSearchScope.fileScope(project, vFile)
+    val scope = runReadAction { GlobalSearchScope.fileScope(project, vFile) }
     val annotations =
       if (psiFile.language == KotlinLanguage.INSTANCE) {
-        ReadAction.compute<Sequence<PsiElement>, Throwable> {
-            KotlinAnnotationsIndex[shortAnnotationName, project, scope].asSequence()
-          }
-          .filterIsInstance<KtAnnotationEntry>()
+        runReadAction { KotlinAnnotationsIndex[shortAnnotationName, project, scope] }
+          .asSequence()
           .map { it.psiOrParent }
       } else {
-        ReadAction.compute<Sequence<PsiElement>, Throwable> {
+        runReadAction {
           JavaAnnotationIndex.getInstance()
             .getAnnotations(shortAnnotationName, project, scope)
             .asSequence()
@@ -210,7 +208,10 @@
       }
 
     CachedValueProvider.Result.create(
-      annotations.toList().mapNotNull { it.toUElementOfType<UAnnotation>() }.distinct(),
+      annotations
+        .toList()
+        .mapNotNull { runReadAction { it.toUElementOfType<UAnnotation>() } }
+        .distinct(),
       psiFile,
     )
   }
@@ -321,7 +322,7 @@
 ): Collection<T> {
   val psiFile = getPsiFileSafely(project, vFile) ?: return emptyList()
   return withContext(AndroidDispatchers.workerThread) {
-    val promiseResult = runReadAction {
+    val promiseResult =
       CachedValuesManager.getManager(project)
         .getCachedValue(
           psiFile,
@@ -338,7 +339,6 @@
             toValues,
           ),
         )
-    }
     try {
       return@withContext promiseResult.await()
     } catch (_: Throwable) {
diff --git a/designer/src/com/android/tools/idea/common/error/DesignerCommonIssueNode.kt b/designer/src/com/android/tools/idea/common/error/DesignerCommonIssueNode.kt
index fe79fcd..da3b3d0 100644
--- a/designer/src/com/android/tools/idea/common/error/DesignerCommonIssueNode.kt
+++ b/designer/src/com/android/tools/idea/common/error/DesignerCommonIssueNode.kt
@@ -25,7 +25,6 @@
 import com.google.common.annotations.VisibleForTesting
 import com.google.wireless.android.sdk.stats.UniversalProblemsPanelEvent
 import com.intellij.codeHighlighting.HighlightDisplayLevel
-import com.intellij.designer.model.EmptyXmlTag
 import com.intellij.icons.AllIcons
 import com.intellij.ide.projectView.PresentationData
 import com.intellij.ide.projectView.impl.CompoundIconProvider
@@ -448,9 +447,7 @@
     if (project == null) {
       return null
     }
-    val navigatable =
-      (visualLintIssue.components.firstOrNull { it.tag == EmptyXmlTag.INSTANCE }?.navigatable
-        as? OpenFileDescriptor)
+    val navigatable = visualLintIssue.navigatable as? OpenFileDescriptor
     if (navigatable != null) {
       return MyOpenFileDescriptor(navigatable)
     }
diff --git a/designer/src/com/android/tools/idea/common/error/DesignerCommonIssuePanel.kt b/designer/src/com/android/tools/idea/common/error/DesignerCommonIssuePanel.kt
index 7c05811..ba31396 100644
--- a/designer/src/com/android/tools/idea/common/error/DesignerCommonIssuePanel.kt
+++ b/designer/src/com/android/tools/idea/common/error/DesignerCommonIssuePanel.kt
@@ -28,6 +28,7 @@
 import com.intellij.analysis.problemsView.toolWindow.ProblemsViewTab
 import com.intellij.ide.util.PropertiesComponent
 import com.intellij.openapi.Disposable
+import com.intellij.openapi.WeakReferenceDisposableWrapper
 import com.intellij.openapi.actionSystem.ActionGroup
 import com.intellij.openapi.actionSystem.ActionManager
 import com.intellij.openapi.actionSystem.CommonDataKeys
@@ -106,7 +107,7 @@
   init {
     Disposer.register(parentDisposable, this)
     name = initialPanelName
-    issueProvider = DesignToolsIssueProvider(parentDisposable, project, issueFilter, tabId)
+    issueProvider = DesignToolsIssueProvider(this, project, issueFilter, tabId)
     treeModel = DesignerCommonIssuePanelModelProvider.getInstance(project).createModel()
     treeModel.root = DesignerCommonIssueRoot(project, issueProvider, nodeFactoryProvider)
     updateIssueOrder()
@@ -316,7 +317,10 @@
   }
 
   fun addIssueSelectionListener(listener: IssueListener, parentDisposable: Disposable) {
-    Disposer.register(parentDisposable) { issueListeners.remove(listener) }
+    Disposer.register(
+      parentDisposable,
+      WeakReferenceDisposableWrapper { issueListeners.remove(listener) },
+    )
     issueListeners.add(listener)
   }
 
diff --git a/designer/src/com/android/tools/idea/common/error/DesignerCommonIssueProvider.kt b/designer/src/com/android/tools/idea/common/error/DesignerCommonIssueProvider.kt
index 4c270b7..49f0d51 100644
--- a/designer/src/com/android/tools/idea/common/error/DesignerCommonIssueProvider.kt
+++ b/designer/src/com/android/tools/idea/common/error/DesignerCommonIssueProvider.kt
@@ -38,6 +38,10 @@
 
   fun update()
 
+  fun activate()
+
+  fun deactivate()
+
   fun interface Filter : (Issue) -> Boolean
 }
 
@@ -91,6 +95,8 @@
       listeners.forEach { it.run() }
     }
 
+  private var isActive: Boolean = true
+
   init {
     Disposer.register(parentDisposable, this)
     val topic =
@@ -99,6 +105,9 @@
     messageBusConnection.subscribe(
       topic,
       IssueProviderListener { source, issues ->
+        if (!isActive) {
+          return@IssueProviderListener
+        }
         // If in UI Check, only update if issues come from the preview that this provider is
         // associated with
         if (
@@ -125,16 +134,30 @@
       FileEditorManagerListener.FILE_EDITOR_MANAGER,
       object : FileEditorManagerListener {
         override fun fileClosed(source: FileEditorManager, file: VirtualFile) {
+          if (!isActive) {
+            return
+          }
           listeners.forEach { it.run() }
         }
 
         override fun selectionChanged(event: FileEditorManagerEvent) {
+          if (!isActive) {
+            return
+          }
           listeners.forEach { it.run() }
         }
       },
     )
   }
 
+  override fun activate() {
+    isActive = true
+  }
+
+  override fun deactivate() {
+    isActive = false
+  }
+
   override fun getFilteredIssues(): List<Issue> {
     val values = synchronized(mapLock) { sourceToIssueMap.values.toList() }
     return values.flatten().filter(issueFilter).filter(viewOptionFilter)
diff --git a/designer/src/com/android/tools/idea/common/error/DesignerCommonIssueSidePanel.kt b/designer/src/com/android/tools/idea/common/error/DesignerCommonIssueSidePanel.kt
index 8f74045..9927cfb 100644
--- a/designer/src/com/android/tools/idea/common/error/DesignerCommonIssueSidePanel.kt
+++ b/designer/src/com/android/tools/idea/common/error/DesignerCommonIssueSidePanel.kt
@@ -19,8 +19,6 @@
 import com.android.tools.idea.uibuilder.visual.visuallint.VisualLintRenderIssue
 import com.android.utils.HtmlBuilder
 import com.intellij.analysis.problemsView.toolWindow.ProblemsView
-import com.intellij.designer.model.EmptyXmlTag
-import com.intellij.notebook.editor.BackedVirtualFile
 import com.intellij.openapi.Disposable
 import com.intellij.openapi.editor.Editor
 import com.intellij.openapi.editor.EditorFactory
@@ -212,21 +210,11 @@
     }
 
   private fun VisualLintRenderIssue.getAffectedFiles(): List<VirtualFile> {
-    val modelFiles =
-      models
-        .filter { model -> this.shouldHighlight(model) }
-        .map {
-          @Suppress("UnstableApiUsage") BackedVirtualFile.getOriginFileIfBacked(it.virtualFile)
-        }
-        .distinct()
-    val navigatableFile =
-      (components.firstOrNull { it.tag == EmptyXmlTag.INSTANCE }?.navigatable
-          as? OpenFileDescriptor)
-        ?.file
-    return if (navigatableFile == null || modelFiles.contains(navigatableFile)) {
-      modelFiles
+    val navigatableFile = (navigatable as? OpenFileDescriptor)?.file
+    return if (navigatableFile == null || affectedFiles.contains(navigatableFile)) {
+      affectedFiles
     } else {
-      modelFiles.toMutableList().apply { add(navigatableFile) }
+      affectedFiles.toMutableList().apply { add(navigatableFile) }
     }
   }
 
diff --git a/designer/src/com/android/tools/idea/common/error/Issue.kt b/designer/src/com/android/tools/idea/common/error/Issue.kt
index eecd422..d471d74 100644
--- a/designer/src/com/android/tools/idea/common/error/Issue.kt
+++ b/designer/src/com/android/tools/idea/common/error/Issue.kt
@@ -85,9 +85,6 @@
       }
 
     @JvmStatic
-    fun fromNlComponent(component: NlComponent): IssueSource = NlComponentIssueSource(component)
-
-    @JvmStatic
     fun fromNlModel(model: NlModel): IssueSource =
       object : IssueSource {
         override val files: Set<VirtualFile> = setOf(model.virtualFile)
diff --git a/designer/src/com/android/tools/idea/common/error/IssueModel.java b/designer/src/com/android/tools/idea/common/error/IssueModel.java
index c451ad6..18275de 100644
--- a/designer/src/com/android/tools/idea/common/error/IssueModel.java
+++ b/designer/src/com/android/tools/idea/common/error/IssueModel.java
@@ -97,7 +97,7 @@
 
   @Nullable
   public Issue getHighestSeverityIssue(@NotNull NlComponent component) {
-    IssueSource componentSource = IssueSource.fromNlComponent(component);
+    IssueSource componentSource = new NlComponentIssueSource(component);
     Issue[] filtered = myIssues.stream()
       .filter((it) -> componentSource.equals(it.getSource()))
       .toArray(size -> new Issue[size]);
diff --git a/designer/src/com/android/tools/idea/common/lint/LintAnnotationsModel.java b/designer/src/com/android/tools/idea/common/lint/LintAnnotationsModel.java
index 8ed8139..f9fd0c4 100644
--- a/designer/src/com/android/tools/idea/common/lint/LintAnnotationsModel.java
+++ b/designer/src/com/android/tools/idea/common/lint/LintAnnotationsModel.java
@@ -16,6 +16,7 @@
 package com.android.tools.idea.common.lint;
 
 import com.android.tools.idea.common.error.IssueSource;
+import com.android.tools.idea.common.error.NlComponentIssueSource;
 import com.android.tools.idea.common.model.NlComponent;
 import com.android.tools.idea.lint.common.AndroidLintInspectionBase;
 import com.android.tools.idea.lint.common.SuppressLintQuickFix;
@@ -151,7 +152,7 @@
                       @NotNull SmartPsiElementPointer<PsiElement> endElementPointer,
                       @Nullable LintFix quickfixData) {
       this.component = component;
-      this.issueSource = IssueSource.fromNlComponent(component);
+      this.issueSource = new NlComponentIssueSource(component);
       this.attribute = attribute;
       this.inspection = inspection;
       this.incident = incident;
diff --git a/designer/src/com/android/tools/idea/common/surface/DesignSurface.java b/designer/src/com/android/tools/idea/common/surface/DesignSurface.java
index 414efaf..2f1b2c9 100644
--- a/designer/src/com/android/tools/idea/common/surface/DesignSurface.java
+++ b/designer/src/com/android/tools/idea/common/surface/DesignSurface.java
@@ -23,6 +23,7 @@
 import com.android.annotations.VisibleForTesting;
 import com.android.annotations.concurrency.GuardedBy;
 import com.android.annotations.concurrency.UiThread;
+import com.android.tools.adtui.ZoomController;
 import com.android.tools.adtui.actions.ZoomType;
 import com.android.tools.adtui.common.SwingCoordinate;
 import com.android.tools.editor.PanZoomListener;
diff --git a/designer/src/com/android/tools/idea/uibuilder/actions/ConvertToComposeAction.kt b/designer/src/com/android/tools/idea/uibuilder/actions/ConvertToComposeAction.kt
new file mode 100644
index 0000000..0c3160c
--- /dev/null
+++ b/designer/src/com/android/tools/idea/uibuilder/actions/ConvertToComposeAction.kt
@@ -0,0 +1,132 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.tools.idea.uibuilder.actions
+
+import com.android.tools.idea.concurrency.AndroidCoroutineScope
+import com.android.tools.idea.concurrency.AndroidDispatchers.uiThread
+import com.android.tools.idea.concurrency.AndroidDispatchers.workerThread
+import com.android.tools.idea.studiobot.StudioBot
+import com.intellij.openapi.actionSystem.AnAction
+import com.intellij.openapi.actionSystem.AnActionEvent
+import com.intellij.openapi.actionSystem.CommonDataKeys.VIRTUAL_FILE
+import com.intellij.openapi.diagnostic.Logger
+import com.intellij.openapi.project.Project
+import com.intellij.openapi.ui.DialogWrapper
+import com.intellij.ui.components.JBScrollPane
+import com.intellij.ui.components.JBTextArea
+import com.intellij.util.ui.JBUI
+import java.awt.BorderLayout
+import javax.swing.JComponent
+import javax.swing.JPanel
+import kotlinx.coroutines.flow.toList
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
+
+/**
+ * Question to precede every layout when querying Studio Bot. The exact same question is used to
+ * train the model.
+ */
+private const val PROMPT_PREFIX =
+  "What's the Jetpack Compose equivalent of the following Android XML layout?"
+
+private const val ACTION_TITLE = "I am feeling Compose"
+
+class ConvertToComposeAction : AnAction(ACTION_TITLE) {
+  /**
+   * Prompts to be appended after [PROMPT_PREFIX] to improve the quality of the Studio Bot
+   * responses.
+   */
+  private val nShotPrompts =
+    listOf(
+      "Include imports in your answer.",
+      "Add a @Preview function.",
+      "Don't use ConstraintLayout.",
+      "Use material3, not material.",
+    )
+
+  private val logger = Logger.getInstance(ConvertToComposeAction::class.java)
+
+  override fun update(e: AnActionEvent) {
+    super.update(e)
+    // Only enable the action if user has opted-in to share context.
+    e.presentation.isEnabled = StudioBot.getInstance().isContextAllowed()
+  }
+
+  override fun actionPerformed(e: AnActionEvent) {
+    val xmlFile = e.getData(VIRTUAL_FILE)?.contentsToByteArray() ?: return
+    val project = e.project ?: return
+
+    val nShot = nShotPrompts.joinToString(" ")
+    val query = "$PROMPT_PREFIX ${nShot}\n\n${String(xmlFile)}"
+
+    val studioBot = StudioBot.getInstance()
+    try {
+      val validatedQueryRequest =
+        studioBot.aiExcludeService().validateQuery(project, query, listOf()).getOrThrow()
+      ComposeCodeDialog(project).run {
+        show()
+        AndroidCoroutineScope(disposable).launch(workerThread) {
+          // Note: you must complete the Studio Bot onboarding and enable context sharing, otherwise
+          // the following call will fail.
+          val response =
+            StudioBot.getInstance()
+              .model()
+              .sendQuery(validatedQueryRequest, StudioBot.RequestSource.DESIGN_TOOLS)
+              .toList()
+
+          withContext(uiThread) { updateContent(response.parseCode()) }
+        }
+      }
+    } catch (t: Throwable) {
+      logger.error("Error while trying to send query", t)
+    }
+  }
+
+  private class ComposeCodeDialog(project: Project) : DialogWrapper(project) {
+
+    private val textArea = JBTextArea("Sending query to Studio Bot...")
+
+    init {
+      isModal = false
+      super.init()
+    }
+
+    override fun createCenterPanel(): JComponent {
+      val scrollPane = JBScrollPane(textArea).apply { preferredSize = JBUI.size(600, 1000) }
+      return JPanel(BorderLayout()).apply { add(scrollPane, BorderLayout.CENTER) }
+    }
+
+    fun updateContent(content: String) {
+      textArea.text = content
+    }
+  }
+}
+
+/**
+ * Takes a list of strings returned by Studio Bot and returns the first Kotlin code found, stripping
+ * the formatting.
+ *
+ * See `LlmService#sendQuery` documentation for details about StudioBot's response formatting.
+ */
+private fun List<String>.parseCode(): String {
+  val kotlinPattern = "```kotlin\n"
+  forEach { chunk ->
+    if (chunk.startsWith(kotlinPattern)) {
+      return chunk.substringAfter(kotlinPattern).trimEnd('`')
+    }
+  }
+  return ""
+}
diff --git a/designer/src/com/android/tools/idea/uibuilder/editor/NlActionManager.java b/designer/src/com/android/tools/idea/uibuilder/editor/NlActionManager.java
index c1896ed..8f4df5e 100644
--- a/designer/src/com/android/tools/idea/uibuilder/editor/NlActionManager.java
+++ b/designer/src/com/android/tools/idea/uibuilder/editor/NlActionManager.java
@@ -24,8 +24,10 @@
 import com.android.tools.idea.common.model.NlComponent;
 import com.android.tools.idea.common.scene.SceneComponent;
 import com.android.tools.idea.common.surface.SceneView;
+import com.android.tools.idea.flags.StudioFlags;
 import com.android.tools.idea.ui.designer.overlays.OverlayConfiguration;
 import com.android.tools.idea.ui.designer.overlays.OverlayMenuAction;
+import com.android.tools.idea.uibuilder.actions.ConvertToComposeAction;
 import com.android.tools.idea.uibuilder.actions.ConvertToConstraintLayoutAction;
 import com.android.tools.idea.uibuilder.actions.DisableToolsVisibilityAndPositionInPreviewAction;
 import com.android.tools.idea.uibuilder.actions.MorphComponentAction;
@@ -242,6 +244,10 @@
     group.add(createRefactoringMenu());
 
     group.addSeparator();
+    if (StudioFlags.NELE_XML_TO_COMPOSE.get()) {
+      group.add(new ConvertToComposeAction());
+      group.addSeparator();
+    }
   }
 
   @Nullable
diff --git a/designer/src/com/android/tools/idea/uibuilder/editor/multirepresentation/sourcecode/SourceCodeEditorProvider.kt b/designer/src/com/android/tools/idea/uibuilder/editor/multirepresentation/sourcecode/SourceCodeEditorProvider.kt
index 6b81124..59ef88a 100644
--- a/designer/src/com/android/tools/idea/uibuilder/editor/multirepresentation/sourcecode/SourceCodeEditorProvider.kt
+++ b/designer/src/com/android/tools/idea/uibuilder/editor/multirepresentation/sourcecode/SourceCodeEditorProvider.kt
@@ -35,8 +35,10 @@
 import com.intellij.openapi.fileEditor.impl.text.TextEditorState
 import com.intellij.openapi.project.DumbAware
 import com.intellij.openapi.project.Project
+import com.intellij.openapi.util.ThrowableComputable
 import com.intellij.openapi.vfs.VirtualFile
 import com.intellij.psi.PsiManager
+import com.intellij.util.SlowOperations
 import com.intellij.util.xmlb.XmlSerializer
 import org.jdom.Attribute
 import org.jdom.Element
@@ -85,7 +87,10 @@
       log.debug("createEditor file=${file.path}")
     }
 
-    val psiFile = PsiManager.getInstance(project).findFile(file)!!
+    val psiFile =
+      SlowOperations.allowSlowOperations(
+        ThrowableComputable { PsiManager.getInstance(project).findFile(file)!! }
+      )
 
     val textEditor = TextEditorProvider.getInstance().createEditor(project, file) as TextEditor
     val multiRepresentationPreview = SourceCodePreview(psiFile, textEditor.editor, providers)
diff --git a/designer/src/com/android/tools/idea/uibuilder/handlers/motion/editor/MotionAccessoryPanel.java b/designer/src/com/android/tools/idea/uibuilder/handlers/motion/editor/MotionAccessoryPanel.java
index 90dd959..f8aa3d8 100644
--- a/designer/src/com/android/tools/idea/uibuilder/handlers/motion/editor/MotionAccessoryPanel.java
+++ b/designer/src/com/android/tools/idea/uibuilder/handlers/motion/editor/MotionAccessoryPanel.java
@@ -791,7 +791,7 @@
      * Otherwise, mLastProgress will be mapped to value in the range between myStartDegree and myEndDegree
      */
     float rotationDegree = myStartDegree + mLastProgress * (myEndDegree - myStartDegree);
-    myDesignSurface.setRotateSufaceDegree(rotationDegree);
+    myDesignSurface.setRotateSurfaceDegree(rotationDegree);
   }
 
   /**
@@ -800,6 +800,6 @@
   private void stopScreenRotating() {
     myStartDegree = Float.NaN;
     myEndDegree = Float.NaN;
-    myDesignSurface.setRotateSufaceDegree(Float.NaN);
+    myDesignSurface.setRotateSurfaceDegree(Float.NaN);
   }
 }
diff --git a/designer/src/com/android/tools/idea/uibuilder/property/NlIdPropertyItem.kt b/designer/src/com/android/tools/idea/uibuilder/property/NlIdPropertyItem.kt
index 10dbdd1..86e7ed0 100644
--- a/designer/src/com/android/tools/idea/uibuilder/property/NlIdPropertyItem.kt
+++ b/designer/src/com/android/tools/idea/uibuilder/property/NlIdPropertyItem.kt
@@ -29,8 +29,10 @@
 import com.intellij.openapi.actionSystem.ex.ActionUtil
 import com.intellij.openapi.actionSystem.impl.SimpleDataContext
 import com.intellij.openapi.command.undo.UndoManager
+import com.intellij.openapi.util.ThrowableComputable
 import com.intellij.psi.xml.XmlAttributeValue
 import com.intellij.refactoring.actions.RenameElementAction
+import com.intellij.util.SlowOperations
 import com.intellij.util.text.nullize
 import org.jetbrains.android.refactoring.renaming.NEW_NAME_RESOURCE
 
@@ -92,10 +94,15 @@
     get() = ""
 
   private fun readIdFromPsi(): String? {
-    val tag = firstTag ?: return null
-    return if (AndroidPsiUtils.isValid(tag))
-      AndroidPsiUtils.getAttributeSafely(tag, ANDROID_URI, ATTR_ID)
-    else null
+    return SlowOperations.allowSlowOperations(
+      ThrowableComputable {
+        firstTag?.let {
+          if (AndroidPsiUtils.isValid(it))
+            AndroidPsiUtils.getAttributeSafely(it, ANDROID_URI, ATTR_ID)
+          else null
+        }
+      }
+    )
   }
 
   private fun toValue(id: String): String? {
diff --git a/designer/src/com/android/tools/idea/uibuilder/scene/decorator/TextViewDecorator.java b/designer/src/com/android/tools/idea/uibuilder/scene/decorator/TextViewDecorator.java
index 70b4030..6eee19c 100644
--- a/designer/src/com/android/tools/idea/uibuilder/scene/decorator/TextViewDecorator.java
+++ b/designer/src/com/android/tools/idea/uibuilder/scene/decorator/TextViewDecorator.java
@@ -25,6 +25,7 @@
 import com.android.tools.idea.common.scene.draw.DisplayList;
 import com.android.tools.idea.common.scene.draw.DrawTextRegion;
 import com.android.tools.idea.uibuilder.handlers.constraint.drawing.decorator.TextWidgetConstants;
+import com.intellij.util.SlowOperations;
 import org.jetbrains.annotations.NotNull;
 
 import java.awt.*;
@@ -45,7 +46,7 @@
     String text = component.getNlComponent().getTagName();
     NlComponent nlc = component.getNlComponent();
 
-    int size = DrawTextRegion.getFont(nlc, DEFAULT_DIM);
+    int size = SlowOperations.allowSlowOperations(() -> DrawTextRegion.getFont(nlc, DEFAULT_DIM));
 
     String single = nlc.getAttribute(SdkConstants.ANDROID_URI, SdkConstants.ATTR_SINGLE_LINE);
     boolean singleLine = Boolean.parseBoolean(single);
diff --git a/designer/src/com/android/tools/idea/uibuilder/surface/AccessibilityLintIntegrator.kt b/designer/src/com/android/tools/idea/uibuilder/surface/AccessibilityLintIntegrator.kt
index 284977f..8fd73ab 100644
--- a/designer/src/com/android/tools/idea/uibuilder/surface/AccessibilityLintIntegrator.kt
+++ b/designer/src/com/android/tools/idea/uibuilder/surface/AccessibilityLintIntegrator.kt
@@ -19,7 +19,6 @@
 import com.android.SdkConstants.ATTR_IGNORE_A11Y_LINTS
 import com.android.SdkConstants.TOOLS_URI
 import com.android.resources.ResourceType
-import com.android.tools.idea.common.command.NlWriteCommandActionUtil
 import com.android.tools.idea.common.error.Issue
 import com.android.tools.idea.common.error.IssueModel
 import com.android.tools.idea.common.error.IssueProvider
@@ -30,9 +29,7 @@
 import com.android.tools.idea.common.model.NlModel
 import com.android.tools.idea.ui.resourcechooser.util.createResourcePickerDialog
 import com.android.tools.idea.ui.resourcemanager.ResourcePickerDialog
-import com.android.tools.idea.uibuilder.handlers.IncludeHandler
 import com.android.tools.idea.uibuilder.lint.createDefaultHyperLinkListener
-import com.android.tools.idea.uibuilder.model.getViewHandler
 import com.android.tools.idea.uibuilder.property.support.PICK_A_RESOURCE
 import com.android.tools.idea.validator.ValidatorData
 import com.android.tools.lint.detector.api.Category
@@ -78,7 +75,6 @@
   fun createIssue(
     result: ValidatorData.Issue,
     component: NlComponent,
-    model: NlModel,
     eventListener: NlAtfIssue.EventListener? = null,
   ) {
     component.getAttribute(TOOLS_URI, ATTR_IGNORE)?.let {
@@ -87,64 +83,14 @@
       }
     }
 
-    issues.add(NlAtfIssue(result, IssueSource.fromNlComponent(component), model, eventListener))
+    issues.add(NlAtfIssue(result, NlComponentIssueSource(component), eventListener))
   }
 }
 
-/** Issue created for <include> */
-class NlATFIncludeIssue(private val include: NlComponent) : Issue() {
-  override val summary: String
-    get() = "Included layout may contain accessibility issues."
-
-  override val description: String
-    get() = "We found some potential accessibility issues that may have came from included layout."
-
-  override val severity: HighlightSeverity
-    get() = HighlightSeverity.WARNING
-
-  override val source: IssueSource
-    get() = IssueSource.fromNlComponent(include)
-
-  override val category: String
-    get() = Category.A11Y.name
-
-  override val fixes: Stream<Fix>
-    get() {
-      val goto =
-        Fix("Open the layout", "Open the include layout.") {
-          include
-            .getViewHandler {}
-            ?.let { handler ->
-              if (handler is IncludeHandler) {
-                IncludeHandler.openIncludedLayout(include)
-              }
-            }
-        }
-      return Stream.of(goto)
-    }
-
-  override val suppresses: Stream<Suppress>
-    get() {
-      val ignore =
-        Suppress("Suppress", "Suppress this check if it is false positive.") {
-          val attr =
-            include.getAttribute(TOOLS_URI, ATTR_IGNORE).let {
-              if (it.isNullOrEmpty()) ATTR_IGNORE_A11Y_LINTS else "$it,$ATTR_IGNORE_A11Y_LINTS"
-            }
-          NlWriteCommandActionUtil.run(include, "Suppress A11Y lints") {
-            // Set attr automatically refreshes the surface.
-            include.setAttribute(TOOLS_URI, ATTR_IGNORE, attr)
-          }
-        }
-      return Stream.of(ignore)
-    }
-}
-
 /** Issue created by [ValidatorData.Issue] */
 open class NlAtfIssue(
   val result: ValidatorData.Issue,
-  issueSource: IssueSource,
-  private val model: NlModel,
+  issueSource: NlComponentIssueSource,
   private val eventListener: EventListener? = null,
 ) : Issue() {
 
@@ -264,12 +210,14 @@
 
   /** For compound fixes, all fixes should be gathered into one single undoable action. */
   private fun applyFixWrapper(fix: ValidatorData.Fix) {
-    val source = source
+    val source = source as NlComponentIssueSource
     if (fix is ValidatorData.SetViewAttributeFix && fix.mSuggestedValue.isEmpty()) {
       // If the suggested value is an empty string, let the user pick a string
       // resource as the suggested value
-      applySetViewAttributeFixWithEmptySuggestedValue(model, fix.mViewAttribute)
-    } else if (source is NlComponentIssueSource) {
+      source.component?.model?.let {
+        applySetViewAttributeFixWithEmptySuggestedValue(it, fix.mViewAttribute)
+      }
+    } else {
       applyFixImpl(fix, source)
     }
   }
@@ -297,22 +245,22 @@
       source.setAttribute(viewAttribute.mNamespaceUri, viewAttribute.mAttributeName, resourceName)
     }
   }
+}
 
-  @VisibleForTesting
-  fun applyFixImpl(fix: ValidatorData.Fix, source: NlAttributesHolder) {
-    when (fix) {
-      is ValidatorData.RemoveViewAttributeFix ->
-        source.removeAttribute(fix.mViewAttribute.mNamespaceUri, fix.mViewAttribute.mAttributeName)
-      is ValidatorData.SetViewAttributeFix ->
-        source.setAttribute(
-          fix.mViewAttribute.mNamespaceUri,
-          fix.mViewAttribute.mAttributeName,
-          fix.mSuggestedValue,
-        )
-      is ValidatorData.CompoundFix -> fix.mFixes.forEach { applyFixImpl(it, source) }
-      else -> {
-        // Do not apply the fix
-      }
+@VisibleForTesting
+fun applyFixImpl(fix: ValidatorData.Fix, source: NlAttributesHolder) {
+  when (fix) {
+    is ValidatorData.RemoveViewAttributeFix ->
+      source.removeAttribute(fix.mViewAttribute.mNamespaceUri, fix.mViewAttribute.mAttributeName)
+    is ValidatorData.SetViewAttributeFix ->
+      source.setAttribute(
+        fix.mViewAttribute.mNamespaceUri,
+        fix.mViewAttribute.mAttributeName,
+        fix.mSuggestedValue,
+      )
+    is ValidatorData.CompoundFix -> fix.mFixes.forEach { applyFixImpl(it, source) }
+    else -> {
+      // Do not apply the fix
     }
   }
 }
diff --git a/designer/src/com/android/tools/idea/uibuilder/surface/NlDesignSurface.java b/designer/src/com/android/tools/idea/uibuilder/surface/NlDesignSurface.java
index b0f01dd..22929a5 100644
--- a/designer/src/com/android/tools/idea/uibuilder/surface/NlDesignSurface.java
+++ b/designer/src/com/android/tools/idea/uibuilder/surface/NlDesignSurface.java
@@ -1102,7 +1102,7 @@
    * Set the rotation degree of the surface to simulate the phone rotation.
    * @param value angle of the rotation.
    */
-  public void setRotateSufaceDegree(float value) {
+  public void setRotateSurfaceDegree(float value) {
     myRotateSurfaceDegree = value;
   }
 
diff --git a/designer/src/com/android/tools/idea/uibuilder/surface/NlLayoutScanner.kt b/designer/src/com/android/tools/idea/uibuilder/surface/NlLayoutScanner.kt
index c319f48..3a9b346 100644
--- a/designer/src/com/android/tools/idea/uibuilder/surface/NlLayoutScanner.kt
+++ b/designer/src/com/android/tools/idea/uibuilder/surface/NlLayoutScanner.kt
@@ -135,7 +135,7 @@
           if (component == null) {
             issuesWithoutSources++
           } else {
-            lintIntegrator.createIssue(it, component, model, atfIssueEventListener)
+            lintIntegrator.createIssue(it, component, atfIssueEventListener)
           }
         }
         // TODO: b/180069618 revisit metrics. Should log each issue.
diff --git a/designer/src/com/android/tools/idea/uibuilder/visual/VisualizationForm.kt b/designer/src/com/android/tools/idea/uibuilder/visual/VisualizationForm.kt
index 20ea861..11a3e5d 100644
--- a/designer/src/com/android/tools/idea/uibuilder/visual/VisualizationForm.kt
+++ b/designer/src/com/android/tools/idea/uibuilder/visual/VisualizationForm.kt
@@ -363,7 +363,7 @@
       return
     }
     val file = PsiManager.getInstance(project).findFile(myFile!!)
-    val facet = (if (file != null) AndroidFacet.getInstance(file) else null) ?: return
+    var facet: AndroidFacet? = null
     updateActionToolbar(myActionToolbarPanel)
 
     // isRequestCancelled allows us to cancel the ongoing computation if it is not needed anymore.
@@ -374,8 +374,11 @@
     // Asynchronously load the model and refresh the preview once it's ready
     CompletableFuture.supplyAsync(
         {
+          facet =
+            (if (file != null) AndroidFacet.getInstance(file) else null)
+              ?: return@supplyAsync emptyList()
           // Hide the content while adding the models.
-          val models = myCurrentModelsProvider.createNlModels(this, file!!, facet)
+          val models = myCurrentModelsProvider.createNlModels(this, file!!, facet!!)
           if (models.isEmpty()) {
             myWorkBench.showLoading("No Device Found")
             return@supplyAsync null
@@ -419,7 +422,7 @@
               ApplicationManager.getApplication().invokeLater {
                 surface.unregisterIndicator(myProgressIndicator)
               }
-              if (!isRequestCancelled.get() && !facet.isDisposed) {
+              if (!isRequestCancelled.get() && facet?.isDisposed == false) {
                 activateEditor(models.isNotEmpty())
               } else {
                 removeAndDisposeModels(models)
diff --git a/designer/src/com/android/tools/idea/uibuilder/visual/visuallint/VisualLintAtfAnalysis.kt b/designer/src/com/android/tools/idea/uibuilder/visual/visuallint/VisualLintAtfAnalysis.kt
index 86da6ab..6271005 100644
--- a/designer/src/com/android/tools/idea/uibuilder/visual/visuallint/VisualLintAtfAnalysis.kt
+++ b/designer/src/com/android/tools/idea/uibuilder/visual/visuallint/VisualLintAtfAnalysis.kt
@@ -16,6 +16,7 @@
 package com.android.tools.idea.uibuilder.visual.visuallint
 
 import com.android.tools.idea.common.error.IssueSource
+import com.android.tools.idea.common.error.NlComponentIssueSource
 import com.android.tools.idea.common.model.NlComponent
 import com.android.tools.idea.common.model.NlModel
 import com.android.tools.idea.uibuilder.surface.NlAtfIssue
@@ -28,11 +29,9 @@
 import com.android.tools.idea.validator.ValidatorResult
 import com.android.tools.idea.validator.ValidatorUtil
 import com.android.tools.rendering.RenderResult
-import com.intellij.openapi.Disposable
-import com.intellij.openapi.util.Disposer
 import java.util.EnumSet
 
-class VisualLintAtfAnalysis(private val model: NlModel) : Disposable {
+class VisualLintAtfAnalysis(private val model: NlModel) {
 
   /**
    * Parses the layout and stores all metadata required for linking issues to source [NlComponent]
@@ -43,8 +42,6 @@
   var renderMetric = RenderResultMetricData()
 
   init {
-    Disposer.register(model, this)
-
     // Enable retrieving text character locations from TextView to improve the
     // accuracy of TextContrastCheck in ATF.
     LayoutValidator.setObtainCharacterLocations(true)
@@ -116,7 +113,7 @@
           if (component == null) {
             issuesWithoutSources++
           } else {
-            issues.add(VisualLintAtfIssue(it, component, model))
+            issues.add(VisualLintAtfIssue(it, component))
           }
         }
       }
@@ -130,22 +127,16 @@
     }
     return issues
   }
-
-  override fun dispose() {
-    layoutParser.clear()
-  }
 }
 
-class VisualLintAtfIssue(
-  result: ValidatorData.Issue,
-  val component: NlComponent,
-  private val sourceModel: NlModel,
-) :
-  NlAtfIssue(result, IssueSource.fromNlComponent(component), sourceModel),
-  VisualLintHighlightingIssue {
+class VisualLintAtfIssue(result: ValidatorData.Issue, component: NlComponent) :
+  NlAtfIssue(result, NlComponentIssueSource(component)), VisualLintHighlightingIssue {
 
   private val visualLintIssueSource =
-    VisualLintIssueProvider.VisualLintIssueSource(setOf(sourceModel), listOf(component))
+    VisualLintIssueProvider.VisualLintIssueSource(setOf(component.model), listOf(component))
+  private val sourceModel: NlModel?
+    get() = visualLintIssueSource.components.firstOrNull()?.model
+
   override val source: IssueSource
     get() = visualLintIssueSource
 
@@ -155,7 +146,7 @@
 
   fun appliedColorBlindFilter(): ColorBlindMode {
     return ColorBlindMode.values().firstOrNull {
-      sourceModel.modelDisplayName?.startsWith(it.displayName) ?: false
+      sourceModel?.modelDisplayName?.startsWith(it.displayName) ?: false
     } ?: ColorBlindMode.NONE
   }
 }
diff --git a/designer/src/com/android/tools/idea/uibuilder/visual/visuallint/VisualLintIssueProvider.kt b/designer/src/com/android/tools/idea/uibuilder/visual/visuallint/VisualLintIssueProvider.kt
index 3ed30e8..e2a744a 100644
--- a/designer/src/com/android/tools/idea/uibuilder/visual/visuallint/VisualLintIssueProvider.kt
+++ b/designer/src/com/android/tools/idea/uibuilder/visual/visuallint/VisualLintIssueProvider.kt
@@ -23,6 +23,7 @@
 import com.android.tools.idea.uibuilder.lint.getTextRange
 import com.android.utils.HtmlBuilder
 import com.google.common.collect.ImmutableCollection
+import com.intellij.designer.model.EmptyXmlTag
 import com.intellij.lang.annotation.HighlightSeverity
 import com.intellij.notebook.editor.BackedVirtualFile
 import com.intellij.openapi.Disposable
@@ -30,6 +31,7 @@
 import com.intellij.openapi.util.Disposer
 import com.intellij.openapi.util.TextRange
 import com.intellij.openapi.vfs.VirtualFile
+import com.intellij.pom.Navigatable
 import java.lang.ref.WeakReference
 import java.util.Objects
 import java.util.stream.Stream
@@ -96,9 +98,9 @@
 }
 
 /** Lint issues that is generated from visual sources (e.g. Layout Validation) */
-class VisualLintRenderIssue private constructor(private val builder: Builder) :
+class VisualLintRenderIssue private constructor(builder: Builder) :
   Issue(), VisualLintHighlightingIssue {
-  val models = builder.model?.let { mutableSetOf(it) } ?: mutableSetOf()
+  private val _models = builder.model?.let { mutableSetOf(it) } ?: mutableSetOf()
   private var isComponentSuppressed: (NlComponent) -> Boolean = { false }
   private val _components = builder.components!!
   private val allComponents
@@ -108,6 +110,9 @@
   val components
     get() = synchronized(_components) { _components.filterNot(isComponentSuppressed).toList() }
 
+  val models
+    get() = synchronized(_models) { _models.toSet() }
+
   val type: VisualLintErrorType = builder.type!!
   override val source = VisualLintIssueProvider.VisualLintIssueSource(models, components)
   override val summary = builder.summary!!
@@ -119,9 +124,9 @@
     return components.map { it.model }.contains(model)
   }
 
+  private val contentDescriptionProvider = builder.contentDescriptionProvider!!
   override val description: String
-    get() =
-      builder.contentDescriptionProvider!!.invoke(unsuppressedModelCount).stringBuilder.toString()
+    get() = contentDescriptionProvider.invoke(unsuppressedModelCount).stringBuilder.toString()
 
   /** Returns the text range of the issue. */
   private var range: TextRange? = null
@@ -132,6 +137,26 @@
     get() =
       suppressList.filter { it.action !is VisualLintSuppressTask || it.action.isValid() }.stream()
 
+  private var frozenNavigatable: Navigatable? = null
+
+  val navigatable: Navigatable?
+    get() =
+      frozenNavigatable ?: components.firstOrNull { it.tag == EmptyXmlTag.INSTANCE }?.navigatable
+
+  private var frozenAffectedFiles: List<VirtualFile> = emptyList()
+
+  val affectedFiles: List<VirtualFile>
+    get() =
+      frozenAffectedFiles.ifEmpty {
+        models
+          .filter { model -> this.shouldHighlight(model) }
+          .map {
+            @kotlin.Suppress("UnstableApiUsage")
+            BackedVirtualFile.getOriginFileIfBacked(it.virtualFile)
+          }
+          .distinct()
+      }
+
   init {
     runReadAction { updateRange() }
   }
@@ -154,12 +179,19 @@
 
   override fun hashCode() = Objects.hash(severity, summary, category)
 
+  private var frozenUnsuppressedModelCount = -1
+
   /** Get the number of [NlModel] which is not suppressed. */
   private val unsuppressedModelCount: Int
-    get() = components.map { it.model }.distinct().count()
+    get() =
+      if (frozenUnsuppressedModelCount >= 0) {
+        frozenUnsuppressedModelCount
+      } else {
+        components.map { it.model }.distinct().count()
+      }
 
   fun isSuppressed(): Boolean {
-    return components.isEmpty()
+    return unsuppressedModelCount == 0
   }
 
   fun addSuppress(suppress: Suppress) {
@@ -172,11 +204,37 @@
 
   fun combineWithIssue(issue: VisualLintRenderIssue) {
     synchronized(_components) { _components.addAll(issue.allComponents) }
-    models.addAll(issue.models)
+    synchronized(_models) { _models.addAll(issue.models) }
     issue.allComponents.forEach { source.addComponent(it) }
     issue.models.forEach { source.addModel(it) }
   }
 
+  /**
+   * This should be called when the previews that are at the origin of this issue have been
+   * discarded, so that the issue won't be updated anymore.
+   */
+  fun freeze() {
+    frozenNavigatable = navigatable
+    frozenUnsuppressedModelCount = unsuppressedModelCount
+    frozenAffectedFiles =
+      models
+        .filter { model -> this.shouldHighlight(model) }
+        .map {
+          @kotlin.Suppress("UnstableApiUsage")
+          BackedVirtualFile.getOriginFileIfBacked(it.virtualFile)
+        }
+        .distinct()
+    synchronized(_components) { _components.clear() }
+    synchronized(_models) { _models.clear() }
+  }
+
+  /** This should be called when the issue is going to be reused for a new preview. */
+  fun unfreeze() {
+    frozenNavigatable = null
+    frozenUnsuppressedModelCount = -1
+    frozenAffectedFiles = emptyList()
+  }
+
   /** Builder for [VisualLintRenderIssue] */
   data class Builder(
     var summary: String? = null,
diff --git a/designer/src/com/android/tools/idea/uibuilder/visual/visuallint/analyzers/AtfAnalyzer.kt b/designer/src/com/android/tools/idea/uibuilder/visual/visuallint/analyzers/AtfAnalyzer.kt
index 1b04578..f56b862 100644
--- a/designer/src/com/android/tools/idea/uibuilder/visual/visuallint/analyzers/AtfAnalyzer.kt
+++ b/designer/src/com/android/tools/idea/uibuilder/visual/visuallint/analyzers/AtfAnalyzer.kt
@@ -23,6 +23,7 @@
 import com.android.tools.idea.uibuilder.visual.visuallint.VisualLintAtfIssue
 import com.android.tools.idea.uibuilder.visual.visuallint.VisualLintErrorType
 import com.android.tools.idea.uibuilder.visual.visuallint.VisualLintInspection
+import com.android.tools.idea.uibuilder.visual.visuallint.VisualLintIssueProvider
 import com.android.tools.rendering.RenderResult
 import com.android.utils.HtmlBuilder
 
@@ -44,20 +45,26 @@
     return atfIssues.map { createVisualLintIssueContent(it) }.toList()
   }
 
-  private fun createVisualLintIssueContent(issue: VisualLintAtfIssue) =
-    if (issue.appliedColorBlindFilter() != ColorBlindMode.NONE && issue.isLowContrast()) {
+  private fun createVisualLintIssueContent(issue: VisualLintAtfIssue): VisualLintIssueContent {
+    val viewInfo =
+      (issue.source as VisualLintIssueProvider.VisualLintIssueSource)
+        .components
+        .firstOrNull()
+        ?.viewInfo
+    return if (issue.appliedColorBlindFilter() != ColorBlindMode.NONE && issue.isLowContrast()) {
       VisualLintIssueContent(
-        issue.component.viewInfo,
+        viewInfo,
         COLOR_BLIND_ISSUE_SUMMARY,
         VisualLintErrorType.ATF_COLORBLIND,
       ) { count: Int ->
         colorBLindModeDescriptionProvider(issue, count)
       }
     } else {
-      VisualLintIssueContent(issue.component.viewInfo, issue.summary) { _: Int ->
+      VisualLintIssueContent(viewInfo, issue.summary) { _: Int ->
         HtmlBuilder().addHtml(issue.description)
       }
     }
+  }
 }
 
 class AtfAnalyzerInspection : VisualLintInspection(VisualLintErrorType.ATF, "atfBackground") {
diff --git a/designer/testSrc/com/android/tools/idea/common/error/DesignerCommonIssueNodeComparatorTest.kt b/designer/testSrc/com/android/tools/idea/common/error/DesignerCommonIssueNodeComparatorTest.kt
index a48aa48..218cbb5 100644
--- a/designer/testSrc/com/android/tools/idea/common/error/DesignerCommonIssueNodeComparatorTest.kt
+++ b/designer/testSrc/com/android/tools/idea/common/error/DesignerCommonIssueNodeComparatorTest.kt
@@ -265,7 +265,7 @@
 }
 
 private class TestAtfIssue(override val summary: String) :
-  NlAtfIssue(createIssueValidatorData(), IssueSource.NONE, mock(), null)
+  NlAtfIssue(createIssueValidatorData(), mock(), null)
 
 fun createIssueValidatorData(): ValidatorData.Issue {
   return ValidatorData.Issue.IssueBuilder()
diff --git a/designer/testSrc/com/android/tools/idea/common/error/IssueModelTest.java b/designer/testSrc/com/android/tools/idea/common/error/IssueModelTest.java
index ed447e3..5669a67 100644
--- a/designer/testSrc/com/android/tools/idea/common/error/IssueModelTest.java
+++ b/designer/testSrc/com/android/tools/idea/common/error/IssueModelTest.java
@@ -142,13 +142,13 @@
   public void testHighestSeverityIssue() {
     assertFalse(myIssueModel.hasIssues());
     NlComponent mockComponent = Mockito.mock(NlComponent.class, Mockito.RETURNS_DEEP_STUBS);
-    Issue expectedHighest = createIssue(HighlightSeverity.WARNING, IssueSource.fromNlComponent(mockComponent));
+    Issue expectedHighest = createIssue(HighlightSeverity.WARNING, new NlComponentIssueSource(mockComponent));
     myIssueModel.addIssueProvider(
       new IssueProvider() {
         @Override
         public void collectIssues(@NotNull ImmutableCollection.Builder<Issue> issueListBuilder) {
-          issueListBuilder.add(createIssue(HighlightSeverity.INFORMATION, IssueSource.fromNlComponent(mockComponent)));
-          issueListBuilder.add(createIssue(HighlightSeverity.INFORMATION, IssueSource.fromNlComponent(mockComponent)));
+          issueListBuilder.add(createIssue(HighlightSeverity.INFORMATION, new NlComponentIssueSource(mockComponent)));
+          issueListBuilder.add(createIssue(HighlightSeverity.INFORMATION, new NlComponentIssueSource(mockComponent)));
           issueListBuilder.add(expectedHighest);
         }
       });
diff --git a/designer/testSrc/com/android/tools/idea/common/error/IssuePanelProjectActivityTest.kt b/designer/testSrc/com/android/tools/idea/common/error/IssuePanelProjectActivityTest.kt
index 43d68c0..dddccce 100644
--- a/designer/testSrc/com/android/tools/idea/common/error/IssuePanelProjectActivityTest.kt
+++ b/designer/testSrc/com/android/tools/idea/common/error/IssuePanelProjectActivityTest.kt
@@ -74,11 +74,10 @@
 
       // The instance of IssuePanelService should be setup already because of
       // IssuePanelStartupActivity.
-      waitUntil(timeout = 1.seconds) { toolWindow.contentManager.contentCount == 2 }
-      assertEquals(
-        "Layout and Qualifiers".toTabTitle(),
-        toolWindow.contentManager.getContent(1)!!.displayName,
-      )
+      waitUntil(timeout = 5.seconds) { toolWindow.contentManager.contentCount == 2 }
+      waitUntil(timeout = 5.seconds) {
+        "Layout and Qualifiers".toTabTitle() == toolWindow.contentManager.getContent(1)?.displayName
+      }
 
       // Verify the issue panel exists even there is no IssueModel created.
       assertEquals(0, called)
diff --git a/designer/testSrc/com/android/tools/idea/common/error/IssueTest.java b/designer/testSrc/com/android/tools/idea/common/error/IssueTest.java
index 8aa4ebb..75a878e 100644
--- a/designer/testSrc/com/android/tools/idea/common/error/IssueTest.java
+++ b/designer/testSrc/com/android/tools/idea/common/error/IssueTest.java
@@ -99,9 +99,9 @@
 
   @Test
   public void testHashCode() {
-    int hash1 = new TestIssue("a", "b", IssueSource.fromNlComponent(component1), "d", HighlightSeverity.ERROR).hashCode();
-    int hash2 = new TestIssue("a", "b", IssueSource.fromNlComponent(component1), "d", HighlightSeverity.ERROR).hashCode();
-    int hash3 = new TestIssue("a", "e", IssueSource.fromNlComponent(component2), "d", HighlightSeverity.ERROR).hashCode();
+    int hash1 = new TestIssue("a", "b", new NlComponentIssueSource(component1), "d", HighlightSeverity.ERROR).hashCode();
+    int hash2 = new TestIssue("a", "b", new NlComponentIssueSource(component1), "d", HighlightSeverity.ERROR).hashCode();
+    int hash3 = new TestIssue("a", "e", new NlComponentIssueSource(component2), "d", HighlightSeverity.ERROR).hashCode();
     int hash4 = new TestIssue("a", "e", IssueSource.NONE, "d", HighlightSeverity.ERROR).hashCode();
     int hash5 = new TestIssue("a", "e", IssueSource.NONE, "d", HighlightSeverity.ERROR).hashCode();
     Assert.assertEquals(hash1, hash2);
@@ -113,13 +113,13 @@
 
   @Test
   public void testEqual() {
-    TestIssue er1 = new TestIssue("a", "b", IssueSource.fromNlComponent(component1), "d", HighlightSeverity.ERROR);
-    TestIssue er2 = new TestIssue("a", "b", IssueSource.fromNlComponent(component1), "d", HighlightSeverity.ERROR);
+    TestIssue er1 = new TestIssue("a", "b", new NlComponentIssueSource(component1), "d", HighlightSeverity.ERROR);
+    TestIssue er2 = new TestIssue("a", "b", new NlComponentIssueSource(component1), "d", HighlightSeverity.ERROR);
     Assert.assertEquals(er1, er2);
     Assert.assertEquals(er1.hashCode(), er2.hashCode());
 
-    TestIssue er3 = new TestIssue("a", "b", IssueSource.fromNlComponent(component1), "d", HighlightSeverity.ERROR);
-    TestIssue er4 = new TestIssue("a", "e", IssueSource.fromNlComponent(component2), "d", HighlightSeverity.ERROR);
+    TestIssue er3 = new TestIssue("a", "b", new NlComponentIssueSource(component1), "d", HighlightSeverity.ERROR);
+    TestIssue er4 = new TestIssue("a", "e", new NlComponentIssueSource(component2), "d", HighlightSeverity.ERROR);
     TestIssue er5 = new TestIssue("a", "e", IssueSource.NONE, "d", HighlightSeverity.ERROR);
     TestIssue er6 = new TestIssue("a", "e", IssueSource.NONE, "d", HighlightSeverity.ERROR);
     Assert.assertNotEquals(er3, er4);
diff --git a/designer/testSrc/com/android/tools/idea/common/error/Utils.kt b/designer/testSrc/com/android/tools/idea/common/error/Utils.kt
index 2c06f4d..50420cd 100644
--- a/designer/testSrc/com/android/tools/idea/common/error/Utils.kt
+++ b/designer/testSrc/com/android/tools/idea/common/error/Utils.kt
@@ -64,6 +64,10 @@
 
   override fun update() = Unit
 
+  override fun activate() = Unit
+
+  override fun deactivate() = Unit
+
   override fun dispose() = Unit
 }
 
@@ -90,7 +94,6 @@
     .summary(summary)
     .severity(HighlightSeverity.WARNING)
     .contentDescriptionProvider { HtmlBuilder() }
-    .model(components.first().model)
     .components(components.toMutableList())
     .type(type)
     .build()
diff --git a/designer/testSrc/com/android/tools/idea/common/surface/LayoutlibInteractionHandlerTest.kt b/designer/testSrc/com/android/tools/idea/common/surface/LayoutlibInteractionHandlerTest.kt
index 193084d..10753b0 100644
--- a/designer/testSrc/com/android/tools/idea/common/surface/LayoutlibInteractionHandlerTest.kt
+++ b/designer/testSrc/com/android/tools/idea/common/surface/LayoutlibInteractionHandlerTest.kt
@@ -15,6 +15,7 @@
  */
 package com.android.tools.idea.common.surface
 
+import com.android.tools.adtui.ZoomController
 import com.android.tools.adtui.Zoomable
 import com.android.tools.adtui.actions.ZoomType
 import com.android.tools.idea.common.fixtures.KeyEventBuilder
diff --git a/designer/testSrc/com/android/tools/idea/uibuilder/componenttree/NlComponentTreeDefinitionTest.kt b/designer/testSrc/com/android/tools/idea/uibuilder/componenttree/NlComponentTreeDefinitionTest.kt
index a2dfeb1..60bd446 100644
--- a/designer/testSrc/com/android/tools/idea/uibuilder/componenttree/NlComponentTreeDefinitionTest.kt
+++ b/designer/testSrc/com/android/tools/idea/uibuilder/componenttree/NlComponentTreeDefinitionTest.kt
@@ -43,7 +43,7 @@
 import com.android.tools.idea.common.error.IssueModel
 import com.android.tools.idea.common.error.IssuePanelService
 import com.android.tools.idea.common.error.IssueProvider
-import com.android.tools.idea.common.error.IssueSource
+import com.android.tools.idea.common.error.NlComponentIssueSource
 import com.android.tools.idea.common.error.TestIssue
 import com.android.tools.idea.common.fixtures.ComponentDescriptor
 import com.android.tools.idea.common.model.DnDTransferComponent
@@ -520,7 +520,7 @@
     val provider =
       object : IssueProvider() {
         override fun collectIssues(issueListBuilder: ImmutableCollection.Builder<Issue>) {
-          issueListBuilder.add(TestIssue("Problem", source = IssueSource.fromNlComponent(textView)))
+          issueListBuilder.add(TestIssue("Problem", source = NlComponentIssueSource(textView)))
         }
       }
     issues.addIssueProvider(provider)
diff --git a/designer/testSrc/com/android/tools/idea/uibuilder/surface/AccessibilityLintIntegratorTest.kt b/designer/testSrc/com/android/tools/idea/uibuilder/surface/AccessibilityLintIntegratorTest.kt
index e241404..ffdaee3 100644
--- a/designer/testSrc/com/android/tools/idea/uibuilder/surface/AccessibilityLintIntegratorTest.kt
+++ b/designer/testSrc/com/android/tools/idea/uibuilder/surface/AccessibilityLintIntegratorTest.kt
@@ -51,11 +51,7 @@
     val integrator = AccessibilityLintIntegrator(issueModel)
     assertTrue(integrator.issues.isEmpty())
 
-    integrator.createIssue(
-      createTestIssue(),
-      ScannerTestHelper().buildNlComponent(mockModel),
-      mockModel,
-    )
+    integrator.createIssue(createTestIssue(), ScannerTestHelper().buildNlComponent(mockModel))
 
     assertEquals(1, integrator.issues.size)
   }
@@ -69,7 +65,7 @@
     assertTrue(integrator.issues.isEmpty())
     for (i in 0 until numberOfIssues) {
       val issue = ScannerTestHelper.createTestIssueBuilder().setMsg(i.toString()).build()
-      integrator.createIssue(issue, ScannerTestHelper().buildNlComponent(mockModel), mockModel)
+      integrator.createIssue(issue, ScannerTestHelper().buildNlComponent(mockModel))
     }
     assertEquals(numberOfIssues, integrator.issues.size)
 
@@ -83,11 +79,7 @@
   fun disableAccessibilityLint() {
     val issueModel: IssueModel = Mockito.mock(IssueModel::class.java)
     val integrator = AccessibilityLintIntegrator(issueModel)
-    integrator.createIssue(
-      createTestIssue(),
-      ScannerTestHelper().buildNlComponent(mockModel),
-      mockModel,
-    )
+    integrator.createIssue(createTestIssue(), ScannerTestHelper().buildNlComponent(mockModel))
     assertEquals(1, integrator.issues.size)
 
     integrator.clear()
@@ -98,11 +90,7 @@
   fun populateLints() {
     val issueModel: IssueModel = Mockito.mock(IssueModel::class.java)
     val integrator = AccessibilityLintIntegrator(issueModel)
-    integrator.createIssue(
-      createTestIssue(),
-      ScannerTestHelper().buildNlComponent(mockModel),
-      mockModel,
-    )
+    integrator.createIssue(createTestIssue(), ScannerTestHelper().buildNlComponent(mockModel))
     assertEquals(1, integrator.issues.size)
 
     integrator.populateLints()
diff --git a/designer/testSrc/com/android/tools/idea/uibuilder/surface/NlATFIncludeIssueTest.kt b/designer/testSrc/com/android/tools/idea/uibuilder/surface/NlATFIncludeIssueTest.kt
deleted file mode 100644
index 0127973..0000000
--- a/designer/testSrc/com/android/tools/idea/uibuilder/surface/NlATFIncludeIssueTest.kt
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.tools.idea.uibuilder.surface
-
-import com.android.SdkConstants
-import com.android.tools.idea.common.error.IssueSource
-import com.android.tools.idea.common.model.NlComponent
-import com.android.tools.idea.uibuilder.LayoutTestCase
-import com.android.tools.lint.detector.api.Category
-import com.intellij.lang.annotation.HighlightSeverity
-import com.intellij.util.containers.getIfSingle
-import org.junit.Assert.*
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
-import org.mockito.MockitoAnnotations
-
-@RunWith(JUnit4::class)
-class NlATFIncludeIssueTest : LayoutTestCase() {
-
-  public override fun setUp() {
-    super.setUp()
-    MockitoAnnotations.openMocks(this)
-  }
-
-  @Test
-  fun createIssue() {
-    val source: NlComponent = NlScannerLayoutParserTest.createComponentWithInclude()
-    val atfIssue = NlATFIncludeIssue(source)
-
-    assertEquals(HighlightSeverity.WARNING, atfIssue.severity)
-    assertNotEquals(IssueSource.NONE, atfIssue.source)
-    assertEquals(Category.A11Y.name, atfIssue.category)
-    assertEquals(1, atfIssue.fixes.count())
-    assertEquals(1, atfIssue.suppresses.count())
-  }
-
-  @Test
-  fun ignoreIssue() {
-    val model =
-      model(
-          "linear.xml",
-          component(SdkConstants.LINEAR_LAYOUT)
-            .withBounds(0, 0, 1000, 1000)
-            .id("@id/linear")
-            .matchParentWidth()
-            .matchParentHeight()
-            .children(component(SdkConstants.VIEW_INCLUDE)),
-        )
-        .build()
-
-    val source: NlComponent = model.components[0].getChild(0)!!
-    val atfIssue = NlATFIncludeIssue(source)
-
-    val ignore = atfIssue.suppresses.getIfSingle()!!
-    ignore.action.run()
-    assertEquals(
-      SdkConstants.ATTR_IGNORE_A11Y_LINTS,
-      source.getAttribute(SdkConstants.TOOLS_URI, SdkConstants.ATTR_IGNORE),
-    )
-  }
-
-  @Test
-  fun goto() {
-    val model =
-      model(
-          "linear.xml",
-          component(SdkConstants.LINEAR_LAYOUT)
-            .withBounds(0, 0, 1000, 1000)
-            .id("@id/linear")
-            .matchParentWidth()
-            .matchParentHeight()
-            .children(component(SdkConstants.VIEW_INCLUDE)),
-        )
-        .build()
-
-    val source: NlComponent = model.components[0].getChild(0)!!
-    val atfIssue = NlATFIncludeIssue(source)
-
-    var openLayoutFixFound = false
-    atfIssue.fixes
-      .filter { it.buttonText == "Open the layout" }
-      .forEach { openLayoutFixFound = true }
-    assertTrue(openLayoutFixFound)
-  }
-}
diff --git a/designer/testSrc/com/android/tools/idea/uibuilder/surface/NlAtfIssueTest.kt b/designer/testSrc/com/android/tools/idea/uibuilder/surface/NlAtfIssueTest.kt
index c8ac4cc..eafcd5b 100644
--- a/designer/testSrc/com/android/tools/idea/uibuilder/surface/NlAtfIssueTest.kt
+++ b/designer/testSrc/com/android/tools/idea/uibuilder/surface/NlAtfIssueTest.kt
@@ -17,8 +17,8 @@
 
 import com.android.SdkConstants.ANDROID_URI
 import com.android.tools.idea.common.error.IssueSource
+import com.android.tools.idea.common.error.NlComponentIssueSource
 import com.android.tools.idea.common.model.NlAttributesHolder
-import com.android.tools.idea.common.model.NlModel
 import com.android.tools.idea.uibuilder.LayoutTestCase
 import com.android.tools.idea.validator.ValidatorData
 import com.intellij.lang.annotation.HighlightSeverity
@@ -29,15 +29,17 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
+import org.mockito.ArgumentMatchers.anyString
 import org.mockito.Mock
 import org.mockito.Mockito.verify
+import org.mockito.Mockito.`when`
 import org.mockito.MockitoAnnotations
 
 @RunWith(JUnit4::class)
 class NlAtfIssueTest : LayoutTestCase() {
 
   @Mock lateinit var mockEventListener: NlAtfIssue.EventListener
-  @Mock lateinit var mockModel: NlModel
+  @Mock lateinit var mockSource: NlComponentIssueSource
 
   @Before
   fun setup() {
@@ -60,9 +62,9 @@
         .setLevel(level)
         .setSourceClass(srcClass)
         .build()
-    val issueSource = IssueSource.NONE
+    val issueSource = mockSource
 
-    val atfIssue = NlAtfIssue(result, issueSource, mockModel)
+    val atfIssue = NlAtfIssue(result, issueSource)
 
     assertEquals("Accessibility Issue", atfIssue.summary)
     assertEquals(msg, atfIssue.description)
@@ -88,7 +90,7 @@
         .setHelpfulUrl(helpfulLink)
         .build()
 
-    val atfIssue = NlAtfIssue(result, IssueSource.NONE, mockModel)
+    val atfIssue = NlAtfIssue(result, mockSource)
 
     assertTrue(atfIssue.description.contains(msg))
     assertTrue(atfIssue.description.contains("""<a href="$helpfulLink">"""))
@@ -98,7 +100,7 @@
   @Test
   fun testIgnoreButton() {
     val result = ScannerTestHelper.createTestIssueBuilder().build()
-    val atfIssue = NlAtfIssue(result, TestSource(), mockModel)
+    val atfIssue = NlAtfIssue(result, mockSource)
 
     assertEquals(0, atfIssue.fixes.count())
     assertEquals(1, atfIssue.suppresses.count())
@@ -108,10 +110,15 @@
 
   @Test
   fun testIgnoreClicked() {
-    val testSrc = TestSource()
     val srcClass = "SrcClass"
     val result = ScannerTestHelper.createTestIssueBuilder().setSourceClass(srcClass).build()
-    val atfIssue = NlAtfIssue(result, testSrc, mockModel, mockEventListener)
+    val atfIssue = NlAtfIssue(result, mockSource, mockEventListener)
+    val savedCalls = mutableListOf<String>()
+    `when`(mockSource.setAttribute(anyString(), anyString(), anyString())).then {
+      savedCalls.add(
+        "set: namespace=${it.getArgument<String?>(0)}, attribute=${it.getArgument<String>(1)}, value=${it.getArgument<String?>(2)}"
+      )
+    }
 
     assertEquals(0, atfIssue.fixes.count())
     assertEquals(1, atfIssue.suppresses.count())
@@ -121,19 +128,24 @@
 
     assertEquals(
       "set: namespace=http://schemas.android.com/tools, attribute=ignore, value=SrcClass",
-      testSrc.callsString(),
+      savedCalls.joinToString("\n"),
     )
   }
 
   @Test
   fun testIgnoreClickedIgnoreAlreadyExist() {
-    val testSrc = TestSource()
     val getAttrResult = "hardcodedText,someOtherLintToIgnore,test"
     val srcClass = "SrcClass"
 
-    testSrc.getAttrResult = getAttrResult
     val result = ScannerTestHelper.createTestIssueBuilder().setSourceClass(srcClass).build()
-    val atfIssue = NlAtfIssue(result, testSrc, mockModel)
+    val atfIssue = NlAtfIssue(result, mockSource)
+    val savedCalls = mutableListOf<String>()
+    `when`(mockSource.getAttribute(anyString(), anyString())).thenReturn(getAttrResult)
+    `when`(mockSource.setAttribute(anyString(), anyString(), anyString())).then {
+      savedCalls.add(
+        "set: namespace=${it.getArgument<String?>(0)}, attribute=${it.getArgument<String>(1)}, value=${it.getArgument<String?>(2)}"
+      )
+    }
 
     assertEquals(0, atfIssue.fixes.count())
     assertEquals(1, atfIssue.suppresses.count())
@@ -144,13 +156,12 @@
 
     assertEquals(
       "set: namespace=http://schemas.android.com/tools, attribute=ignore, value=hardcodedText,someOtherLintToIgnore,test,SrcClass",
-      testSrc.callsString(),
+      savedCalls.joinToString("\n"),
     )
   }
 
   @Test
   fun testFixClickedWithSetViewAttributeFix() {
-    val testSrc = TestSource()
     val attributeName = "textColor"
     val suggestedValue = "#FFFFFF"
     val fixDescription = "Set this item's android:textColor to #FFFFFF"
@@ -159,7 +170,7 @@
       ValidatorData.SetViewAttributeFix(viewAttribute, suggestedValue, fixDescription)
 
     val result = ScannerTestHelper.createTestIssueBuilder(setAttributeFix).build()
-    val atfIssue = NlAtfIssue(result, testSrc, mockModel, mockEventListener)
+    val atfIssue = NlAtfIssue(result, mockSource, mockEventListener)
 
     // Both fix button and ignore button are displayed
     assertEquals(1, atfIssue.fixes.count())
@@ -180,10 +191,7 @@
     val setAttributeFix =
       ValidatorData.SetViewAttributeFix(viewAttribute, suggestedValue, fixDescription)
 
-    val result = ScannerTestHelper.createTestIssueBuilder(setAttributeFix).build()
-    val atfIssue = NlAtfIssue(result, testSrc, mockModel, mockEventListener)
-
-    atfIssue.applyFixImpl(setAttributeFix, testSrc)
+    applyFixImpl(setAttributeFix, testSrc)
 
     assertEquals(
       "set: namespace=http://schemas.android.com/apk/res/android, attribute=textColor, value=#FFFFFF",
@@ -193,14 +201,13 @@
 
   @Test
   fun testFixClickedWithRemoveViewAttributeFix() {
-    val testSrc = TestSource()
     val attributeName = "contentDescription"
     val fixDescription = "Remove this item's android:textColor to #FFFFFF"
     val viewAttribute = ValidatorData.ViewAttribute(ANDROID_URI, "android", attributeName)
     val removeAttributeFix = ValidatorData.RemoveViewAttributeFix(viewAttribute, fixDescription)
 
     val result = ScannerTestHelper.createTestIssueBuilder(removeAttributeFix).build()
-    val atfIssue = NlAtfIssue(result, testSrc, mockModel)
+    val atfIssue = NlAtfIssue(result, mockSource)
 
     // Both fix button and ignore button are displayed
     assertEquals(1, atfIssue.fixes.count())
@@ -215,10 +222,7 @@
     val viewAttribute = ValidatorData.ViewAttribute(ANDROID_URI, "android", attributeName)
     val removeAttributeFix = ValidatorData.RemoveViewAttributeFix(viewAttribute, fixDescription)
 
-    val result = ScannerTestHelper.createTestIssueBuilder(removeAttributeFix).build()
-    val atfIssue = NlAtfIssue(result, testSrc, mockModel)
-
-    atfIssue.applyFixImpl(removeAttributeFix, testSrc)
+    applyFixImpl(removeAttributeFix, testSrc)
 
     assertEquals(
       "remove: namespace=http://schemas.android.com/apk/res/android, name=contentDescription",
@@ -228,7 +232,6 @@
 
   @Test
   fun testFixClickedWithCompoundFix() {
-    val testSrc = TestSource()
     val setAttributeName = "textColor"
     val suggestedValue = "#FFFFFF"
     val setViewAttribute = ValidatorData.ViewAttribute(ANDROID_URI, "android", setAttributeName)
@@ -243,7 +246,7 @@
       ValidatorData.CompoundFix(listOf(setAttributeFix, removeAttributeFix), fixDescription)
 
     val result = ScannerTestHelper.createTestIssueBuilder(compoundFix).build()
-    val atfIssue = NlAtfIssue(result, testSrc, mockModel)
+    val atfIssue = NlAtfIssue(result, mockSource)
 
     // Both fix button and ignore button are displayed
     assertEquals(1, atfIssue.fixes.count())
@@ -266,10 +269,7 @@
     val compoundFix =
       ValidatorData.CompoundFix(listOf(setAttributeFix, removeAttributeFix), fixDescription)
 
-    val result = ScannerTestHelper.createTestIssueBuilder(compoundFix).build()
-    val atfIssue = NlAtfIssue(result, testSrc, mockModel)
-
-    atfIssue.applyFixImpl(compoundFix, testSrc)
+    applyFixImpl(compoundFix, testSrc)
 
     assertEquals(
       """
diff --git a/designer/testSrc/com/android/tools/idea/uibuilder/surface/NlLayoutScannerMetricTrackerTest.kt b/designer/testSrc/com/android/tools/idea/uibuilder/surface/NlLayoutScannerMetricTrackerTest.kt
index 3534953..f7cc04b 100644
--- a/designer/testSrc/com/android/tools/idea/uibuilder/surface/NlLayoutScannerMetricTrackerTest.kt
+++ b/designer/testSrc/com/android/tools/idea/uibuilder/surface/NlLayoutScannerMetricTrackerTest.kt
@@ -18,8 +18,7 @@
 import com.android.SdkConstants
 import com.android.tools.idea.common.analytics.CommonNopTracker
 import com.android.tools.idea.common.analytics.CommonUsageTracker
-import com.android.tools.idea.common.error.IssueSource
-import com.android.tools.idea.common.model.NlModel
+import com.android.tools.idea.common.error.NlComponentIssueSource
 import com.android.tools.idea.uibuilder.LayoutTestCase
 import com.android.tools.idea.validator.ValidatorData
 import com.google.wireless.android.sdk.stats.LayoutEditorEvent
@@ -34,7 +33,7 @@
 class NlLayoutScannerMetricTrackerTest : LayoutTestCase() {
 
   @Mock lateinit var mockSurface: NlDesignSurface
-  @Mock lateinit var mockModel: NlModel
+  @Mock lateinit var mockSource: NlComponentIssueSource
 
   @Before
   fun setup() {
@@ -85,6 +84,6 @@
 
   private fun createTestNlAtfIssue(): NlAtfIssue {
     val issue: ValidatorData.Issue = ScannerTestHelper.createTestIssueBuilder().build()
-    return NlAtfIssue(issue, IssueSource.NONE, mockModel)
+    return NlAtfIssue(issue, mockSource)
   }
 }
diff --git a/device-manager-v2/testSrc/com/android/tools/idea/devicemanagerv2/DeviceNamePanelTest.kt b/device-manager-v2/testSrc/com/android/tools/idea/devicemanagerv2/DeviceNamePanelTest.kt
index 9a27608..cb13ca5 100644
--- a/device-manager-v2/testSrc/com/android/tools/idea/devicemanagerv2/DeviceNamePanelTest.kt
+++ b/device-manager-v2/testSrc/com/android/tools/idea/devicemanagerv2/DeviceNamePanelTest.kt
@@ -70,7 +70,7 @@
           )
           .line2Text(ZoneId.of("UTC"))
       )
-      .isEqualTo("Connected; device will expire at 7:15 PM")
+      .isAnyOf("Connected; device will expire at 7:15 PM","Connected; device will expire at 7:15\u202FPM")
 
     assertThat(
         Reservation(
@@ -82,7 +82,7 @@
           )
           .line2Text(ZoneId.of("UTC"))
       )
-      .isEqualTo("Device will expire at 7:15 PM")
+      .isAnyOf("Device will expire at 7:15 PM","Device will expire at 7:15\u202FPM")
 
     assertThat(
         Reservation(ReservationState.PENDING, "Connection pending", null, null, null)
diff --git a/inspectors-common/api-ide/src/com/android/tools/inspectors/common/api/ide/stacktrace/IntelliJCodeElement.kt b/inspectors-common/api-ide/src/com/android/tools/inspectors/common/api/ide/stacktrace/IntelliJCodeElement.kt
index 4bfa556..f099443 100644
--- a/inspectors-common/api-ide/src/com/android/tools/inspectors/common/api/ide/stacktrace/IntelliJCodeElement.kt
+++ b/inspectors-common/api-ide/src/com/android/tools/inspectors/common/api/ide/stacktrace/IntelliJCodeElement.kt
@@ -20,22 +20,19 @@
 import com.android.tools.inspectors.common.api.stacktrace.CodeElement
 import com.android.tools.inspectors.common.api.stacktrace.CodeElement.NO_PACKAGE
 import com.android.tools.inspectors.common.api.stacktrace.CodeElement.UNKONWN_CLASS
-import com.google.common.base.Strings
+import com.intellij.openapi.application.ApplicationManager
 import com.intellij.openapi.project.Project
 import com.intellij.openapi.roots.ProjectFileIndex
+import com.intellij.openapi.util.Computable
 import com.intellij.openapi.vfs.LocalFileSystem
-import com.intellij.openapi.vfs.VirtualFile
-import com.intellij.openapi.vfs.newvfs.impl.StubVirtualFile
 import com.intellij.psi.JavaPsiFacade
 import com.intellij.psi.search.GlobalSearchScope
 
-private val UNRESOLVED_CLASS_FILE: VirtualFile = StubVirtualFile()
-
-class IntelliJCodeElement(private val project: Project, private val codeLocation: CodeLocation) : CodeElement {
+class IntelliJCodeElement(private val project: Project, private val codeLocation: CodeLocation) :
+  CodeElement {
   private val packageName: String
   private val simpleClassName: String
-
-  private var cachedClassFile: VirtualFile? = UNRESOLVED_CLASS_FILE
+  private val isInUserCode: Boolean
 
   init {
     val className = codeLocation.className
@@ -45,8 +42,16 @@
     } else {
       val dot = className.lastIndexOf('.')
       packageName = if (dot <= 0) NO_PACKAGE else className.substring(0, dot)
-      simpleClassName = if (dot + 1 < className.length) className.substring(dot + 1) else UNKONWN_CLASS
+      simpleClassName =
+        if (dot + 1 < className.length) className.substring(dot + 1) else UNKONWN_CLASS
     }
+
+    isInUserCode =
+      when {
+        IdeInfo.isGameTool() -> false
+        codeLocation.isNativeCode -> isInNativeSources()
+        else -> isInSources()
+      }
   }
 
   override fun getCodeLocation() = codeLocation
@@ -59,45 +64,37 @@
     return codeLocation.methodName ?: CodeElement.UNKNOWN_METHOD
   }
 
-  override fun isInUserCode(): Boolean {
-    if (IdeInfo.isGameTool()) {
-      // For standalone game tools, source code navigation is not supported at this moment.
+  override fun isInUserCode() = isInUserCode
+
+  private fun isInNativeSources(): Boolean {
+    val sourceFileName = codeLocation.fileName ?: return false
+    if (sourceFileName.isEmpty()) {
+      return false
+    }
+    val file = LocalFileSystem.getInstance().findFileByPath(sourceFileName) ?: return false
+    val application = ApplicationManager.getApplication()
+    return application.runReadAction(
+      Computable { ProjectFileIndex.getInstance(project).isInSource(file) }
+    )
+  }
+
+  private fun isInSources(): Boolean {
+    if (codeLocation.className == null) {
       return false
     }
 
-    val sourceFile = if (codeLocation.isNativeCode) findSourceFile() else findClassFile()
-    return sourceFile != null && ProjectFileIndex.getInstance(project).isInSource(sourceFile)
-  }
+    // JavaPsiFacade can't deal with inner classes, so we'll need to strip the class name down to
+    // just the outer class name.
+    val className = codeLocation.outerClass
 
-  private fun findSourceFile(): VirtualFile? {
-    val sourceFileName = codeLocation.fileName
-    if (Strings.isNullOrEmpty(sourceFileName)) {
-      return null
-    }
-    return LocalFileSystem.getInstance().findFileByPath(sourceFileName!!)
-  }
-
-  private fun findClassFile(): VirtualFile? {
-    @Suppress("UseVirtualFileEquals")
-    if (cachedClassFile !== UNRESOLVED_CLASS_FILE) {
-      return cachedClassFile
-    }
-
-    var className = codeLocation.className
-    if (className == null) {
-      cachedClassFile = null
-      return null
-    }
-
-    // JavaPsiFacade can't deal with inner classes, so we'll need to strip the class name down to just the outer class name.
-    className = codeLocation.outerClass
-
-    val psiClass = JavaPsiFacade.getInstance(project).findClass(className, GlobalSearchScope.allScope(project))
-    if (psiClass == null) {
-      cachedClassFile = null
-      return null
-    }
-    cachedClassFile = psiClass.containingFile.virtualFile
-    return cachedClassFile
+    val psiFacade = JavaPsiFacade.getInstance(project)
+    val application = ApplicationManager.getApplication()
+    return application.runReadAction(
+      Computable {
+        val psiClass = psiFacade.findClass(className, GlobalSearchScope.allScope(project))
+        val file = psiClass?.containingFile?.virtualFile ?: return@Computable false
+        ProjectFileIndex.getInstance(project).isInSource(file)
+      }
+    )
   }
 }
diff --git a/inspectors-common/api-ide/src/com/android/tools/inspectors/common/api/ide/stacktrace/IntelliJStackTraceGroup.kt b/inspectors-common/api-ide/src/com/android/tools/inspectors/common/api/ide/stacktrace/IntelliJStackTraceGroup.kt
index 1371516..c803564 100644
--- a/inspectors-common/api-ide/src/com/android/tools/inspectors/common/api/ide/stacktrace/IntelliJStackTraceGroup.kt
+++ b/inspectors-common/api-ide/src/com/android/tools/inspectors/common/api/ide/stacktrace/IntelliJStackTraceGroup.kt
@@ -22,6 +22,7 @@
 import com.android.tools.inspectors.common.ui.stacktrace.StackTraceGroup
 import com.android.tools.inspectors.common.ui.stacktrace.StackTraceView
 import com.google.common.annotations.VisibleForTesting
+import com.intellij.openapi.Disposable
 import com.intellij.openapi.project.Project
 import javax.swing.JList
 import javax.swing.event.ListSelectionListener
@@ -35,11 +36,12 @@
   private val stackTraceViews: MutableList<IntelliJStackTraceView> = ArrayList()
 
   constructor(
-    project: Project
+    project: Project,
+    parentDisposable: Disposable,
   ) : this(
     project,
     { p: Project, m: StackTraceModel ->
-      val view = IntelliJStackTraceView(p, m)
+      val view = IntelliJStackTraceView(p, m, parentDisposable)
       val installer: ContextMenuInstaller = IntellijContextMenuInstaller()
       view.installNavigationContextMenu(installer)
       view.installGenericContextMenu(installer, ContextMenuItem.SEPARATOR)
diff --git a/inspectors-common/api-ide/src/com/android/tools/inspectors/common/api/ide/stacktrace/IntelliJStackTraceView.kt b/inspectors-common/api-ide/src/com/android/tools/inspectors/common/api/ide/stacktrace/IntelliJStackTraceView.kt
index 10b7e75..1b82146 100644
--- a/inspectors-common/api-ide/src/com/android/tools/inspectors/common/api/ide/stacktrace/IntelliJStackTraceView.kt
+++ b/inspectors-common/api-ide/src/com/android/tools/inspectors/common/api/ide/stacktrace/IntelliJStackTraceView.kt
@@ -20,6 +20,9 @@
 import com.android.tools.adtui.stdui.StandardColors.DEFAULT_CONTENT_BACKGROUND_COLOR
 import com.android.tools.idea.codenavigation.CodeLocation
 import com.android.tools.idea.codenavigation.CodeLocation.INVALID_LINE_NUMBER
+import com.android.tools.idea.concurrency.AndroidCoroutineScope
+import com.android.tools.idea.concurrency.AndroidDispatchers.uiThread
+import com.android.tools.idea.concurrency.AndroidExecutors
 import com.android.tools.inspectors.common.api.stacktrace.CodeElement
 import com.android.tools.inspectors.common.api.stacktrace.StackElement
 import com.android.tools.inspectors.common.api.stacktrace.StackTraceModel
@@ -31,9 +34,11 @@
 import com.android.tools.inspectors.common.ui.ContextMenuInstaller
 import com.android.tools.inspectors.common.ui.stacktrace.StackTraceView
 import com.google.common.annotations.VisibleForTesting
+import com.google.common.util.concurrent.MoreExecutors
 import com.intellij.icons.AllIcons
 import com.intellij.ide.CopyProvider
 import com.intellij.ide.DataManager
+import com.intellij.openapi.Disposable
 import com.intellij.openapi.actionSystem.ActionUpdateThread.BGT
 import com.intellij.openapi.actionSystem.DataContext
 import com.intellij.openapi.actionSystem.DataProvider
@@ -52,6 +57,7 @@
 import com.intellij.ui.components.JBList
 import com.intellij.ui.components.JBScrollPane
 import com.intellij.util.ui.JBUI
+import kotlinx.coroutines.asCoroutineDispatcher
 import java.awt.Insets
 import java.awt.datatransfer.StringSelection
 import java.awt.event.KeyAdapter
@@ -66,6 +72,9 @@
 import javax.swing.ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED
 import javax.swing.SwingUtilities
 import javax.swing.event.ListSelectionListener
+import kotlinx.coroutines.channels.Channel
+import kotlinx.coroutines.launch
+import kotlinx.coroutines.withContext
 
 private val LIST_ROW_INSETS: Insets = JBUI.insets(2, 10, 0, 0)
 
@@ -74,6 +83,7 @@
 internal constructor(
   private val project: Project,
   private val model: StackTraceModel,
+  parentDisposable: Disposable,
   private val generator: (Project, CodeLocation) -> CodeElement,
 ) : AspectObserver(), StackTraceView, DataProvider, CopyProvider {
 
@@ -85,8 +95,14 @@
 
   constructor(
     project: Project,
-    model: StackTraceModel
-  ) : this(project, model, { p: Project, l: CodeLocation -> IntelliJCodeElement(p, l) })
+    model: StackTraceModel,
+    parentDisposable: Disposable,
+  ) : this(
+    project,
+    model,
+    parentDisposable,
+    { p: Project, l: CodeLocation -> IntelliJCodeElement(p, l) }
+  )
 
   init {
     listView.selectionMode = SINGLE_SELECTION
@@ -151,17 +167,23 @@
       }
     )
 
+    // A scope that we will be using to load the list model in the background
+    val scope = AndroidCoroutineScope(parentDisposable)
+    val dispatcher = MoreExecutors.newSequentialExecutor(AndroidExecutors.getInstance().workerThreadExecutor).asCoroutineDispatcher()
     model
       .addDependency(this)
       .onChange(STACK_FRAMES) {
-        val stackFrames = model.codeLocations
-        listModel.removeAllElements()
-        listView.clearSelection()
-        stackFrames.forEach { listModel.addElement(generator(project, it)) }
-
-        val threadId = model.threadId
-        if (threadId != INVALID_THREAD_ID) {
-          listModel.addElement(ThreadElement(threadId))
+        scope.launch(dispatcher) {
+          val elements = model.codeLocations.map { generator(project, it) }
+          withContext(uiThread) {
+            listModel.removeAllElements()
+            listView.clearSelection()
+            listModel.addAll(elements)
+            val threadId = model.threadId
+            if (threadId != INVALID_THREAD_ID) {
+              listModel.addElement(ThreadElement(threadId))
+            }
+          }
         }
       }
       .onChange(SELECTED_LOCATION) {
diff --git a/inspectors-common/api-ide/testSrc/com/android/tools/inspectors/common/api/ide/stacktrace/IntelliJStackTraceGroupTest.java b/inspectors-common/api-ide/testSrc/com/android/tools/inspectors/common/api/ide/stacktrace/IntelliJStackTraceGroupTest.java
deleted file mode 100644
index 627dbcc..0000000
--- a/inspectors-common/api-ide/testSrc/com/android/tools/inspectors/common/api/ide/stacktrace/IntelliJStackTraceGroupTest.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (C) 2021 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.tools.inspectors.common.api.ide.stacktrace;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.android.tools.inspectors.common.api.stacktrace.StackTraceModel;
-import com.intellij.testFramework.ProjectRule;
-import org.junit.Rule;
-import org.junit.Test;
-
-public class IntelliJStackTraceGroupTest {
-  private static final String STACK_STRING_A =
-    "com.example.FakeA.func1(FakeA.java:123)\n" +
-    "com.example.FakeA.func2(FakeA.java:456)\n" +
-    "com.example.FakeA.func3(FakeA.java:789)\n";
-
-  private static final String STACK_STRING_B =
-    "com.example.FakeB.func1(FakeB.java:123)\n" +
-    "com.example.FakeB.func2(FakeB.java:456)\n" +
-    "com.example.FakeB.func3(FakeB.java:789)\n" +
-    "com.example.FakeB.func4(FakeB.java:1011)\n";
-
-  @Rule
-  public final ProjectRule myProjectRule = new ProjectRule();
-
-  @Test
-  public void canOnlySelectOneStackTraceViewAtATime() {
-    IntelliJStackTraceGroup group = new IntelliJStackTraceGroup(
-      myProjectRule.getProject(),
-      (IntelliJStackTraceViewTest::createStackTraceView));
-
-    StackTraceModel model1 = IntelliJStackTraceViewTest.createStackTraceModel();
-    StackTraceModel model2 = IntelliJStackTraceViewTest.createStackTraceModel();
-
-    // IntelliJStackTraceGroup always creates IntelliJStackTraceView instances
-    IntelliJStackTraceView view1 = (IntelliJStackTraceView)group.createStackView(model1);
-    IntelliJStackTraceView view2 = (IntelliJStackTraceView)group.createStackView(model2);
-
-    model1.setStackFrames(STACK_STRING_A);
-    model2.setStackFrames(STACK_STRING_B);
-
-    assertThat(view1.getListView().getSelectedIndex()).isLessThan(0);
-    assertThat(view2.getListView().getSelectedIndex()).isLessThan(0);
-
-    view1.getListView().setSelectedIndex(1);
-
-    assertThat(view1.getListView().getSelectedIndex()).isEqualTo(1);
-    assertThat(view2.getListView().getSelectedIndex()).isLessThan(0);
-
-    view2.getListView().setSelectedIndex(2);
-
-    assertThat(view1.getListView().getSelectedIndex()).isLessThan(0);
-    assertThat(view2.getListView().getSelectedIndex()).isEqualTo(2);
-  }
-}
diff --git a/inspectors-common/api-ide/testSrc/com/android/tools/inspectors/common/api/ide/stacktrace/IntelliJStackTraceGroupTest.kt b/inspectors-common/api-ide/testSrc/com/android/tools/inspectors/common/api/ide/stacktrace/IntelliJStackTraceGroupTest.kt
new file mode 100644
index 0000000..2fac05a
--- /dev/null
+++ b/inspectors-common/api-ide/testSrc/com/android/tools/inspectors/common/api/ide/stacktrace/IntelliJStackTraceGroupTest.kt
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.tools.inspectors.common.api.ide.stacktrace
+
+import com.android.testutils.delayUntilCondition
+import com.android.tools.inspectors.common.api.stacktrace.StackTraceModel
+import com.google.common.truth.Truth.assertThat
+import com.intellij.openapi.project.Project
+import com.intellij.testFramework.DisposableRule
+import com.intellij.testFramework.ProjectRule
+import kotlinx.coroutines.runBlocking
+import org.junit.Rule
+import org.junit.Test
+
+class IntelliJStackTraceGroupTest {
+  @get:Rule val projectRule: ProjectRule = ProjectRule()
+
+  @get:Rule val disposableRule: DisposableRule = DisposableRule()
+
+  @Test
+  fun canOnlySelectOneStackTraceViewAtATime() =
+    runBlocking<Unit> {
+      val group =
+        IntelliJStackTraceGroup(projectRule.project) { project: Project?, model: StackTraceModel? ->
+          IntelliJStackTraceViewTest.createStackTraceView(project, model, disposableRule.disposable)
+        }
+
+      val model1 = IntelliJStackTraceViewTest.createStackTraceModel()
+      val model2 = IntelliJStackTraceViewTest.createStackTraceModel()
+
+      // IntelliJStackTraceGroup always creates IntelliJStackTraceView instances
+      val view1 = group.createStackView(model1) as IntelliJStackTraceView
+      val view2 = group.createStackView(model2) as IntelliJStackTraceView
+
+      model1.setStackFrames(STACK_STRING_A)
+      model2.setStackFrames(STACK_STRING_B)
+
+      delayUntilCondition(200) { view1.listView.model.size > 0 && view2.listView.model.size > 0 }
+      assertThat(view1.listView.selectedIndex).isLessThan(0)
+      assertThat(view2.listView.selectedIndex).isLessThan(0)
+
+      view1.listView.selectedIndex = 1
+
+      assertThat(view1.listView.selectedIndex).isEqualTo(1)
+      assertThat(view2.listView.selectedIndex).isLessThan(0)
+
+      view2.listView.selectedIndex = 2
+
+      assertThat(view1.listView.selectedIndex).isLessThan(0)
+      assertThat(view2.listView.selectedIndex).isEqualTo(2)
+    }
+
+  companion object {
+    private const val STACK_STRING_A =
+      "com.example.FakeA.func1(FakeA.java:123)\n" +
+        "com.example.FakeA.func2(FakeA.java:456)\n" +
+        "com.example.FakeA.func3(FakeA.java:789)\n"
+
+    private const val STACK_STRING_B =
+      "com.example.FakeB.func1(FakeB.java:123)\n" +
+        "com.example.FakeB.func2(FakeB.java:456)\n" +
+        "com.example.FakeB.func3(FakeB.java:789)\n" +
+        "com.example.FakeB.func4(FakeB.java:1011)\n"
+  }
+}
diff --git a/inspectors-common/api-ide/testSrc/com/android/tools/inspectors/common/api/ide/stacktrace/IntelliJStackTraceViewTest.java b/inspectors-common/api-ide/testSrc/com/android/tools/inspectors/common/api/ide/stacktrace/IntelliJStackTraceViewTest.java
index d6ec984..a00e769 100644
--- a/inspectors-common/api-ide/testSrc/com/android/tools/inspectors/common/api/ide/stacktrace/IntelliJStackTraceViewTest.java
+++ b/inspectors-common/api-ide/testSrc/com/android/tools/inspectors/common/api/ide/stacktrace/IntelliJStackTraceViewTest.java
@@ -15,9 +15,13 @@
  */
 package com.android.tools.inspectors.common.api.ide.stacktrace;
 
+import static com.android.tools.inspectors.common.api.stacktrace.ThreadId.INVALID_THREAD_ID;
 import static com.google.common.truth.Truth.assertThat;
 import static java.awt.event.KeyEvent.VK_ENTER;
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.junit.Assert.fail;
 
+import com.android.testutils.AsyncTestUtils;
 import com.android.tools.adtui.model.AspectObserver;
 import com.android.tools.adtui.swing.FakeMouse;
 import com.android.tools.adtui.swing.FakeUi;
@@ -26,17 +30,18 @@
 import com.android.tools.idea.codenavigation.CodeNavigator;
 import com.android.tools.idea.codenavigation.FakeNavSource;
 import com.android.tools.inspectors.common.api.stacktrace.CodeElement;
+import com.android.tools.inspectors.common.api.stacktrace.StackElement;
 import com.android.tools.inspectors.common.api.stacktrace.StackFrameParser;
 import com.android.tools.inspectors.common.api.stacktrace.StackTraceModel;
 import com.android.tools.inspectors.common.api.stacktrace.ThreadElement;
 import com.android.tools.inspectors.common.api.stacktrace.ThreadId;
+import com.intellij.openapi.Disposable;
 import com.intellij.openapi.project.Project;
-import com.intellij.testFramework.EdtRule;
+import com.intellij.testFramework.DisposableRule;
 import com.intellij.testFramework.ProjectRule;
-import com.intellij.testFramework.RunsInEdt;
-import java.lang.reflect.InvocationTargetException;
 import java.util.Arrays;
 import java.util.List;
+import java.util.concurrent.TimeoutException;
 import javax.swing.JList;
 import javax.swing.ListModel;
 import javax.swing.ListSelectionModel;
@@ -45,26 +50,26 @@
 import org.junit.Rule;
 import org.junit.Test;
 
-@RunsInEdt
 public class IntelliJStackTraceViewTest {
   private static final String STACK_STRING =
-    "com.example.android.displayingbitmaps.util.ImageFetcher.downloadUrlToStream(ImageFetcher.java:274)\n" +
-    "com.example.android.displayingbitmaps.util.ImageFetcher.processBitmap(ImageFetcher.java:214)\n" +
-    "com.example.android.displayingbitmaps.util.ImageFetcher.processBitmap(ImageFetcher.java:257)\n" +
-    "com.example.android.displayingbitmaps.util.ImageWorker$BitmapWorkerTask.doInBackground(ImageWorker.java:312)\n" +
-    "com.example.android.displayingbitmaps.util.ImageWorker$BitmapWorkerTask.doInBackground(ImageWorker.java:257)\n" +
-    "com.example.android.displayingbitmaps.util.AsyncTask$2.call(AsyncTask.java:313)\n" +
-    "java.util.concurrent.FutureTask.run(FutureTask.java:237)\n" +
-    "java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)\n" +
-    "java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)\n" +
-    "java.lang.Thread.run(Thread.java:761)";
+    """
+      com.example.android.displayingbitmaps.util.ImageFetcher.downloadUrlToStream(ImageFetcher.java:274)
+      com.example.android.displayingbitmaps.util.ImageFetcher.processBitmap(ImageFetcher.java:214)
+      com.example.android.displayingbitmaps.util.ImageFetcher.processBitmap(ImageFetcher.java:257)
+      com.example.android.displayingbitmaps.util.ImageWorker$BitmapWorkerTask.doInBackground(ImageWorker.java:312)
+      com.example.android.displayingbitmaps.util.ImageWorker$BitmapWorkerTask.doInBackground(ImageWorker.java:257)
+      com.example.android.displayingbitmaps.util.AsyncTask$2.call(AsyncTask.java:313)
+      java.util.concurrent.FutureTask.run(FutureTask.java:237)
+      java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133)
+      java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607)
+      java.lang.Thread.run(Thread.java:761)""";
   private static final List<CodeLocation> CODE_LOCATIONS = StackFrameParser.parseStack(STACK_STRING);
 
   @Rule
-  public final EdtRule myEdtRule = new EdtRule();
+  public final ProjectRule myProjectRule = new ProjectRule();
 
   @Rule
-  public final ProjectRule myProjectRule = new ProjectRule();
+  public final DisposableRule myDisposableRule = new DisposableRule();
 
   private IntelliJStackTraceView myStackView;
 
@@ -73,15 +78,15 @@
         new CodeNavigator(new FakeNavSource(), CodeNavigator.Companion.getTestExecutor()));
   }
 
-  public static IntelliJStackTraceView createStackTraceView(Project project, StackTraceModel model) {
-    return new IntelliJStackTraceView(project, model, (p, location) -> new FakeCodeElement(location));
+  public static IntelliJStackTraceView createStackTraceView(Project project, StackTraceModel model, Disposable disposable) {
+    return new IntelliJStackTraceView(project, model, disposable, (p, location) -> new FakeCodeElement(location));
   }
 
   @Before
   public void before() {
     // Arbitrary size just so we can click on it
     StackTraceModel model = createStackTraceModel();
-    IntelliJStackTraceView view = createStackTraceView(myProjectRule.getProject(), model);
+    IntelliJStackTraceView view = createStackTraceView(myProjectRule.getProject(), model, myDisposableRule.getDisposable());
     view.getComponent().setLocation(0, 0);
     view.getComponent().setSize(100, 400);
     view.getListView().setUI(new HeadlessListUI());
@@ -93,6 +98,7 @@
   public void equalityTest() {
     final String duplicateTestString = "com.example.android.displayingbitmaps.util.ImageFetcher.downloadUrlToStream(ImageFetcher.java:274)";
     CodeLocation positiveTest = StackFrameParser.parseFrame(duplicateTestString);
+    assertThat(positiveTest).isNotNull();
     CodeLocation negativeTest1 = CodeLocation.stub();
     CodeLocation negativeTest2 = new CodeLocation.Builder(positiveTest).setMethodName(positiveTest.getFileName()).build();
     CodeLocation negativeTest3 = new CodeLocation.Builder(positiveTest).setLineNumber(-1).build();
@@ -122,30 +128,38 @@
   @Test
   public void setStackFramesTest() {
     myStackView.getModel().setStackFrames(STACK_STRING);
+    //waitForModel();
+
     List<CodeLocation> viewLocations = myStackView.getModel().getCodeLocations();
     assertThat(viewLocations).isEqualTo(CODE_LOCATIONS);
 
-    myStackView.getModel().setStackFrames(ThreadId.INVALID_THREAD_ID, CODE_LOCATIONS);
+    myStackView.getModel().setStackFrames(INVALID_THREAD_ID, CODE_LOCATIONS);
+    //waitForModel();
+
     viewLocations = myStackView.getModel().getCodeLocations();
     assertThat(viewLocations).isEqualTo(CODE_LOCATIONS);
 
     myStackView.getModel().setStackFrames(new ThreadId(5), CODE_LOCATIONS);
+    waitForModel();
+
     viewLocations = myStackView.getModel().getCodeLocations();
     assertThat(viewLocations).isEqualTo(CODE_LOCATIONS);
-    ListModel model = myStackView.getListView().getModel();
-    assertThat(model.getSize()).isEqualTo(CODE_LOCATIONS.size() + 1);
+    ListModel<StackElement> model = myStackView.getListView().getModel();
+
     Object threadElement = model.getElementAt(model.getSize() - 1);
     assertThat(threadElement).isInstanceOf(ThreadElement.class);
     assertThat(((ThreadElement)threadElement).getThreadId()).isEqualTo(new ThreadId(5));
   }
 
   @Test
-  public void setSelectedRowByModel() throws InvocationTargetException, InterruptedException {
+  public void setSelectedRowByModel() {
     final int[] invocationCount = {0};
     myStackView.getModel().setStackFrames(STACK_STRING);
+    waitForModel();
+
     myStackView.getListView().addListSelectionListener(e -> invocationCount[0]++);
 
-    JList list = myStackView.getListView();
+    JList<StackElement> list = myStackView.getListView();
     assertThat(invocationCount[0]).isEqualTo(0);
     assertThat(list.getSelectedIndex()).isEqualTo(-1);
 
@@ -160,18 +174,20 @@
   }
 
   @Test
-  public void doubleClickingStackViewNavigatesToSelectedElement() throws InvocationTargetException, InterruptedException {
+  public void doubleClickingStackViewNavigatesToSelectedElement() {
     FakeUi fakeUi = new FakeUi(myStackView.getComponent());
     AspectObserver observer = new AspectObserver();
     final int[] invocationCount = {0};
     myStackView.getModel().addDependency(observer).onChange(StackTraceModel.Aspect.SELECTED_LOCATION, () -> invocationCount[0]++);
 
-    JList list = myStackView.getListView();
+    JList<StackElement> list = myStackView.getListView();
     assertThat(list.getSelectionModel().getSelectionMode()).isEqualTo(ListSelectionModel.SINGLE_SELECTION);
     assertThat(invocationCount[0]).isEqualTo(0);
     assertThat(list.getSelectedIndex()).isEqualTo(-1);
 
     myStackView.getModel().setStackFrames(STACK_STRING);
+    waitForModel();
+
     assertThat(myStackView.getModel().getCodeLocations().size()).isEqualTo(CODE_LOCATIONS.size());
 
     fakeUi.mouse.doubleClick(5, 5); // First row
@@ -180,18 +196,20 @@
   }
 
   @Test
-  public void rightClickingStackTraceView() throws InvocationTargetException, InterruptedException {
+  public void rightClickingStackTraceView() {
     FakeUi fakeUi = new FakeUi(myStackView.getComponent());
     AspectObserver observer = new AspectObserver();
     final int[] invocationCount = {0};
     myStackView.getModel().addDependency(observer).onChange(StackTraceModel.Aspect.SELECTED_LOCATION, () -> invocationCount[0]++);
 
-    JList list = myStackView.getListView();
+    JList<StackElement> list = myStackView.getListView();
     assertThat(list.getSelectionModel().getSelectionMode()).isEqualTo(ListSelectionModel.SINGLE_SELECTION);
     assertThat(invocationCount[0]).isEqualTo(0);
     assertThat(list.getSelectedIndex()).isEqualTo(-1);
 
     myStackView.getModel().setStackFrames(STACK_STRING);
+    waitForModel();
+
     assertThat(myStackView.getModel().getCodeLocations().size()).isEqualTo(CODE_LOCATIONS.size());
 
     fakeUi.mouse.click(5, 5, FakeMouse.Button.RIGHT); // First row
@@ -205,12 +223,14 @@
     final int[] invocationCount = {0};
     myStackView.getModel().addDependency(observer).onChange(StackTraceModel.Aspect.SELECTED_LOCATION, () -> invocationCount[0]++);
 
-    JList list = myStackView.getListView();
+    JList<StackElement> list = myStackView.getListView();
     assertThat(list.getSelectionModel().getSelectionMode()).isEqualTo(ListSelectionModel.SINGLE_SELECTION);
     assertThat(invocationCount[0]).isEqualTo(0);
     assertThat(list.getSelectedIndex()).isEqualTo(-1);
 
     myStackView.getModel().setStackFrames(STACK_STRING);
+    waitForModel();
+
     assertThat(myStackView.getModel().getCodeLocations().size()).isEqualTo(CODE_LOCATIONS.size());
 
     fakeUi.mouse.click(5, 5); // First row
@@ -222,6 +242,19 @@
     assertThat(invocationCount[0]).isEqualTo(1);
   }
 
+  private void waitForModel() {
+    ListModel<StackElement> listModel = myStackView.getListView().getModel();
+    List<CodeLocation> locations = myStackView.getModel().getCodeLocations();
+    int expectedElements = locations.size() + (myStackView.getModel().getThreadId() == INVALID_THREAD_ID ? 0 : 1);
+
+    try {
+      AsyncTestUtils.waitForCondition(5, SECONDS, () -> listModel.getSize() == expectedElements);
+    }
+    catch (TimeoutException e) {
+      fail(String.format("Expected %d frames but got %d", expectedElements, listModel.getSize()));
+    }
+  }
+
   private static class FakeCodeElement implements CodeElement {
     @NotNull private final CodeLocation myCodeLocation;
 
diff --git a/inspectors-common/ui/src/com/android/tools/inspectors/common/ui/dataviewer/IntellijDataViewer.kt b/inspectors-common/ui/src/com/android/tools/inspectors/common/ui/dataviewer/IntellijDataViewer.kt
index b50fc23..dcac323 100644
--- a/inspectors-common/ui/src/com/android/tools/inspectors/common/ui/dataviewer/IntellijDataViewer.kt
+++ b/inspectors-common/ui/src/com/android/tools/inspectors/common/ui/dataviewer/IntellijDataViewer.kt
@@ -54,6 +54,7 @@
 private const val RAW_VIEWER_MAX_STRING_LENGTH = 500
 private const val MAX_SIZE_TO_FORMAT = 100_000
 private val logger = Logger.getInstance(IntellijDataViewer::class.java)
+private val application = ApplicationManager.getApplication()
 
 class IntellijDataViewer private constructor(private val component: JComponent, private val style: Style) : DataViewer {
   override fun getComponent(): JComponent {
@@ -111,7 +112,8 @@
 
         val textEditor = PsiAwareTextEditorProvider().createEditor(project, virtualFile) as TextEditor
         configureEditor(textEditor.editor as EditorEx)
-        CodeFoldingManager.getInstance(project).updateFoldRegions(textEditor.editor)
+        val codeFoldingManager = CodeFoldingManager.getInstance(project)
+        application.runWriteAction { codeFoldingManager.updateFoldRegions(textEditor.editor) }
         Disposer.register(parentDisposable, textEditor)
 
         val component = if (showNotification) getComponentWithNotification(textEditor.editor) else textEditor.editor.component
diff --git a/intellij-integration/BUILD b/intellij-integration/BUILD
new file mode 100644
index 0000000..1c5770a
--- /dev/null
+++ b/intellij-integration/BUILD
@@ -0,0 +1,19 @@
+load("//tools/base/bazel:bazel.bzl", "iml_module")
+
+# managed by go/iml_to_build
+iml_module(
+    name = "intellij-integration-tests",
+    generate_k2_tests = True,
+    iml_files = ["intellij-integration-tests.iml"],
+    test_class = "com.android.tools.idea.IntellijIntegrationTestSuite",
+    test_srcs = ["testSrc"],
+    visibility = ["//visibility:public"],
+    # do not sort: must match IML order
+    deps = [
+        "//prebuilts/studio/intellij-sdk:studio-sdk-plugin-Kotlin[test]",
+        "//prebuilts/studio/intellij-sdk:studio-sdk[test]",
+        "//tools/base/testutils:studio.android.sdktools.testutils[module, test]",
+        "//tools/adt/idea/adt-testutils:intellij.android.adt.testutils[module, test]",
+        "//tools/adt/idea/.idea/libraries:truth[test]",
+    ],
+)
diff --git a/intellij-integration/OWNERS b/intellij-integration/OWNERS
new file mode 100644
index 0000000..be46b9e
--- /dev/null
+++ b/intellij-integration/OWNERS
@@ -0,0 +1,5 @@
+gharrma@google.com
+yakavets@google.com
+ralucas@google.com
+baskakov@google.com
+jlogs@google.com
diff --git a/intellij-integration/README.md b/intellij-integration/README.md
new file mode 100644
index 0000000..a13b064
--- /dev/null
+++ b/intellij-integration/README.md
@@ -0,0 +1,2 @@
+This 'intellij-integration' module is maintained by the platform team.
+It contains scripts and tests related to our particular fork of IntelliJ.
diff --git a/intellij-integration/intellij-integration-tests.iml b/intellij-integration/intellij-integration-tests.iml
new file mode 100644
index 0000000..35b3cd6
--- /dev/null
+++ b/intellij-integration/intellij-integration-tests.iml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" inherit-compiler-output="true">
+    <exclude-output />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/testSrc" isTestSource="true" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="library" scope="TEST" name="studio-plugin-Kotlin" level="project" />
+    <orderEntry type="library" scope="TEST" name="studio-sdk" level="project" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="module" module-name="android.sdktools.testutils" scope="TEST" />
+    <orderEntry type="module" module-name="intellij.android.adt.testutils" scope="TEST" />
+    <orderEntry type="library" scope="TEST" name="truth" level="project" />
+  </component>
+</module>
\ No newline at end of file
diff --git a/kotlin-integration/testSrc/com/android/tools/idea/KotlinIntegrationTestSuite.java b/intellij-integration/testSrc/com/android/tools/idea/IntellijIntegrationTestSuite.java
similarity index 64%
rename from kotlin-integration/testSrc/com/android/tools/idea/KotlinIntegrationTestSuite.java
rename to intellij-integration/testSrc/com/android/tools/idea/IntellijIntegrationTestSuite.java
index f5167ba..d7a983b 100644
--- a/kotlin-integration/testSrc/com/android/tools/idea/KotlinIntegrationTestSuite.java
+++ b/intellij-integration/testSrc/com/android/tools/idea/IntellijIntegrationTestSuite.java
@@ -21,12 +21,5 @@
 
 @RunWith(JarTestSuiteRunner.class)
 @SuppressWarnings("NewClassNamingConvention") // Not a test.
-public class KotlinIntegrationTestSuite extends IdeaTestSuiteBase {
-
-  static {
-    unzipIntoOfflineMavenRepo("tools/base/build-system/android_gradle_plugin.zip");
-    linkIntoOfflineMavenRepo("tools/base/build-system/android_gradle_plugin_runtime_dependencies.manifest");
-    linkIntoOfflineMavenRepo("tools/base/build-system/integration-test/kotlin_gradle_plugin_prebuilts.manifest");
-    linkIntoOfflineMavenRepo("tools/adt/idea/kotlin-integration/test_deps.manifest");
-  }
+public class IntellijIntegrationTestSuite extends IdeaTestSuiteBase {
 }
diff --git a/kotlin-integration/testSrc/com/android/tools/idea/KotlinPluginTest.kt b/intellij-integration/testSrc/com/android/tools/idea/KotlinPluginTest.kt
similarity index 100%
rename from kotlin-integration/testSrc/com/android/tools/idea/KotlinPluginTest.kt
rename to intellij-integration/testSrc/com/android/tools/idea/KotlinPluginTest.kt
diff --git a/intellij.android.avdmanager.tests/src/com/android/tools/idea/avdmanager/DeviceDefinitionListTest.java b/intellij.android.avdmanager.tests/src/com/android/tools/idea/avdmanager/DeviceDefinitionListTest.java
index d7f35dd..526805b 100644
--- a/intellij.android.avdmanager.tests/src/com/android/tools/idea/avdmanager/DeviceDefinitionListTest.java
+++ b/intellij.android.avdmanager.tests/src/com/android/tools/idea/avdmanager/DeviceDefinitionListTest.java
@@ -15,7 +15,10 @@
  */
 package com.android.tools.idea.avdmanager;
 
+import static org.junit.Assert.assertEquals;
+
 import java.util.List;
+import java.util.Set;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -40,4 +43,32 @@
     // Act
     new DeviceDefinitionList(supplier);
   }
+
+  @Test
+  public void deviceDefinitionListIdsAreDifferent() {
+    // Arrange
+    // system-images;android-21;android-tv;x86
+    var tv1 = Definitions.mockDefinition("android-tv", Definitions.mockHardware(0), "Android TV (1080p)", "Android TV (1080p)");
+
+    // tv.xml at Commit df3a41ec30df6edc79a4e3823698640f114b05a4
+    var tv2 = Definitions.mockDefinition("android-tv", Definitions.mockHardware(0), "Android TV (1080p)", "tv_1080p");
+
+    var definitions = List.of(Definitions.mockPhone(),
+                              Definitions.mockTablet(),
+                              Definitions.mockWearOsDefinition(),
+                              Definitions.mockDesktop(),
+                              tv1,
+                              tv2,
+                              Definitions.mockAutomotiveDefinition(),
+                              Definitions.mockLegacyDefinition());
+
+    var supplier = Mockito.mock(DeviceSupplier.class);
+    Mockito.when(supplier.get()).thenReturn(definitions);
+
+    // Act
+    var list = new DeviceDefinitionList(supplier);
+
+    // Assert
+    assertEquals(Set.of(tv1, tv2), list.getCategoryToDefinitionMultimap().get(Category.TV));
+  }
 }
diff --git a/intellij.android.avdmanager.tests/src/com/android/tools/idea/avdmanager/NameComparatorTest.java b/intellij.android.avdmanager.tests/src/com/android/tools/idea/avdmanager/NameComparatorTest.java
index babda0f..994c486 100644
--- a/intellij.android.avdmanager.tests/src/com/android/tools/idea/avdmanager/NameComparatorTest.java
+++ b/intellij.android.avdmanager.tests/src/com/android/tools/idea/avdmanager/NameComparatorTest.java
@@ -16,6 +16,7 @@
 package com.android.tools.idea.avdmanager;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 import com.android.sdklib.devices.Device;
 import java.util.ArrayList;
@@ -178,16 +179,6 @@
   }
 
   @NotNull
-  private static Device mockDevice(@NotNull String name) {
-    var device = Mockito.mock(Device.class);
-
-    Mockito.when(device.getDisplayName()).thenReturn(name);
-    Mockito.when(device.toString()).thenReturn(name);
-
-    return device;
-  }
-
-  @NotNull
   private static List<Device> shuffle(@NotNull Collection<Device> expectedDevices) {
     var actualDevices = new ArrayList<>(expectedDevices);
     Collections.shuffle(actualDevices);
@@ -199,4 +190,34 @@
     System.out.println("Shuffled devices: " + actualNames);
     return actualDevices;
   }
+
+  @Test
+  public void compareIdsAreDifferent() {
+    // Arrange
+    // system-images;android-21;android-tv;x86
+    var device1 = mockDevice("Android TV (1080p)", "Android TV (1080p)");
+
+    // tv.xml at Commit df3a41ec30df6edc79a4e3823698640f114b05a4
+    var device2 = mockDevice("Android TV (1080p)", "tv_1080p");
+
+    // Act
+    var result = myComparator.compare(device1, device2);
+
+    // Assert
+    assertTrue(result < 0);
+  }
+
+  private static @NotNull Device mockDevice(@NotNull String name) {
+    return mockDevice(name, "");
+  }
+
+  private static @NotNull Device mockDevice(@NotNull String name, @NotNull String id) {
+    var device = Mockito.mock(Device.class);
+
+    Mockito.when(device.getDisplayName()).thenReturn(name);
+    Mockito.when(device.getId()).thenReturn(id);
+    Mockito.when(device.toString()).thenReturn(name);
+
+    return device;
+  }
 }
diff --git a/intellij.android.device/src/com/android/tools/idea/adddevicedialog/AdditionalSettingsPanel.kt b/intellij.android.device/src/com/android/tools/idea/adddevicedialog/AdditionalSettingsPanel.kt
index cade8ec..a50565d 100644
--- a/intellij.android.device/src/com/android/tools/idea/adddevicedialog/AdditionalSettingsPanel.kt
+++ b/intellij.android.device/src/com/android/tools/idea/adddevicedialog/AdditionalSettingsPanel.kt
@@ -27,7 +27,6 @@
 import com.android.sdklib.internal.avd.EmulatedProperties
 import com.android.sdklib.internal.avd.GpuMode
 import com.android.tools.idea.avdmanager.skincombobox.Skin
-import kotlin.math.max
 import kotlinx.collections.immutable.ImmutableCollection
 import kotlinx.collections.immutable.toImmutableList
 import org.jetbrains.jewel.ui.component.CheckboxRow
@@ -36,6 +35,7 @@
 import org.jetbrains.jewel.ui.component.OutlinedButton
 import org.jetbrains.jewel.ui.component.Text
 import org.jetbrains.jewel.ui.component.TextField
+import kotlin.math.max
 
 @Composable
 internal fun AdditionalSettingsPanel(
@@ -141,34 +141,13 @@
   Row {
     Text("Internal storage")
 
-    TextField(
-      state.internalStorageTextFieldValue,
-      onValueChange = {
-        try {
-          val value = if (it.isEmpty()) 0 else it.toLong()
-          val newStorage = StorageCapacity(value, device.internalStorage.unit)
-          onDeviceChange(device.copy(internalStorage = newStorage))
-
-          state.internalStorageTextFieldValue = it
-        } catch (exception: NumberFormatException) {
-          // Use the old storage
-        }
-      },
-    )
-
-    Dropdown(
-      device.internalStorage.unit,
-      UNITS,
-      onSelectedItemChange = {
-        val newStorage = StorageCapacity(device.internalStorage.value, it)
-        onDeviceChange(device.copy(internalStorage = newStorage))
-      },
-    )
+    StorageCapacityField(state.internalStorage, onValueChange = {
+      state.internalStorage = it
+      onDeviceChange(device.copy(internalStorage = it))
+    })
   }
 }
 
-private val UNITS = enumValues<StorageCapacity.Unit>().asIterable().toImmutableList()
-
 @Composable
 private fun EmulatedPerformanceGroup(
   device: VirtualDevice,
@@ -222,11 +201,26 @@
   GpuMode.values().filterNot { it == GpuMode.OFF }.toImmutableList()
 
 internal class AdditionalSettingsPanelState internal constructor(device: VirtualDevice) {
-  internal var internalStorageTextFieldValue by
-    mutableStateOf(device.internalStorage.value.toString())
+  internal var internalStorage by mutableStateOf(device.internalStorage)
 }
 
 @Composable
+private fun StorageCapacityField(value: StorageCapacity, onValueChange: (StorageCapacity) -> Unit) {
+  TextField(value.value.toString(), onValueChange = {
+    try {
+      onValueChange(StorageCapacity(if (it.isEmpty()) 0 else it.toLong(), value.unit))
+    }
+    catch (exception: NumberFormatException) {
+      // Use the old storage
+    }
+  })
+
+  Dropdown(value.unit, UNITS, onSelectedItemChange = { onValueChange(StorageCapacity(value.value, it)) })
+}
+
+private val UNITS = enumValues<StorageCapacity.Unit>().asIterable().toImmutableList()
+
+@Composable
 private fun <I> Dropdown(
   selectedItem: I,
   items: ImmutableCollection<I>,
diff --git a/kotlin-integration/BUILD b/kotlin-integration/BUILD
deleted file mode 100644
index 9742113..0000000
--- a/kotlin-integration/BUILD
+++ /dev/null
@@ -1,67 +0,0 @@
-load("//tools/base/bazel:bazel.bzl", "iml_module")
-load("//tools/base/bazel:maven.bzl", "maven_repository")
-
-# managed by go/iml_to_build
-iml_module(
-    name = "kotlin-integration-tests",
-    generate_k2_tests = True,
-    iml_files = ["kotlin-integration-tests.iml"],
-    tags = ["no_test_windows"],
-    test_class = "com.android.tools.idea.KotlinIntegrationTestSuite",
-    test_data = [
-        ":test_deps",
-        "//prebuilts/studio/jdk/jdk11",
-        "//prebuilts/studio/sdk:build-tools/latest",
-        "//prebuilts/studio/sdk:platform-tools",
-        "//prebuilts/studio/sdk:platforms/latest",
-        "//tools/adt/idea/android/annotations",
-        "//tools/adt/idea/android/testData",
-        "//tools/adt/idea/artwork:device-art-resources",
-        "//tools/adt/idea/kotlin-integration/testData",
-        "//tools/base/build-system:android_gradle_plugin.zip",
-        "//tools/base/build-system:android_gradle_plugin_runtime_dependencies",
-        "//tools/base/build-system:gradle-distrib",
-        "//tools/base/build-system/integration-test:kotlin_gradle_plugin_prebuilts",
-    ],
-    test_shard_count = 2,
-    test_srcs = ["testSrc"],
-    test_tags = [
-        "no_test_mac",
-    ],
-    test_timeout = "long",
-    visibility = ["//visibility:public"],
-    # do not sort: must match IML order
-    deps = [
-        "//prebuilts/studio/intellij-sdk:studio-sdk",
-        "//prebuilts/studio/intellij-sdk:studio-sdk-plugin-gradle",
-        "//prebuilts/studio/intellij-sdk:studio-sdk-plugin-Kotlin",
-        "//prebuilts/studio/intellij-sdk:studio-sdk-plugin-junit",
-        "//tools/adt/idea/android:intellij.android.core[module, test]",
-        "//tools/adt/idea/android-test-framework:intellij.android.testFramework[module, test]",
-        "//tools/adt/idea/android-plugin:intellij.android.plugin[module, test]",
-        "//tools/base/testutils:studio.android.sdktools.testutils[module, test]",
-        "//tools/adt/idea/adt-testutils:intellij.android.adt.testutils[module, test]",
-        "//tools/adt/idea/.idea/libraries:truth",
-        "//tools/analytics-library/tracker:analytics-tracker[module, test]",
-        "//tools/analytics-library/testing:android.sdktools.analytics-testing[module, test]",
-        "//tools/analytics-library/shared:analytics-shared[module, test]",
-        "//tools/adt/idea/.idea/libraries:studio-analytics-proto",
-        "//tools/adt/idea/.idea/libraries:mockito[test]",
-        "//tools/adt/idea/android-kotlin:intellij.android.kotlin.idea[module, test]",
-        "//tools/adt/idea/android-kotlin:intellij.android.kotlin.output.parser[module, test]",
-        "//tools/base/lint:studio.android.sdktools.lint-checks[module, test]",
-    ],
-)
-
-maven_repository(
-    name = "test_deps",
-    # keep sorted: for buildifier
-    artifacts = [
-        "@maven//:commons-logging.commons-logging_1.1.1",
-        "@maven//:junit.junit_4.12",
-        "@maven//:org.hamcrest.hamcrest-integration_1.3",
-        "@maven//:org.jdeferred.jdeferred-android-aar_1.2.3",
-        "@maven//:org.jetbrains.intellij.deps.trove4j_1.0.20181211",
-        "@maven//:org.mockito.mockito-core_5.6.0",
-    ],
-)
diff --git a/kotlin-integration/kotlin-integration-tests.iml b/kotlin-integration/kotlin-integration-tests.iml
deleted file mode 100644
index 7b625df..0000000
--- a/kotlin-integration/kotlin-integration-tests.iml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="JAVA_MODULE" version="4">
-  <component name="NewModuleRootManager" inherit-compiler-output="true">
-    <exclude-output />
-    <content url="file://$MODULE_DIR$">
-      <sourceFolder url="file://$MODULE_DIR$/testSrc" isTestSource="true" />
-    </content>
-    <orderEntry type="inheritedJdk" />
-    <orderEntry type="library" name="studio-sdk" level="project" />
-    <orderEntry type="library" name="studio-plugin-gradle" level="project" />
-    <orderEntry type="library" name="studio-plugin-Kotlin" level="project" />
-    <orderEntry type="library" name="studio-plugin-junit" level="project" />
-    <orderEntry type="sourceFolder" forTests="false" />
-    <orderEntry type="module" module-name="intellij.android.core" scope="TEST" />
-    <orderEntry type="module" module-name="intellij.android.testFramework" scope="TEST" />
-    <orderEntry type="module" module-name="intellij.android.plugin" scope="TEST" />
-    <orderEntry type="module" module-name="android.sdktools.testutils" scope="TEST" />
-    <orderEntry type="module" module-name="intellij.android.adt.testutils" scope="TEST" />
-    <orderEntry type="library" name="truth" level="project" />
-    <orderEntry type="module" module-name="analytics-tracker" scope="TEST" />
-    <orderEntry type="module" module-name="android.sdktools.analytics-testing" scope="TEST" />
-    <orderEntry type="module" module-name="analytics-shared" scope="TEST" />
-    <orderEntry type="library" name="studio-analytics-proto" level="project" />
-    <orderEntry type="library" scope="TEST" name="mockito" level="project" />
-    <orderEntry type="module" module-name="intellij.android.kotlin.idea" scope="TEST" />
-    <orderEntry type="module" module-name="intellij.android.kotlin.output.parser" scope="TEST" />
-    <orderEntry type="module" module-name="android.sdktools.lint-checks" scope="TEST" />
-  </component>
-</module>
\ No newline at end of file
diff --git a/kotlin-integration/testData/BUILD b/kotlin-integration/testData/BUILD
deleted file mode 100644
index 3911ee7..0000000
--- a/kotlin-integration/testData/BUILD
+++ /dev/null
@@ -1,5 +0,0 @@
-filegroup(
-    name = "testData",
-    srcs = glob(["**"]),
-    visibility = ["//visibility:public"],
-)
diff --git a/kotlin-integration/testSrc/com/android/tools/idea/gradle/project/sync/GradleSyncStateLoggingTest.kt b/kotlin-integration/testSrc/com/android/tools/idea/gradle/project/sync/GradleSyncStateLoggingTest.kt
deleted file mode 100644
index d98e438..0000000
--- a/kotlin-integration/testSrc/com/android/tools/idea/gradle/project/sync/GradleSyncStateLoggingTest.kt
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.tools.idea.gradle.project.sync;
-
-import com.android.testutils.TestUtils
-import com.android.testutils.VirtualTimeScheduler
-import com.android.tools.analytics.TestUsageTracker
-import com.android.tools.analytics.UsageTracker
-import com.android.tools.idea.gradle.project.sync.snapshots.AndroidCoreTestProject
-import com.android.tools.idea.gradle.project.sync.snapshots.TestProjectDefinition.Companion.prepareTestProject
-import com.android.tools.idea.testing.AndroidProjectRule
-import com.android.tools.idea.testing.IntegrationTestEnvironmentRule
-import com.google.wireless.android.sdk.stats.AndroidStudioEvent
-import com.intellij.testFramework.RunsInEdt
-import junit.framework.Assert.assertEquals
-import junit.framework.Assert.assertFalse
-import org.junit.Before
-import org.junit.Rule
-import org.junit.Test
-
-@RunsInEdt
-class GradleSyncStateLoggingTest {
-
-  @get:Rule
-  val projectRule: IntegrationTestEnvironmentRule = AndroidProjectRule.withIntegrationTestEnvironment()
-
-  private val tracker = TestUsageTracker(VirtualTimeScheduler())
-
-  @Before
-  fun setUp() {
-    UsageTracker.setWriterForTest(tracker)
-  }
-
-  @Test
-  fun testKotlinLogging() {
-    val preparedProject = projectRule.prepareTestProject(AndroidCoreTestProject.UNIT_TESTING)
-    preparedProject.open { project ->
-
-      val proto = tracker.usages
-        .map { it.studioEvent }
-        .last { it.kind == AndroidStudioEvent.EventKind.GRADLE_SYNC_ENDED }
-        .kotlinSupport
-
-      assertEquals(TestUtils.KOTLIN_VERSION_FOR_TESTS, proto.kotlinSupportVersion)
-      assertFalse(proto.hasAndroidKtxVersion())
-      // TODO(b/71803185): test for KTX once we have in prebuilts and can sync a project that uses it.
-    }
-  }
-}
diff --git a/layout-inspector/testSrc/com/android/tools/idea/layoutinspector/pipeline/appinspection/AppInspectionPropertiesProviderTest.kt b/layout-inspector/testSrc/com/android/tools/idea/layoutinspector/pipeline/appinspection/AppInspectionPropertiesProviderTest.kt
index a7a491c..2ee8c4e 100644
--- a/layout-inspector/testSrc/com/android/tools/idea/layoutinspector/pipeline/appinspection/AppInspectionPropertiesProviderTest.kt
+++ b/layout-inspector/testSrc/com/android/tools/idea/layoutinspector/pipeline/appinspection/AppInspectionPropertiesProviderTest.kt
@@ -66,7 +66,6 @@
 import java.util.concurrent.TimeUnit
 import org.jetbrains.android.facet.AndroidFacet
 import org.junit.Before
-import org.junit.Ignore
 import org.junit.Rule
 import org.junit.Test
 import org.junit.rules.RuleChain
@@ -714,7 +713,6 @@
     }
   }
 
-  @Ignore("b/319705809")
   @Test
   fun testPropertiesModelNotifications() {
     projectRule.fixture.addFileToProject(
@@ -738,16 +736,11 @@
     modelUpdatedSignal.poll(TIMEOUT, TIMEOUT_UNIT)!! // Event triggered by tree #1
 
     var generatedCount = 0
-    var valuesChangedCount = 0
     propertiesModel.addListener(
       object : PropertiesModelListener<InspectorPropertyItem> {
         override fun propertiesGenerated(model: PropertiesModel<InspectorPropertyItem>) {
           generatedCount++
         }
-
-        override fun propertyValuesChanged(model: PropertiesModel<InspectorPropertyItem>) {
-          valuesChangedCount++
-        }
       }
     )
 
@@ -766,10 +759,9 @@
     inspectorState.triggerLayoutCapture(rootId = 1)
     modelUpdatedSignal.poll(TIMEOUT, TIMEOUT_UNIT)!!
 
-    waitForCondition(TIMEOUT, TIMEOUT_UNIT) { valuesChangedCount == 1 }
-    assertThat(
-      propertiesModel.properties.assertProperty("text", PropertyType.STRING, "secondaryValue")
-    )
+    waitForCondition(TIMEOUT, TIMEOUT_UNIT) {
+      propertiesModel.properties[ANDROID_URI, "text"].value == "secondaryValue"
+    }
     assertThat(propertiesModel.properties.assertProperty("clickable", PropertyType.BOOLEAN, "true"))
     assertThat(propertiesModel.properties.assertProperty("alpha", PropertyType.FLOAT, "4.0"))
     assertThat(propertiesModel.properties.assertProperty("width", PropertyType.DIMENSION, "500px"))
diff --git a/layout-ui/src/main/java/com/android/tools/componenttree/treetable/ViewTreeCellRenderer.kt b/layout-ui/src/main/java/com/android/tools/componenttree/treetable/ViewTreeCellRenderer.kt
index 211dea1..913cb1b 100644
--- a/layout-ui/src/main/java/com/android/tools/componenttree/treetable/ViewTreeCellRenderer.kt
+++ b/layout-ui/src/main/java/com/android/tools/componenttree/treetable/ViewTreeCellRenderer.kt
@@ -20,12 +20,14 @@
 import com.android.tools.adtui.common.ColoredIconGenerator.deEmphasize
 import com.android.tools.componenttree.api.ViewNodeType
 import com.google.common.annotations.VisibleForTesting
+import com.intellij.openapi.util.ThrowableComputable
 import com.intellij.ui.NewUI
 import com.intellij.ui.SimpleColoredRenderer
 import com.intellij.ui.SimpleTextAttributes
 import com.intellij.ui.SimpleTextAttributes.STYLE_SMALLER
 import com.intellij.ui.SimpleTextAttributes.STYLE_STRIKEOUT
 import com.intellij.ui.treeStructure.treetable.TreeTableTree
+import com.intellij.util.SlowOperations
 import com.intellij.util.text.nullize
 import com.intellij.util.ui.JBInsets
 import com.intellij.util.ui.StartupUiUtil
@@ -74,7 +76,8 @@
     renderer.selectedValue = selected
     renderer.focusedValue = hasFocus && selected
 
-    renderer.id = stripId(type.idOf(node))
+    renderer.id =
+      SlowOperations.allowSlowOperations(ThrowableComputable { stripId(type.idOf(node)) })
     renderer.tagName = type.tagNameOf(node).substringAfterLast('.')
     renderer.textValue = type.textValueOf(node)
     renderer.treeIcon = type.iconOf(node)
diff --git a/lint/BUILD b/lint/BUILD
index 9bb76a8..32a1636 100644
--- a/lint/BUILD
+++ b/lint/BUILD
@@ -46,5 +46,6 @@
         "//tools/base/lint:studio.android.sdktools.lint-checks[module, test]",
         "//tools/adt/idea/android-common:intellij.android.common[module, test]",
         "//tools/adt/idea/project-system:intellij.android.projectSystem[module, test]",
+        "//prebuilts/studio/intellij-sdk:studio-sdk-plugin-Kotlin[test]",
     ],
 )
diff --git a/lint/tests/intellij.lint.tests.iml b/lint/tests/intellij.lint.tests.iml
index 25ac79f..7488cce 100644
--- a/lint/tests/intellij.lint.tests.iml
+++ b/lint/tests/intellij.lint.tests.iml
@@ -19,5 +19,6 @@
     <orderEntry type="module" module-name="android.sdktools.lint-checks" scope="TEST" />
     <orderEntry type="module" module-name="intellij.android.common" scope="TEST" />
     <orderEntry type="module" module-name="intellij.android.projectSystem" scope="TEST" />
+    <orderEntry type="library" scope="TEST" name="studio-plugin-Kotlin" level="project" />
   </component>
 </module>
\ No newline at end of file
diff --git a/kotlin-integration/testData/callgraph/AndroidxAnnotations.java b/lint/tests/testData/lint/callgraph/AndroidxAnnotations.java
similarity index 100%
rename from kotlin-integration/testData/callgraph/AndroidxAnnotations.java
rename to lint/tests/testData/lint/callgraph/AndroidxAnnotations.java
diff --git a/kotlin-integration/testData/callgraph/AndroidxAnnotations.kt b/lint/tests/testData/lint/callgraph/AndroidxAnnotations.kt
similarity index 100%
rename from kotlin-integration/testData/callgraph/AndroidxAnnotations.kt
rename to lint/tests/testData/lint/callgraph/AndroidxAnnotations.kt
diff --git a/kotlin-integration/testData/callgraph/CallGraph.java b/lint/tests/testData/lint/callgraph/CallGraph.java
similarity index 100%
rename from kotlin-integration/testData/callgraph/CallGraph.java
rename to lint/tests/testData/lint/callgraph/CallGraph.java
diff --git a/kotlin-integration/testData/callgraph/CallGraph.kt b/lint/tests/testData/lint/callgraph/CallGraph.kt
similarity index 100%
rename from kotlin-integration/testData/callgraph/CallGraph.kt
rename to lint/tests/testData/lint/callgraph/CallGraph.kt
diff --git a/kotlin-integration/testData/callgraph/SupportAnnotations.java b/lint/tests/testData/lint/callgraph/SupportAnnotations.java
similarity index 100%
rename from kotlin-integration/testData/callgraph/SupportAnnotations.java
rename to lint/tests/testData/lint/callgraph/SupportAnnotations.java
diff --git a/kotlin-integration/testData/callgraph/SupportAnnotations.kt b/lint/tests/testData/lint/callgraph/SupportAnnotations.kt
similarity index 100%
rename from kotlin-integration/testData/callgraph/SupportAnnotations.kt
rename to lint/tests/testData/lint/callgraph/SupportAnnotations.kt
diff --git a/kotlin-integration/testData/callgraph/ThreadAnnotations.java b/lint/tests/testData/lint/callgraph/ThreadAnnotations.java
similarity index 100%
rename from kotlin-integration/testData/callgraph/ThreadAnnotations.java
rename to lint/tests/testData/lint/callgraph/ThreadAnnotations.java
diff --git a/kotlin-integration/testData/callgraph/ThreadAnnotations.kt b/lint/tests/testData/lint/callgraph/ThreadAnnotations.kt
similarity index 100%
rename from kotlin-integration/testData/callgraph/ThreadAnnotations.kt
rename to lint/tests/testData/lint/callgraph/ThreadAnnotations.kt
diff --git a/kotlin-integration/testSrc/com/android/tools/idea/callgraph/CallGraphTest.kt b/lint/tests/testSrc/com/android/tools/idea/lint/callgraph/CallGraphTest.kt
similarity index 93%
rename from kotlin-integration/testSrc/com/android/tools/idea/callgraph/CallGraphTest.kt
rename to lint/tests/testSrc/com/android/tools/idea/lint/callgraph/CallGraphTest.kt
index 6b6d92e..e84e9fa 100644
--- a/kotlin-integration/testSrc/com/android/tools/idea/callgraph/CallGraphTest.kt
+++ b/lint/tests/testSrc/com/android/tools/idea/lint/callgraph/CallGraphTest.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.android.tools.idea.callgraph
+package com.android.tools.idea.lint.callgraph
 
 import com.android.testutils.TestUtils.resolveWorkspacePath
 import com.android.tools.lint.detector.api.interprocedural.CallGraph
@@ -29,8 +29,9 @@
 import com.intellij.openapi.project.Project
 import com.intellij.openapi.vfs.VirtualFile
 import com.intellij.psi.PsiManager
+import com.intellij.testFramework.LightProjectDescriptor
 import junit.framework.TestCase
-import org.jetbrains.android.AndroidTestCase
+import org.jetbrains.android.LightJavaCodeInsightFixtureAdtTestCase
 import org.jetbrains.kotlin.idea.base.plugin.isK2Plugin
 import org.jetbrains.uast.UFile
 import org.jetbrains.uast.UastContext
@@ -54,11 +55,22 @@
   return Triple(cha, receiverEval, graph)
 }
 
-class CallGraphTest : AndroidTestCase() {
+class CallGraphTest : LightJavaCodeInsightFixtureAdtTestCase() {
+
+  override fun getProjectDescriptor(): LightProjectDescriptor = AdtTestProjectDescriptors.kotlin()
 
   override fun setUp() {
-    myProjectDescriptor = AdtTestProjectDescriptors.kotlin()
     super.setUp()
+    // Stub java.util.function.Consumer so it can be used in the test data.
+    myFixture.addClass(
+      """
+      package java.util.function;
+      @FunctionalInterface
+      public interface Consumer<T> {
+          void accept(T t);
+      }
+      """.trimIndent()
+    )
   }
 
   fun testJavaCallGraph() = doTest(".java")
@@ -66,7 +78,7 @@
   fun testKotlinCallGraph() = doTest(".kt")
 
   private fun doTest(ext: String) {
-    myFixture.testDataPath = resolveWorkspacePath("tools/adt/idea/kotlin-integration/testData").toString()
+    myFixture.testDataPath = resolveWorkspacePath("tools/adt/idea/lint/tests/testData/lint").toString()
     val virtualFile = myFixture.copyFileToProject("callgraph/CallGraph$ext", "src/CallGraph$ext")
     val (_, receiverEval, graph) = buildInterproceduralAnalysesForTest(virtualFile, myFixture.project)
     val contextualGraph = graph.buildContextualCallGraph(receiverEval)
diff --git a/kotlin-integration/testSrc/com/android/tools/idea/callgraph/WrongThreadInterproceduralTest.kt b/lint/tests/testSrc/com/android/tools/idea/lint/callgraph/WrongThreadInterproceduralTest.kt
similarity index 84%
rename from kotlin-integration/testSrc/com/android/tools/idea/callgraph/WrongThreadInterproceduralTest.kt
rename to lint/tests/testSrc/com/android/tools/idea/lint/callgraph/WrongThreadInterproceduralTest.kt
index fc2f72c..6ede4db 100644
--- a/kotlin-integration/testSrc/com/android/tools/idea/callgraph/WrongThreadInterproceduralTest.kt
+++ b/lint/tests/testSrc/com/android/tools/idea/lint/callgraph/WrongThreadInterproceduralTest.kt
@@ -13,15 +13,19 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.android.tools.idea.callgraph
+package com.android.tools.idea.lint.callgraph
 
 import com.android.testutils.TestUtils.resolveWorkspacePath
 import com.android.tools.lint.checks.searchForInterproceduralThreadAnnotationViolations
 import com.android.tools.lint.detector.api.interprocedural.shortName
+import com.android.tools.tests.AdtTestProjectDescriptors
+import com.intellij.testFramework.LightProjectDescriptor
 import junit.framework.TestCase
-import org.jetbrains.android.AndroidTestCase
+import org.jetbrains.android.LightJavaCodeInsightFixtureAdtTestCase
 
-class WrongThreadInterproceduralTest : AndroidTestCase() {
+class WrongThreadInterproceduralTest : LightJavaCodeInsightFixtureAdtTestCase() {
+
+  override fun getProjectDescriptor(): LightProjectDescriptor = AdtTestProjectDescriptors.kotlin()
 
   fun testJavaThreadAnnotations() = doTest(".java")
 
@@ -30,7 +34,7 @@
   private fun addFile(file: String) = myFixture.copyFileToProject("callgraph/$file", "src/$file")
 
   private fun doTest(ext: String) {
-    myFixture.testDataPath = resolveWorkspacePath("tools/adt/idea/kotlin-integration/testData").toString()
+    myFixture.testDataPath = resolveWorkspacePath("tools/adt/idea/lint/tests/testData/lint").toString()
 
     // Most of the test uses the new AndroidX annotations, but we make sure that the old annotations work too.
     addFile("AndroidxAnnotations$ext")
diff --git a/ml-api/src/com/android/tools/idea/studiobot/StudioBot.kt b/ml-api/src/com/android/tools/idea/studiobot/StudioBot.kt
index 64272ab..b68e549 100644
--- a/ml-api/src/com/android/tools/idea/studiobot/StudioBot.kt
+++ b/ml-api/src/com/android/tools/idea/studiobot/StudioBot.kt
@@ -69,6 +69,7 @@
   enum class RequestSource {
     SYNC,
     BUILD,
+    DESIGN_TOOLS,
     EDITOR,
     PLAY_VITALS,
     CRASHLYTICS,
diff --git a/nav/editor/testSrc/com/android/tools/idea/naveditor/surface/NavDesignSurfaceZoomControlsTest.kt b/nav/editor/testSrc/com/android/tools/idea/naveditor/surface/NavDesignSurfaceZoomControlsTest.kt
index 4dac143..f5d4504 100644
--- a/nav/editor/testSrc/com/android/tools/idea/naveditor/surface/NavDesignSurfaceZoomControlsTest.kt
+++ b/nav/editor/testSrc/com/android/tools/idea/naveditor/surface/NavDesignSurfaceZoomControlsTest.kt
@@ -23,6 +23,7 @@
 import com.android.tools.adtui.swing.FakeUi
 import com.android.tools.editor.zoomActionPlace
 import com.android.tools.idea.common.model.NlModel
+import com.android.tools.idea.concurrency.executeOnPooledThread
 import com.android.tools.idea.naveditor.model.NavComponentRegistrar
 import com.android.tools.idea.rendering.RenderTestUtil
 import com.android.tools.idea.rendering.StudioRenderService
@@ -32,6 +33,7 @@
 import com.android.tools.idea.util.androidFacet
 import com.intellij.openapi.actionSystem.impl.ActionToolbarImpl
 import com.intellij.openapi.application.ApplicationManager
+import com.intellij.openapi.application.runReadAction
 import com.intellij.openapi.util.Computable
 import com.intellij.testFramework.TestActionEvent
 import com.intellij.ui.JBColor
@@ -108,9 +110,9 @@
       """.trimIndent()
     )
 
-    UIUtil.invokeAndWaitIfNeeded(Runnable {
-      NavigationSchema.createIfNecessary(androidProjectRule.module)
-    })
+    executeOnPooledThread {
+      runReadAction { NavigationSchema.createIfNecessary(androidProjectRule.module) }
+    }.get()
   }
 
   private fun getGoldenImagePath(testName: String) =
diff --git a/nav/safeargs/BUILD b/nav/safeargs/BUILD
index 54a1c88..8ed0d81 100644
--- a/nav/safeargs/BUILD
+++ b/nav/safeargs/BUILD
@@ -11,5 +11,6 @@
     deps = [
         "//tools/adt/idea/nav/safeargs/common:intellij.android.nav.safeargs.common[module]",
         "//tools/adt/idea/nav/safeargs/k1:intellij.android.nav.safeargs.k1[module]",
+        "//tools/adt/idea/nav/safeargs/k2:intellij.android.nav.safeargs.k2[module]",
     ],
 )
diff --git a/nav/safeargs/common/src/com/android/tools/idea/nav/safeargs/module/NavInfoFetcher.kt b/nav/safeargs/common/src/com/android/tools/idea/nav/safeargs/module/NavInfoFetcher.kt
index 7349369..b0065f4 100644
--- a/nav/safeargs/common/src/com/android/tools/idea/nav/safeargs/module/NavInfoFetcher.kt
+++ b/nav/safeargs/common/src/com/android/tools/idea/nav/safeargs/module/NavInfoFetcher.kt
@@ -153,15 +153,14 @@
   }
 
   private val androidFacetIfEnabled: AndroidFacet?
-    get() =
-      AndroidFacet.getInstance(module)?.takeIf { it.isSafeArgsEnabled() && it.safeArgsMode == mode }
+    get() = getAndroidFacetIfSafeArgsEnabled(module, mode)
 
   /**
    * Whether the project is currently enabled (SafeArgs enabled for project, and [SafeArgsMode]
    * matches filter).
    */
   override val isEnabled: Boolean
-    get() = androidFacetIfEnabled != null
+    get() = isSafeArgsModule(module, mode)
 
   /**
    * The current modification count of the navigation resources.
@@ -213,6 +212,16 @@
 
     return NavInfo(facet, modulePackage, entries, navVersion, modificationCount)
   }
+
+  companion object {
+    private fun getAndroidFacetIfSafeArgsEnabled(module: Module, requiredMode: SafeArgsMode) =
+      AndroidFacet.getInstance(module)?.takeIf {
+        it.isSafeArgsEnabled() && it.safeArgsMode == requiredMode
+      }
+
+    fun isSafeArgsModule(module: Module, requiredMode: SafeArgsMode) =
+      getAndroidFacetIfSafeArgsEnabled(module, requiredMode) != null
+  }
 }
 
 /**
diff --git a/nav/safeargs/common/src/com/android/tools/idea/nav/safeargs/project/SafeArgsEnabledFacetsProjectService.kt b/nav/safeargs/common/src/com/android/tools/idea/nav/safeargs/project/SafeArgsEnabledFacetsProjectService.kt
index 6710f24..66b2410 100644
--- a/nav/safeargs/common/src/com/android/tools/idea/nav/safeargs/project/SafeArgsEnabledFacetsProjectService.kt
+++ b/nav/safeargs/common/src/com/android/tools/idea/nav/safeargs/project/SafeArgsEnabledFacetsProjectService.kt
@@ -34,7 +34,7 @@
  * This component also serves as a [ModificationTracker] that will allow caches to know when this
  * list might have been updated.
  */
-@Service
+@Service(Service.Level.PROJECT)
 class SafeArgsEnabledFacetsProjectService(val project: Project) : ModificationTracker {
   companion object {
     fun getInstance(project: Project): SafeArgsEnabledFacetsProjectService =
diff --git a/nav/safeargs/common/src/com/android/tools/idea/nav/safeargs/psi/ArgumentUtils.kt b/nav/safeargs/common/src/com/android/tools/idea/nav/safeargs/psi/ArgumentUtils.kt
index 876dd1a..ae737d3 100644
--- a/nav/safeargs/common/src/com/android/tools/idea/nav/safeargs/psi/ArgumentUtils.kt
+++ b/nav/safeargs/common/src/com/android/tools/idea/nav/safeargs/psi/ArgumentUtils.kt
@@ -20,9 +20,9 @@
     modulePackage: String,
     adjustArgumentsWithDefaults: Boolean = false,
   ): List<NavActionData> =
-    actions.mapNotNull { action ->
+    actions.map { action ->
       if (action.destination == null) {
-        return@mapNotNull if (action.popUpTo == null) {
+        return@map if (action.popUpTo == null) {
           // No destination, no popUpTo: nothing we can do to resolve this, return untouched.
           action
         } else {
@@ -50,7 +50,7 @@
           resolvedArguments
         }
 
-      return@mapNotNull object : NavActionData by action {
+      return@map object : NavActionData by action {
         override val arguments: List<NavArgumentData> = adjustedArguments
       }
     }
diff --git a/nav/safeargs/common/src/com/android/tools/idea/nav/safeargs/psi/SafeArgsFeatureVersions.kt b/nav/safeargs/common/src/com/android/tools/idea/nav/safeargs/psi/SafeArgsFeatureVersions.kt
index d36e600..87bcc2c 100644
--- a/nav/safeargs/common/src/com/android/tools/idea/nav/safeargs/psi/SafeArgsFeatureVersions.kt
+++ b/nav/safeargs/common/src/com/android/tools/idea/nav/safeargs/psi/SafeArgsFeatureVersions.kt
@@ -20,9 +20,8 @@
 import com.android.tools.idea.projectsystem.getModuleSystem
 import org.jetbrains.android.facet.AndroidFacet
 
-internal val GRADLE_VERSION_ZERO = Version.prefixInfimum("0")
-
 object SafeArgsFeatureVersions {
+  val MINIMUM_VERSION = Version.prefixInfimum("0")
   val FROM_SAVED_STATE_HANDLE = Version.parse("2.4.0-alpha01")
   val TO_SAVED_STATE_HANDLE = Version.parse("2.4.0-alpha07")
   val ADJUST_PARAMS_WITH_DEFAULTS = Version.parse("2.4.0-alpha08")
@@ -35,9 +34,8 @@
  * If for any reason the version can't be found, a zero version will be returned, which can be used
  * to indicate that only base features should be supported.
  */
-internal fun AndroidFacet.findNavigationVersion(): Version {
-  return module
+internal fun AndroidFacet.findNavigationVersion(): Version =
+  module
     .getModuleSystem()
     .getResolvedDependency(GoogleMavenArtifactId.ANDROIDX_NAVIGATION_COMMON.getCoordinate("+"))
-    ?.lowerBoundVersion ?: GRADLE_VERSION_ZERO
-}
+    ?.lowerBoundVersion ?: SafeArgsFeatureVersions.MINIMUM_VERSION
diff --git a/nav/safeargs/intellij.android.nav.safeargs.iml b/nav/safeargs/intellij.android.nav.safeargs.iml
index c871656..113fc23 100644
--- a/nav/safeargs/intellij.android.nav.safeargs.iml
+++ b/nav/safeargs/intellij.android.nav.safeargs.iml
@@ -9,6 +9,7 @@
     <orderEntry type="sourceFolder" forTests="false" />
     <orderEntry type="module" module-name="intellij.android.nav.safeargs.common" />
     <orderEntry type="module" module-name="intellij.android.nav.safeargs.k1" />
+    <orderEntry type="module" module-name="intellij.android.nav.safeargs.k2" />
     <orderEntry type="module" module-name="intellij.android.nav.safeargs.common.gradle" scope="RUNTIME" />
   </component>
 </module>
diff --git a/nav/safeargs/k2/BUILD b/nav/safeargs/k2/BUILD
new file mode 100644
index 0000000..84684ff
--- /dev/null
+++ b/nav/safeargs/k2/BUILD
@@ -0,0 +1,18 @@
+load("//tools/base/bazel:bazel.bzl", "iml_module")
+
+# managed by go/iml_to_build
+iml_module(
+    name = "intellij.android.nav.safeargs.k2",
+    srcs = ["src"],
+    iml_files = ["intellij.android.nav.safeargs.k2.iml"],
+    visibility = ["//visibility:public"],
+    # do not sort: must match IML order
+    deps = [
+        "//prebuilts/studio/intellij-sdk:studio-sdk",
+        "//prebuilts/studio/intellij-sdk:studio-sdk-plugin-Kotlin",
+        "//tools/base/common:studio.android.sdktools.common[module]",
+        "//tools/base/sdk-common:studio.android.sdktools.sdk-common[module]",
+        "//tools/adt/idea/nav/safeargs/common:intellij.android.nav.safeargs.common[module]",
+        "//tools/adt/idea/project-system:intellij.android.projectSystem[module]",
+    ],
+)
diff --git a/nav/safeargs/k2/intellij.android.nav.safeargs.k2.iml b/nav/safeargs/k2/intellij.android.nav.safeargs.k2.iml
new file mode 100644
index 0000000..a1bb930
--- /dev/null
+++ b/nav/safeargs/k2/intellij.android.nav.safeargs.k2.iml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" inherit-compiler-output="true">
+    <exclude-output />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="library" name="studio-sdk" level="project" />
+    <orderEntry type="library" name="studio-plugin-Kotlin" level="project" />
+    <orderEntry type="module" module-name="android.sdktools.common" />
+    <orderEntry type="module" module-name="android.sdktools.sdk-common" />
+    <orderEntry type="module" module-name="intellij.android.nav.safeargs.common" />
+    <orderEntry type="module" module-name="intellij.android.projectSystem" />
+  </component>
+</module>
\ No newline at end of file
diff --git a/nav/safeargs/k2/src/META-INF/safeargs.k2.xml b/nav/safeargs/k2/src/META-INF/safeargs.k2.xml
new file mode 100644
index 0000000..48d9882
--- /dev/null
+++ b/nav/safeargs/k2/src/META-INF/safeargs.k2.xml
@@ -0,0 +1,24 @@
+<!--
+  ~ Copyright (C) 2023 The Android Open Source Project
+  ~
+  ~ Licensed under the Apache License, Version 2.0 (the "License");
+  ~ you may not use this file except in compliance with the License.
+  ~ You may obtain a copy of the License at
+  ~
+  ~      http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing, software
+  ~ distributed under the License is distributed on an "AS IS" BASIS,
+  ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  ~ See the License for the specific language governing permissions and
+  ~ limitations under the License.
+  -->
+<idea-plugin>
+  <extensions defaultExtensionNs="com.intellij">
+    <moduleService serviceImplementation="com.android.tools.idea.nav.safeargs.kotlin.k2.SafeArgsResolveExtensionModuleService" />
+  </extensions>
+
+  <extensions defaultExtensionNs="org.jetbrains.kotlin">
+    <ktResolveExtensionProvider implementation="com.android.tools.idea.nav.safeargs.kotlin.k2.SafeArgsResolveExtensionProvider" />
+  </extensions>
+</idea-plugin>
diff --git a/nav/safeargs/k2/src/com/android/tools/idea/nav/safeargs/kotlin/k2/ArgsClassResolveExtensionFile.kt b/nav/safeargs/k2/src/com/android/tools/idea/nav/safeargs/kotlin/k2/ArgsClassResolveExtensionFile.kt
new file mode 100644
index 0000000..ce81d05
--- /dev/null
+++ b/nav/safeargs/k2/src/com/android/tools/idea/nav/safeargs/kotlin/k2/ArgsClassResolveExtensionFile.kt
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.tools.idea.nav.safeargs.kotlin.k2
+
+import com.android.SdkConstants
+import com.android.tools.idea.nav.safeargs.index.NavArgumentData
+import com.android.tools.idea.nav.safeargs.index.NavDestinationData
+import com.android.tools.idea.nav.safeargs.module.NavInfo
+import com.android.tools.idea.nav.safeargs.psi.SafeArgsFeatureVersions
+import com.android.tools.idea.nav.safeargs.psi.java.toCamelCase
+import com.android.tools.idea.nav.safeargs.psi.xml.findChildTagElementByNameAttr
+import com.intellij.psi.PsiElement
+import com.intellij.psi.xml.XmlTag
+import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
+import org.jetbrains.kotlin.analysis.api.symbols.KtDeclarationSymbol
+import org.jetbrains.kotlin.analysis.api.symbols.KtVariableLikeSymbol
+import org.jetbrains.kotlin.name.ClassId
+
+/*
+ * data class <ARGS_CLASS>(
+ *   val firstArgument: FirstArgumentType,
+ *   ...
+ * ) : androidx.navigation.NavArgs {
+ *   fun toBundle(): android.os.Bundle { ... }
+ *
+ *   #if TO_SAVED_STATE_HANDLE
+ *   fun toSavedStateHandle(): androidx.lifecycle.SavedStateHandle { ... }
+ *   #endif
+ *
+ *   companion object {
+ *     fun fromBundle(bundle: android.os.Bundle): <ARGS_CLASS> { ... }
+ *
+ *     #if TO_SAVED_STATE_HANDLE
+ *     fun fromSavedStateHandle(savedStateHandle: androidx.lifecycle.SavedStateHandle): <ARGS_CLASS> { ... }
+ *     #endif
+ *   }
+ * }
+ *
+ */
+
+internal class ArgsClassResolveExtensionFile(
+  private val navInfo: NavInfo,
+  destination: NavDestinationData,
+  classId: ClassId,
+  private val destinationXmlTag: XmlTag?,
+) : SafeArgsResolveExtensionFile(classId) {
+  private val resolvedArguments =
+    if (navInfo.navVersion >= SafeArgsFeatureVersions.ADJUST_PARAMS_WITH_DEFAULTS) {
+      destination.arguments.sortedBy { it.defaultValue != null }
+    } else {
+      destination.arguments
+    }
+
+  override fun KtAnalysisSession.getNavigationElementForDeclaration(
+    symbol: KtDeclarationSymbol
+  ): PsiElement? =
+    when (symbol) {
+      is KtVariableLikeSymbol -> getNavigationElementForVariableLikeSymbol(symbol)
+      else -> destinationXmlTag
+    }
+
+  private fun KtAnalysisSession.getNavigationElementForVariableLikeSymbol(
+    symbol: KtVariableLikeSymbol
+  ): PsiElement? {
+    val matchingArgument =
+      resolvedArguments.firstOrNull {
+        it.name.toCamelCase() == symbol.name.identifierOrNullIfSpecial
+      }
+    return matchingArgument?.argumentTag ?: destinationXmlTag
+  }
+
+  override val fallbackPsi
+    get() = destinationXmlTag
+
+  override fun StringBuilder.buildClassBody() {
+    appendLine("data class ${classId.shortClassName}(")
+    for (arg in resolvedArguments) {
+      append("  val ${arg.name.toCamelCase()}: ${arg.resolveKotlinType(navInfo.packageName)}")
+      if (arg.defaultValue != null) {
+        appendLine(" = TODO(),  // ${arg.defaultValue}")
+      } else {
+        appendLine(",")
+      }
+    }
+    appendLine(") : androidx.navigation.NavArgs {")
+    appendLine("  fun toBundle(): android.os.Bundle = TODO()")
+    if (navInfo.navVersion >= SafeArgsFeatureVersions.TO_SAVED_STATE_HANDLE) {
+      appendLine("  fun toSavedStateHandle(): androidx.lifecycle.SavedStateHandle = TODO()")
+    }
+    appendLine()
+    appendLine("  companion object {")
+    appendLine("    @kotlin.jvm.JvmStatic")
+    appendLine(
+      "    fun fromBundle(bundle: android.os.Bundle): ${classId.asFqNameString()} = TODO()"
+    )
+    if (navInfo.navVersion >= SafeArgsFeatureVersions.FROM_SAVED_STATE_HANDLE) {
+      appendLine("    @kotlin.jvm.JvmStatic")
+      appendLine(
+        "    fun fromSavedStateHandle(handle: androidx.lifecycle.SavedStateHandle): ${classId.asFqNameString()} = TODO()"
+      )
+    }
+    appendLine("  }")
+    appendLine("}")
+  }
+
+  private val NavArgumentData.argumentTag: XmlTag?
+    get() =
+      destinationXmlTag?.findChildTagElementByNameAttr(SdkConstants.TAG_ARGUMENT, name)
+        ?: destinationXmlTag
+}
diff --git a/nav/safeargs/k2/src/com/android/tools/idea/nav/safeargs/kotlin/k2/ChangeListenerProjectService.kt b/nav/safeargs/k2/src/com/android/tools/idea/nav/safeargs/kotlin/k2/ChangeListenerProjectService.kt
new file mode 100644
index 0000000..0d07121
--- /dev/null
+++ b/nav/safeargs/k2/src/com/android/tools/idea/nav/safeargs/kotlin/k2/ChangeListenerProjectService.kt
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.tools.idea.nav.safeargs.kotlin.k2
+
+import com.android.tools.idea.nav.safeargs.module.SafeArgsModeModuleService
+import com.android.tools.idea.projectsystem.PROJECT_SYSTEM_SYNC_TOPIC
+import com.android.tools.idea.projectsystem.ProjectSystemSyncManager
+import com.intellij.openapi.Disposable
+import com.intellij.openapi.application.runWriteAction
+import com.intellij.openapi.components.Service
+import com.intellij.openapi.module.Module
+import com.intellij.openapi.project.Project
+import org.jetbrains.kotlin.analysis.providers.analysisMessageBus
+import org.jetbrains.kotlin.analysis.providers.topics.KotlinModuleStateModificationKind
+import org.jetbrains.kotlin.analysis.providers.topics.KotlinTopics
+
+/** Raises module-change events when a module's SafeArgs eligibility state may have changed. */
+@Service(Service.Level.PROJECT)
+class ChangeListenerProjectService(private val project: Project) : Disposable.Default {
+
+  init {
+    project.messageBus.connect(this).apply {
+      subscribe(
+        SafeArgsModeModuleService.MODE_CHANGED,
+        SafeArgsModeModuleService.SafeArgsModeChangedListener { module, mode ->
+          dispatchSafeArgsModeChange(module)
+        },
+      )
+      subscribe(
+        PROJECT_SYSTEM_SYNC_TOPIC,
+        ProjectSystemSyncManager.SyncResultListener { dispatchGradleSync() },
+      )
+    }
+  }
+
+  private fun dispatchSafeArgsModeChange(module: Module) {
+    module.fireEvent(KotlinTopics.MODULE_STATE_MODIFICATION) {
+      onModification(it, KotlinModuleStateModificationKind.UPDATE)
+    }
+  }
+
+  private fun dispatchGradleSync() {
+    // We never care about non-source modules, so we only dispatch a global source module
+    // state-change event here, so we don't unnecessarily invalidate binary module cached data.
+    runWriteAction {
+      project.analysisMessageBus
+        .syncPublisher(KotlinTopics.GLOBAL_SOURCE_MODULE_STATE_MODIFICATION)
+        .onModification()
+    }
+  }
+
+  companion object {
+    fun ensureListening(project: Project) {
+      // Force creation of the service - it will connect to the message bus in its init block.
+      project.getService(ChangeListenerProjectService::class.java)
+    }
+  }
+}
diff --git a/nav/safeargs/k2/src/com/android/tools/idea/nav/safeargs/kotlin/k2/DirectionsClassResolveExtensionFile.kt b/nav/safeargs/k2/src/com/android/tools/idea/nav/safeargs/kotlin/k2/DirectionsClassResolveExtensionFile.kt
new file mode 100644
index 0000000..c44029a
--- /dev/null
+++ b/nav/safeargs/k2/src/com/android/tools/idea/nav/safeargs/kotlin/k2/DirectionsClassResolveExtensionFile.kt
@@ -0,0 +1,148 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.tools.idea.nav.safeargs.kotlin.k2
+
+import com.android.SdkConstants
+import com.android.tools.idea.nav.safeargs.index.NavActionData
+import com.android.tools.idea.nav.safeargs.index.NavArgumentData
+import com.android.tools.idea.nav.safeargs.index.NavDestinationData
+import com.android.tools.idea.nav.safeargs.module.NavEntry
+import com.android.tools.idea.nav.safeargs.module.NavInfo
+import com.android.tools.idea.nav.safeargs.psi.ArgumentUtils.getActionsWithResolvedArguments
+import com.android.tools.idea.nav.safeargs.psi.ArgumentUtils.getTargetDestination
+import com.android.tools.idea.nav.safeargs.psi.SafeArgsFeatureVersions
+import com.android.tools.idea.nav.safeargs.psi.java.toCamelCase
+import com.android.tools.idea.nav.safeargs.psi.xml.findChildTagElementByNameAttr
+import com.android.tools.idea.nav.safeargs.psi.xml.findFirstMatchingElementByTraversingUp
+import com.android.tools.idea.nav.safeargs.psi.xml.findXmlTagById
+import com.intellij.psi.PsiElement
+import com.intellij.psi.xml.XmlTag
+import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
+import org.jetbrains.kotlin.analysis.api.symbols.KtClassOrObjectSymbol
+import org.jetbrains.kotlin.analysis.api.symbols.KtDeclarationSymbol
+import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol
+import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol
+import org.jetbrains.kotlin.name.ClassId
+
+/*
+ * class ${Name}Directions {
+ *   companion object {
+ *     // One method for each outbound action.
+ *     fun someActionName(): NavDirections
+ *     // Args can be defined by the destination or overridden by the action.
+ *     // See [ArgumentUtils.getActionsWithResolvedArguments] for full argument resolution logic.
+ *     fun someActionWithArgs(arg1: Arg1Type, arg2: Arg2Type = defaultValue(), ...): NavDirections
+ *   }
+ * }
+ */
+internal class DirectionsClassResolveExtensionFile(
+  private val navInfo: NavInfo,
+  private val navEntry: NavEntry,
+  destination: NavDestinationData,
+  classId: ClassId,
+  private val destinationXmlTag: XmlTag?,
+) : SafeArgsResolveExtensionFile(classId) {
+  private val actionsWithResolvedArguments =
+    destination.getActionsWithResolvedArguments(
+      navEntry.data,
+      navInfo.packageName,
+      adjustArgumentsWithDefaults =
+        (navInfo.navVersion >= SafeArgsFeatureVersions.ADJUST_PARAMS_WITH_DEFAULTS),
+    )
+
+  override fun StringBuilder.buildClassBody() {
+    appendLine("class ${classId.shortClassName} private constructor() {")
+    appendLine("  companion object {")
+    for (action in actionsWithResolvedArguments) {
+      appendLine("    // action ${action.id}")
+      appendLine("    fun ${action.id.toCamelCase()}(")
+      for (argument in action.arguments) {
+        appendLine(
+          "        " +
+            "// argument ${argument.name}: " +
+            "${argument.type ?: "<undefined type>"} " +
+            "(nullable: ${argument.nullable ?: "<null>"})" +
+            " = ${argument.defaultValue ?: "<no default>"}"
+        )
+        val argumentType = argument.resolveKotlinType(navInfo.packageName)
+        append("        ${argument.name.toCamelCase()}: ${argumentType}")
+        if (argument.defaultValue != null) {
+          appendLine(" = TODO(),  // ${argument.defaultValue}")
+        } else {
+          appendLine(",")
+        }
+      }
+      appendLine("    ): androidx.navigation.NavDirections = TODO()")
+      appendLine()
+    }
+    appendLine("  }") // companion object
+    appendLine("}") // class
+  }
+
+  override val fallbackPsi
+    get() = destinationXmlTag
+
+  override fun KtAnalysisSession.getNavigationElementForDeclaration(
+    symbol: KtDeclarationSymbol
+  ): PsiElement? =
+    when (symbol) {
+      // Containing class or its companion object -> overall destination.
+      is KtClassOrObjectSymbol -> destinationXmlTag
+      // Function on companion object -> matching action tag.
+      is KtFunctionSymbol -> findMatchingAction(symbol)?.actionTag ?: destinationXmlTag
+      // Argument of companion object function -> argument under action (preferred) or destination.
+      is KtValueParameterSymbol -> getTagForValueParameterSymbol(symbol) ?: destinationXmlTag
+      else -> null
+    }
+
+  private fun KtAnalysisSession.getTagForValueParameterSymbol(
+    symbol: KtValueParameterSymbol
+  ): XmlTag? {
+    val declaringFunctionSymbol = symbol.getContainingSymbol() as? KtFunctionSymbol ?: return null
+    val matchingAction = findMatchingAction(declaringFunctionSymbol) ?: return null
+    val actionTag = matchingAction.actionTag
+
+    val originalArgument =
+      matchingAction.arguments.firstOrNull {
+        it.name.toCamelCase() == symbol.name.identifierOrNullIfSpecial
+      } ?: return actionTag
+
+    // Search arguments under action first.
+    actionTag?.findChildArgumentTag(originalArgument)?.let {
+      return it
+    }
+
+    // Next, search arguments under destination.
+    val destination = matchingAction.getTargetDestination(navEntry.data) ?: return actionTag
+    val destinationTag = navEntry.backingXmlFile?.findXmlTagById(destination.id) ?: return actionTag
+    destinationTag.findChildArgumentTag(originalArgument)?.let {
+      return it
+    }
+
+    return actionTag
+  }
+
+  private fun KtAnalysisSession.findMatchingAction(symbol: KtFunctionSymbol): NavActionData? =
+    actionsWithResolvedArguments.firstOrNull {
+      it.id.toCamelCase() == symbol.name.identifierOrNullIfSpecial
+    }
+
+  private fun XmlTag.findChildArgumentTag(argument: NavArgumentData): XmlTag? =
+    findChildTagElementByNameAttr(SdkConstants.TAG_ARGUMENT, argument.name)
+
+  private val NavActionData.actionTag: XmlTag?
+    get() = destinationXmlTag?.findFirstMatchingElementByTraversingUp(SdkConstants.TAG_ACTION, id)
+}
diff --git a/nav/safeargs/k2/src/com/android/tools/idea/nav/safeargs/kotlin/k2/EventUtils.kt b/nav/safeargs/k2/src/com/android/tools/idea/nav/safeargs/kotlin/k2/EventUtils.kt
new file mode 100644
index 0000000..c6e0b91
--- /dev/null
+++ b/nav/safeargs/k2/src/com/android/tools/idea/nav/safeargs/kotlin/k2/EventUtils.kt
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.tools.idea.nav.safeargs.kotlin.k2
+
+import com.intellij.openapi.application.runWriteAction
+import com.intellij.openapi.module.Module
+import com.intellij.util.messages.Topic
+import org.jetbrains.kotlin.analysis.project.structure.KtModule
+import org.jetbrains.kotlin.analysis.providers.analysisMessageBus
+import org.jetbrains.kotlin.idea.util.toKtModulesForModificationEvents
+
+internal fun <T : Any> Module.fireEvent(topic: Topic<T>, callEventHandler: T.(KtModule) -> Unit) =
+  runWriteAction {
+    val publisher = project.analysisMessageBus.syncPublisher(topic)
+    this@fireEvent.toKtModulesForModificationEvents().forEach { publisher.callEventHandler(it) }
+  }
diff --git a/nav/safeargs/k2/src/com/android/tools/idea/nav/safeargs/kotlin/k2/SafeArgsResolveExtensionFile.kt b/nav/safeargs/k2/src/com/android/tools/idea/nav/safeargs/kotlin/k2/SafeArgsResolveExtensionFile.kt
new file mode 100644
index 0000000..a6573b8
--- /dev/null
+++ b/nav/safeargs/k2/src/com/android/tools/idea/nav/safeargs/kotlin/k2/SafeArgsResolveExtensionFile.kt
@@ -0,0 +1,83 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.tools.idea.nav.safeargs.kotlin.k2
+
+import com.intellij.psi.PsiElement
+import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
+import org.jetbrains.kotlin.analysis.api.resolve.extensions.KtResolveExtensionFile
+import org.jetbrains.kotlin.analysis.api.resolve.extensions.KtResolveExtensionNavigationTargetsProvider
+import org.jetbrains.kotlin.analysis.api.symbols.KtDeclarationSymbol
+import org.jetbrains.kotlin.name.ClassId
+import org.jetbrains.kotlin.name.FqName
+import org.jetbrains.kotlin.name.Name
+import org.jetbrains.kotlin.psi.KtDeclaration
+import org.jetbrains.kotlin.psi.KtElement
+import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf
+
+abstract class SafeArgsResolveExtensionFile(val classId: ClassId) : KtResolveExtensionFile() {
+  init {
+    check(!classId.isLocal && classId.outermostClassId == classId) {
+      "classId ${classId} must be top-level"
+    }
+  }
+
+  override fun getFileName(): String = "${classId.shortClassName}.kt"
+
+  override fun getFilePackageName(): FqName = classId.packageFqName
+
+  override fun getTopLevelCallableNames(): Set<Name> = setOf()
+
+  override fun getTopLevelClassifierNames(): Set<Name> = setOf(classId.shortClassName)
+
+  protected open fun getImports(): Set<String> = setOf()
+
+  private val fileText: String by lazy {
+    buildString {
+      appendLine("// This file is generated on-the-fly by SafeArgs.")
+      appendLine()
+      appendLine("package ${getFilePackageName()}")
+      appendLine()
+      getImports().sorted().forEach { appendLine("import ${it}") }
+      appendLine()
+      buildClassBody()
+    }
+  }
+
+  protected abstract fun StringBuilder.buildClassBody()
+
+  override fun buildFileText(): String = fileText
+
+  protected abstract fun KtAnalysisSession.getNavigationElementForDeclaration(
+    symbol: KtDeclarationSymbol
+  ): PsiElement?
+
+  protected abstract val fallbackPsi: PsiElement?
+
+  private fun KtAnalysisSession.getNavigationElement(element: KtElement): PsiElement? =
+    element.parentsWithSelf.filterIsInstance<KtDeclaration>().firstNotNullOfOrNull {
+      getNavigationElementForDeclaration(it.getSymbol())
+    } ?: fallbackPsi
+
+  private val navigationTargetsProvider by lazy {
+    object : KtResolveExtensionNavigationTargetsProvider() {
+      override fun KtAnalysisSession.getNavigationTargets(
+        element: KtElement
+      ): Collection<PsiElement> = listOfNotNull(getNavigationElement(element))
+    }
+  }
+
+  override fun createNavigationTargetsProvider() = navigationTargetsProvider
+}
diff --git a/nav/safeargs/k2/src/com/android/tools/idea/nav/safeargs/kotlin/k2/SafeArgsResolveExtensionModuleService.kt b/nav/safeargs/k2/src/com/android/tools/idea/nav/safeargs/kotlin/k2/SafeArgsResolveExtensionModuleService.kt
new file mode 100644
index 0000000..be95b7c
--- /dev/null
+++ b/nav/safeargs/k2/src/com/android/tools/idea/nav/safeargs/kotlin/k2/SafeArgsResolveExtensionModuleService.kt
@@ -0,0 +1,171 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.tools.idea.nav.safeargs.kotlin.k2
+
+import com.android.SdkConstants
+import com.android.tools.idea.nav.safeargs.SafeArgsMode
+import com.android.tools.idea.nav.safeargs.index.NavDestinationData
+import com.android.tools.idea.nav.safeargs.module.NavEntry
+import com.android.tools.idea.nav.safeargs.module.NavInfo
+import com.android.tools.idea.nav.safeargs.module.NavInfoChangeReason
+import com.android.tools.idea.nav.safeargs.module.NavInfoFetcher
+import com.android.tools.idea.nav.safeargs.module.NavStatusCache
+import com.android.tools.idea.nav.safeargs.psi.xml.findXmlTagById
+import com.android.tools.idea.projectsystem.FilenameConstants
+import com.intellij.openapi.Disposable
+import com.intellij.openapi.diagnostic.thisLogger
+import com.intellij.openapi.module.Module
+import com.intellij.openapi.vfs.VirtualFile
+import com.intellij.psi.search.GlobalSearchScope
+import com.intellij.psi.search.GlobalSearchScopesCore
+import com.intellij.psi.xml.XmlTag
+import org.jetbrains.kotlin.analysis.api.resolve.extensions.KtResolveExtension
+import org.jetbrains.kotlin.analysis.api.resolve.extensions.KtResolveExtensionFile
+import org.jetbrains.kotlin.analysis.providers.topics.KotlinTopics
+import org.jetbrains.kotlin.idea.base.util.parentsWithSelf
+import org.jetbrains.kotlin.idea.util.sourceRoots
+import org.jetbrains.kotlin.name.ClassId
+import org.jetbrains.kotlin.name.FqName
+
+class SafeArgsResolveExtensionModuleService(private val module: Module) :
+  KtResolveExtension(), Disposable.Default {
+  private data class Status(
+    val args: List<ArgsClassResolveExtensionFile>,
+    val directions: List<DirectionsClassResolveExtensionFile>,
+  )
+
+  private val currentStatus by
+    NavStatusCache(
+      parent = this,
+      module = module,
+      mode = SafeArgsMode.KOTLIN,
+      onCacheInvalidate = ::fireInvalidateEvent,
+    ) {
+      logger.info("Updating status for module $module")
+      Status(createArgsFiles(it), createDirectionsFiles(it))
+    }
+
+  private val args: List<ArgsClassResolveExtensionFile>
+    get() = currentStatus?.args ?: emptyList()
+
+  private val directions: List<DirectionsClassResolveExtensionFile>
+    get() = currentStatus?.directions ?: emptyList()
+
+  private val allClasses: List<KtResolveExtensionFile>
+    get() = args + directions
+
+  override fun getKtFiles(): List<KtResolveExtensionFile> = allClasses
+
+  override fun getContainedPackages(): Set<FqName> =
+    allClasses.map { it.getFilePackageName() }.toSet()
+
+  override fun getShadowedScope(): GlobalSearchScope {
+    if (currentStatus == null) {
+      return GlobalSearchScope.EMPTY_SCOPE
+    }
+
+    // Filter out any source roots under "generated/source/navigation-args".
+    val matchingRoots =
+      module.sourceRoots.filter {
+        it.hasPathComponents(
+          FilenameConstants.GENERATED,
+          SdkConstants.FD_SOURCE_GEN,
+          FilenameConstants.SAFE_ARG_CLASS_SOURCES,
+        )
+      }
+
+    return GlobalSearchScopesCore.directoriesScope(
+      module.project,
+      /* withSubdirectories: */ true,
+      *matchingRoots.toTypedArray(),
+    )
+  }
+
+  private fun fireInvalidateEvent(reason: NavInfoChangeReason) {
+    if (
+      reason.shouldRaiseOutOfBlockModification()
+      // Only fire events if we're enabled and would be generating declarations here.
+      // This prevents excessive churn if we were enabled at one point, but became
+      // disabled later due to a change in module SafeArgs mode - since we're a
+      // module service, we'll stick around and continue to receive callbacks from
+      // NavStatusCache even if we're not currently acting as a KtResolveExtension.
+      && NavInfoFetcher.isSafeArgsModule(module, SafeArgsMode.KOTLIN)
+    ) {
+      module.fireEvent(KotlinTopics.MODULE_OUT_OF_BLOCK_MODIFICATION) { onModification(it) }
+    }
+  }
+
+  private fun NavInfoChangeReason.shouldRaiseOutOfBlockModification(): Boolean =
+    when (this) {
+      // These events raise a module-change event in ChangeListenerProjectService.
+      NavInfoChangeReason.SAFE_ARGS_MODE_CHANGED,
+      NavInfoChangeReason.GRADLE_SYNC -> false
+      // List out everything else explicitly, to force this file to be changed if another reason is
+      // added to NavInfoChangeReason.
+      NavInfoChangeReason.NAVIGATION_RESOURCE_CHANGED,
+      NavInfoChangeReason.DUMB_MODE_CHANGED -> true
+    }
+
+  private fun VirtualFile.hasPathComponents(vararg names: String): Boolean {
+    val namesReversed = names.reversed()
+    return parentsWithSelf.map { it.name }.windowed(size = names.size).any { it == namesReversed }
+  }
+
+  private fun createArgsFiles(navInfo: NavInfo): List<ArgsClassResolveExtensionFile> =
+    navInfo.entries.flatMap { navEntry ->
+      navEntry.data.resolvedDestinations
+        .filter { it.arguments.isNotEmpty() }
+        .map { destination ->
+          ArgsClassResolveExtensionFile(
+            navInfo,
+            destination,
+            destination.resolveClassId(navInfo, "Args"),
+            destination.resolveTag(navEntry),
+          )
+        }
+    }
+
+  private fun createDirectionsFiles(navInfo: NavInfo): List<DirectionsClassResolveExtensionFile> =
+    navInfo.entries.flatMap { navEntry ->
+      navEntry.data.resolvedDestinations
+        .filter { it.actions.isNotEmpty() }
+        .map { destination ->
+          DirectionsClassResolveExtensionFile(
+            navInfo,
+            navEntry,
+            destination,
+            destination.resolveClassId(navInfo, "Directions"),
+            destination.resolveTag(navEntry),
+          )
+        }
+    }
+
+  private fun NavDestinationData.resolveClassId(navInfo: NavInfo, suffix: String): ClassId {
+    val packageNamePrefix = if (name.startsWith('.')) navInfo.packageName else ""
+    return ClassId.topLevel(FqName("${packageNamePrefix}$name${suffix}"))
+  }
+
+  private fun NavDestinationData.resolveTag(navEntry: NavEntry): XmlTag? =
+    navEntry.backingXmlFile?.run { findXmlTagById(id) ?: rootTag }
+
+  companion object {
+    private val logger = thisLogger()
+
+    @JvmStatic
+    fun getInstance(module: Module) =
+      module.getService(SafeArgsResolveExtensionModuleService::class.java)!!
+  }
+}
diff --git a/nav/safeargs/k2/src/com/android/tools/idea/nav/safeargs/kotlin/k2/SafeArgsResolveExtensionProvider.kt b/nav/safeargs/k2/src/com/android/tools/idea/nav/safeargs/kotlin/k2/SafeArgsResolveExtensionProvider.kt
new file mode 100644
index 0000000..8bee3ca
--- /dev/null
+++ b/nav/safeargs/k2/src/com/android/tools/idea/nav/safeargs/kotlin/k2/SafeArgsResolveExtensionProvider.kt
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.tools.idea.nav.safeargs.kotlin.k2
+
+import com.android.tools.idea.nav.safeargs.SafeArgsMode
+import com.android.tools.idea.nav.safeargs.module.NavInfoFetcher
+import org.jetbrains.kotlin.analysis.api.resolve.extensions.KtResolveExtension
+import org.jetbrains.kotlin.analysis.api.resolve.extensions.KtResolveExtensionProvider
+import org.jetbrains.kotlin.analysis.project.structure.KtModule
+import org.jetbrains.kotlin.analysis.project.structure.KtSourceModule
+import org.jetbrains.kotlin.idea.base.projectStructure.ideaModule
+
+class SafeArgsResolveExtensionProvider : KtResolveExtensionProvider() {
+  override fun provideExtensionsFor(module: KtModule): List<KtResolveExtension> =
+    when (module) {
+      is KtSourceModule -> {
+        val ideaModule = module.ideaModule
+        ChangeListenerProjectService.ensureListening(ideaModule.project)
+
+        if (NavInfoFetcher.isSafeArgsModule(module.ideaModule, SafeArgsMode.KOTLIN)) {
+          listOf(SafeArgsResolveExtensionModuleService.getInstance(module.ideaModule))
+        } else {
+          emptyList()
+        }
+      }
+      else -> emptyList()
+    }
+}
diff --git a/nav/safeargs/k2/src/com/android/tools/idea/nav/safeargs/kotlin/k2/TypeResolutionUtils.kt b/nav/safeargs/k2/src/com/android/tools/idea/nav/safeargs/kotlin/k2/TypeResolutionUtils.kt
new file mode 100644
index 0000000..cc3521d
--- /dev/null
+++ b/nav/safeargs/k2/src/com/android/tools/idea/nav/safeargs/kotlin/k2/TypeResolutionUtils.kt
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.tools.idea.nav.safeargs.kotlin.k2
+
+import com.android.tools.idea.nav.safeargs.index.NavArgumentData
+import com.android.tools.idea.nav.safeargs.psi.java.getPsiTypeStr
+
+// getPsiTypeStr() returns Java type strings, so they need to be converted to their Kotlin
+// equivalents.
+private val TYPE_MAP =
+  mapOf(
+    "int" to "kotlin.Int",
+    "int[]" to "kotlin.IntArray",
+    "long" to "kotlin.Long",
+    "long[]" to "kotlin.LongArray",
+    "float" to "kotlin.Float",
+    "float[]" to "kotlin.FloatArray",
+    "java.lang.String" to "kotlin.String",
+    "java.lang.String[]" to "kotlin.Array<kotlin.String>",
+    "boolean" to "kotlin.Boolean",
+    "boolean[]" to "kotlin.BooleanArray",
+  )
+
+fun NavArgumentData.resolveKotlinType(modulePackageName: String): String {
+  val psiType = this.getPsiTypeStr(modulePackageName)
+  val nonNullType =
+    TYPE_MAP[psiType]
+      ?: if (psiType.endsWith("[]")) {
+        "kotlin.Array<${psiType.removeSuffix("[]")}>"
+      } else {
+        psiType
+      }
+
+  return if (isNonNull()) {
+    nonNullType
+  } else {
+    "$nonNullType?"
+  }
+}
diff --git a/nav/safeargs/src/META-INF/safeargs.xml b/nav/safeargs/src/META-INF/safeargs.xml
index 4cb0115..cc2707e 100644
--- a/nav/safeargs/src/META-INF/safeargs.xml
+++ b/nav/safeargs/src/META-INF/safeargs.xml
@@ -17,4 +17,5 @@
   <xi:include href="/META-INF/safeargs.common.xml" xpointer="xpointer(/idea-plugin/*)"/>
   <xi:include href="/META-INF/safeargs.common.gradle.xml" xpointer="xpointer(/idea-plugin/*)"/>
   <xi:include href="/META-INF/safeargs.k1.xml" xpointer="xpointer(/idea-plugin/*)" includeUnless="idea.kotlin.plugin.use.k2"/>
+  <xi:include href="/META-INF/safeargs.k2.xml" xpointer="xpointer(/idea-plugin/*)" includeIf="idea.kotlin.plugin.use.k2"/>
 </idea-plugin>
diff --git a/nav/safeargs/tests/BUILD b/nav/safeargs/tests/BUILD
index 98b426a..9539b35 100644
--- a/nav/safeargs/tests/BUILD
+++ b/nav/safeargs/tests/BUILD
@@ -29,6 +29,7 @@
     tests = [
         "//tools/adt/idea/nav/safeargs/tests/common:intellij.android.nav.safeargs.tests.common_tests",
         "//tools/adt/idea/nav/safeargs/tests/k1:intellij.android.nav.safeargs.tests.k1_tests",
+        "//tools/adt/idea/nav/safeargs/tests/k2:intellij.android.nav.safeargs.tests.k2_tests",
     ],
     visibility = ["//visibility:public"],
 )
diff --git a/nav/safeargs/tests/common/src/com/android/tools/idea/nav/safeargs/SafeArgsRule.kt b/nav/safeargs/tests/common/src/com/android/tools/idea/nav/safeargs/SafeArgsRule.kt
index 65a1fb9..d853e8a 100644
--- a/nav/safeargs/tests/common/src/com/android/tools/idea/nav/safeargs/SafeArgsRule.kt
+++ b/nav/safeargs/tests/common/src/com/android/tools/idea/nav/safeargs/SafeArgsRule.kt
@@ -38,7 +38,12 @@
  * test class or individual test method to enable it.
  */
 class SafeArgsRule(val mode: SafeArgsMode = SafeArgsMode.JAVA) : ExternalResource() {
-  private val projectRule = AndroidProjectRule.onDisk()
+  private val projectRule =
+    AndroidProjectRule.onDisk().apply {
+      if (mode == SafeArgsMode.KOTLIN) {
+        withKotlin()
+      }
+    }
 
   val fixture: JavaCodeInsightTestFixture
     get() = projectRule.fixture as JavaCodeInsightTestFixture
diff --git a/nav/safeargs/tests/common/src/com/android/tools/idea/nav/safeargs/extensions/VirtualFileUtils.kt b/nav/safeargs/tests/common/src/com/android/tools/idea/nav/safeargs/extensions/VirtualFileUtils.kt
index 2f4837b..0ae5607 100644
--- a/nav/safeargs/tests/common/src/com/android/tools/idea/nav/safeargs/extensions/VirtualFileUtils.kt
+++ b/nav/safeargs/tests/common/src/com/android/tools/idea/nav/safeargs/extensions/VirtualFileUtils.kt
@@ -15,6 +15,7 @@
  */
 package com.android.tools.idea.nav.safeargs.extensions
 
+import com.intellij.openapi.editor.Document
 import com.intellij.openapi.fileEditor.FileDocumentManager
 import com.intellij.openapi.project.Project
 import com.intellij.openapi.vfs.VirtualFile
@@ -24,7 +25,7 @@
   with(FileDocumentManager.getInstance().getDocument(this)!!) {
     val text = charsSequence.toString().replace(oldString, newString)
     setText(text)
-    PsiDocumentManager.getInstance(project).commitDocument(this)
+    PsiDocumentManager.getInstance(project).commitAndUnblockDocument(this)
   }
 }
 
@@ -32,7 +33,7 @@
   with(FileDocumentManager.getInstance().getDocument(this)!!) {
     val text = charsSequence.toString().replace(oldString, newString)
     setText(text)
-    PsiDocumentManager.getInstance(project).commitDocument(this)
+    PsiDocumentManager.getInstance(project).commitAndUnblockDocument(this)
     FileDocumentManager.getInstance().saveDocument(this)
   }
 }
@@ -40,7 +41,12 @@
 fun VirtualFile.setText(newString: String, project: Project) {
   with(FileDocumentManager.getInstance().getDocument(this)!!) {
     setText(newString)
-    PsiDocumentManager.getInstance(project).commitDocument(this)
+    PsiDocumentManager.getInstance(project).commitAndUnblockDocument(this)
     FileDocumentManager.getInstance().saveDocument(this)
   }
 }
+
+private fun PsiDocumentManager.commitAndUnblockDocument(document: Document) {
+  commitDocument(document)
+  doPostponedOperationsAndUnblockDocument(document)
+}
diff --git a/nav/safeargs/tests/k2/BUILD b/nav/safeargs/tests/k2/BUILD
new file mode 100644
index 0000000..e7fee73
--- /dev/null
+++ b/nav/safeargs/tests/k2/BUILD
@@ -0,0 +1,36 @@
+load("//tools/base/bazel:bazel.bzl", "iml_module")
+
+# managed by go/iml_to_build
+iml_module(
+    name = "intellij.android.nav.safeargs.tests.k2",
+    iml_files = ["intellij.android.nav.safeargs.tests.k2.iml"],
+    tags = [
+        "no_test_windows",
+    ],
+    test_class = "com.android.tools.idea.nav.safeargs.kotlin.k2.SafeArgsK2TestSuite",
+    # keep sorted
+    test_data = [
+        "//tools/adt/idea/nav/safeargs/testData",
+    ],
+    test_srcs = ["src"],
+    test_timeout = "long",
+    visibility = ["//visibility:public"],
+    # do not sort: must match IML order
+    deps = [
+        "//prebuilts/studio/intellij-sdk:studio-sdk[test]",
+        "//prebuilts/studio/intellij-sdk:studio-sdk-plugin-Kotlin[test]",
+        "//tools/adt/idea/nav/safeargs:intellij.android.nav.safeargs[module, test]",
+        "//tools/adt/idea/nav/safeargs/common:intellij.android.nav.safeargs.common[module, test]",
+        "//tools/adt/idea/nav/safeargs/k2:intellij.android.nav.safeargs.k2[module, test]",
+        "//tools/adt/idea/nav/safeargs/tests/common:intellij.android.nav.safeargs.tests.common[module, test]",
+        "//tools/adt/idea/.idea/libraries:mockito[test]",
+        "//tools/adt/idea/.idea/libraries:truth[test]",
+        "//tools/base/flags:studio.android.sdktools.flags[module, test]",
+        "//tools/base/testutils:studio.android.sdktools.testutils[module, test]",
+        "//tools/adt/idea/adt-testutils:intellij.android.adt.testutils[module, test]",
+        "//tools/adt/idea/android-common:intellij.android.common[module, test]",
+        "//tools/adt/idea/android:intellij.android.core[module, test]",
+        "//tools/adt/idea/render-resources:intellij.android.render-resources[module, test]",
+        "//tools/adt/idea/android-test-framework:intellij.android.testFramework[module, test]",
+    ],
+)
diff --git a/nav/safeargs/tests/k2/intellij.android.nav.safeargs.tests.k2.iml b/nav/safeargs/tests/k2/intellij.android.nav.safeargs.tests.k2.iml
new file mode 100644
index 0000000..e9a9e7a
--- /dev/null
+++ b/nav/safeargs/tests/k2/intellij.android.nav.safeargs.tests.k2.iml
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" inherit-compiler-output="true">
+    <exclude-output />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="true" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+    <orderEntry type="library" scope="TEST" name="studio-sdk" level="project" />
+    <orderEntry type="library" scope="TEST" name="studio-plugin-Kotlin" level="project" />
+    <orderEntry type="module" module-name="intellij.android.nav.safeargs" scope="TEST" />
+    <orderEntry type="module" module-name="intellij.android.nav.safeargs.common" scope="TEST" />
+    <orderEntry type="module" module-name="intellij.android.nav.safeargs.k2" scope="TEST" />
+    <orderEntry type="module" module-name="intellij.android.nav.safeargs.tests.common" scope="TEST" />
+    <orderEntry type="library" scope="TEST" name="mockito" level="project" />
+    <orderEntry type="library" scope="TEST" name="truth" level="project" />
+    <orderEntry type="module" module-name="android.sdktools.flags" scope="TEST" />
+    <orderEntry type="module" module-name="android.sdktools.testutils" scope="TEST" />
+    <orderEntry type="module" module-name="intellij.android.adt.testutils" scope="TEST" />
+    <orderEntry type="module" module-name="intellij.android.common" scope="TEST" />
+    <orderEntry type="module" module-name="intellij.android.core" scope="TEST" />
+    <orderEntry type="module" module-name="intellij.android.render-resources" scope="TEST" />
+    <orderEntry type="module" module-name="intellij.android.testFramework" scope="TEST" />
+  </component>
+</module>
\ No newline at end of file
diff --git a/nav/safeargs/tests/k2/src/com/android/tools/idea/nav/safeargs/kotlin/k2/AbstractSafeArgsResolveExtensionTest.kt b/nav/safeargs/tests/k2/src/com/android/tools/idea/nav/safeargs/kotlin/k2/AbstractSafeArgsResolveExtensionTest.kt
new file mode 100644
index 0000000..db74e78
--- /dev/null
+++ b/nav/safeargs/tests/k2/src/com/android/tools/idea/nav/safeargs/kotlin/k2/AbstractSafeArgsResolveExtensionTest.kt
@@ -0,0 +1,157 @@
+/*
+ * Copyright (C) 2023 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.tools.idea.nav.safeargs.kotlin.k2
+
+import com.android.ide.common.gradle.Version
+import com.android.tools.idea.nav.safeargs.SafeArgsMode
+import com.android.tools.idea.nav.safeargs.SafeArgsRule
+import com.android.tools.idea.nav.safeargs.psi.SafeArgsFeatureVersions
+import com.android.tools.idea.res.StudioResourceRepositoryManager
+import com.android.tools.idea.testing.KotlinPluginRule
+import com.android.tools.idea.testing.caret
+import com.google.common.truth.Truth.assertThat
+import com.intellij.openapi.application.runWriteAction
+import com.intellij.psi.PsiElement
+import com.intellij.psi.impl.source.resolve.reference.impl.PsiMultiReference
+import com.intellij.psi.xml.XmlFile
+import kotlin.reflect.full.declaredMemberProperties
+import org.intellij.lang.annotations.Language
+import org.jetbrains.kotlin.analysis.api.KtAllowAnalysisOnEdt
+import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
+import org.jetbrains.kotlin.analysis.api.analyze
+import org.jetbrains.kotlin.analysis.api.lifetime.allowAnalysisOnEdt
+import org.jetbrains.kotlin.analysis.api.renderer.declarations.KtDeclarationRenderer
+import org.jetbrains.kotlin.analysis.api.renderer.declarations.bodies.KtParameterDefaultValueRenderer
+import org.jetbrains.kotlin.analysis.api.renderer.declarations.impl.KtDeclarationRendererForSource
+import org.jetbrains.kotlin.analysis.api.renderer.declarations.renderers.callables.KtValueParameterSymbolRenderer
+import org.jetbrains.kotlin.analysis.api.symbols.KtClassOrObjectSymbol
+import org.jetbrains.kotlin.analysis.api.symbols.KtConstructorSymbol
+import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol
+import org.jetbrains.kotlin.analysis.api.symbols.KtNamedClassOrObjectSymbol
+import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
+import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin
+import org.jetbrains.kotlin.idea.base.plugin.KotlinPluginKind
+import org.jetbrains.kotlin.idea.references.KtReference
+import org.jetbrains.kotlin.psi.KtElement
+import org.jetbrains.kotlin.psi.KtFile
+import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstance
+import org.junit.Rule
+import org.junit.rules.RuleChain
+
+abstract class AbstractSafeArgsResolveExtensionTest {
+  protected val safeArgsRule = SafeArgsRule(SafeArgsMode.KOTLIN)
+
+  @get:Rule
+  val ruleChain =
+    RuleChain.outerRule(KotlinPluginRule(KotlinPluginKind.FIR_PLUGIN)).around(safeArgsRule)!!
+
+  protected fun addNavXml(
+    @Language("xml") fileContent: String,
+    fileName: String = "main",
+  ): XmlFile =
+    safeArgsRule.fixture.addFileToProject("res/navigation/${fileName}.xml", fileContent).also {
+      // Initialize repository after creating resources, needed for codegen to work
+      StudioResourceRepositoryManager.getInstance(safeArgsRule.androidFacet).moduleResources
+    } as XmlFile
+
+  protected fun addKotlinSource(
+    @Language("kotlin") fileContent: String,
+    fileName: String = "analyzedFile.kt",
+  ): KtFile =
+    safeArgsRule.fixture.addFileToProject("src/$fileName", fileContent).also {
+      safeArgsRule.fixture.configureFromExistingVirtualFile(it.virtualFile)
+    } as KtFile
+
+  @OptIn(KtAllowAnalysisOnEdt::class)
+  protected inline fun <reified TSymbol : KtSymbol, TResult> analyzeFileContent(
+    @Language("kotlin") fileContent: String,
+    fileName: String = "analyzedFile.kt",
+    block: KtAnalysisSession.(TSymbol) -> TResult,
+  ): TResult {
+    val ktFile = addKotlinSource(fileContent, fileName)
+    val caretReference =
+      if (caret in fileContent) {
+        when (val ref = safeArgsRule.fixture.getReferenceAtCaretPosition()) {
+          is KtReference -> ref
+          is PsiMultiReference -> ref.references.firstIsInstance<KtReference>()
+          null -> error("No reference at caret")
+          else -> error("Unknown reference type ${ref}")
+        }
+      } else {
+        null
+      }
+
+    try {
+      return allowAnalysisOnEdt {
+        analyze(ktFile) {
+          val symbol =
+            if (caretReference != null) {
+              caretReference.resolveToSymbols().single() as TSymbol
+            } else {
+              ktFile.getFileSymbol() as TSymbol
+            }
+
+          block(symbol)
+        }
+      }
+    } finally {
+      runWriteAction { ktFile.virtualFile.delete(this@AbstractSafeArgsResolveExtensionTest) }
+    }
+  }
+
+  protected fun KtAnalysisSession.getRenderedMemberFunctions(
+    symbol: KtNamedClassOrObjectSymbol,
+    renderer: KtDeclarationRenderer = RENDERER,
+  ): List<String> =
+    symbol
+      .getDeclaredMemberScope()
+      .getCallableSymbols()
+      .filterIsInstance<KtFunctionSymbol>()
+      .filter { it.origin != KtSymbolOrigin.SOURCE_MEMBER_GENERATED }
+      .map { it.render(renderer) }
+      .toList()
+
+  protected fun KtAnalysisSession.getPrimaryConstructorSymbol(
+    symbol: KtClassOrObjectSymbol
+  ): KtConstructorSymbol = symbol.getDeclaredMemberScope().getConstructors().single { it.isPrimary }
+
+  protected fun KtAnalysisSession.getResolveExtensionPsiNavigationTargets(
+    symbol: KtSymbol
+  ): Collection<PsiElement> {
+    assertThat(symbol.psi).isInstanceOf(KtElement::class.java)
+    val ktElement = symbol.psi as KtElement
+    assertThat(ktElement.isFromResolveExtension).isTrue()
+    return ktElement.getResolveExtensionNavigationElements()
+  }
+
+  companion object {
+    val KNOWN_SAFE_ARGS_VERSIONS: Map<String, Version> by lazy {
+      SafeArgsFeatureVersions::class
+        .declaredMemberProperties
+        .mapNotNull { property ->
+          (property.get(SafeArgsFeatureVersions) as? Version)?.let { property.name to it }
+        }
+        .sortedBy { it.second }
+        .toMap()
+    }
+
+    val RENDERER =
+      KtDeclarationRendererForSource.WITH_QUALIFIED_NAMES.with {
+        valueParameterRenderer = KtValueParameterSymbolRenderer.AS_SOURCE
+        parameterDefaultValueRenderer = KtParameterDefaultValueRenderer.THREE_DOTS
+      }
+  }
+}
diff --git a/nav/safeargs/tests/k2/src/com/android/tools/idea/nav/safeargs/kotlin/k2/ArgsClassResolveExtensionTest.kt b/nav/safeargs/tests/k2/src/com/android/tools/idea/nav/safeargs/kotlin/k2/ArgsClassResolveExtensionTest.kt
new file mode 100644
index 0000000..8564330
--- /dev/null
+++ b/nav/safeargs/tests/k2/src/com/android/tools/idea/nav/safeargs/kotlin/k2/ArgsClassResolveExtensionTest.kt
@@ -0,0 +1,603 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.tools.idea.nav.safeargs.kotlin.k2
+
+import com.android.ide.common.gradle.Version
+import com.android.tools.idea.nav.safeargs.SafeArgsMode
+import com.android.tools.idea.nav.safeargs.extensions.replaceWithoutSaving
+import com.android.tools.idea.nav.safeargs.project.NavigationResourcesModificationListener
+import com.android.tools.idea.nav.safeargs.psi.SafeArgsFeatureVersions
+import com.android.tools.idea.nav.safeargs.psi.xml.findChildTagElementByNameAttr
+import com.android.tools.idea.nav.safeargs.psi.xml.findXmlTagById
+import com.android.tools.idea.nav.safeargs.safeArgsMode
+import com.android.tools.idea.testing.caret
+import com.google.common.truth.Truth.assertThat
+import com.intellij.openapi.command.WriteCommandAction
+import com.intellij.testFramework.RunsInEdt
+import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol
+import org.jetbrains.kotlin.analysis.api.symbols.KtNamedClassOrObjectSymbol
+import org.jetbrains.kotlin.analysis.api.symbols.KtParameterSymbol
+import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySymbol
+import org.jetbrains.kotlin.analysis.api.symbols.psi
+import org.jetbrains.kotlin.analysis.api.types.KtErrorType
+import org.jetbrains.kotlin.idea.base.plugin.KotlinPluginKind
+import org.jetbrains.kotlin.idea.base.plugin.checkKotlinPluginKind
+import org.jetbrains.kotlin.psi.KtElement
+import org.jetbrains.kotlin.types.Variance
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+@RunWith(Parameterized::class)
+@RunsInEdt
+class ArgsClassResolveExtensionTest(
+  @Suppress("UNUSED_PARAMETER") navVersionName: String,
+  private val navVersion: Version,
+) : AbstractSafeArgsResolveExtensionTest() {
+  companion object {
+    @JvmStatic
+    @Parameterized.Parameters(name = "{0} ({1})")
+    fun parameters(): Collection<Array<Any>> =
+      KNOWN_SAFE_ARGS_VERSIONS.map { (name, version) -> arrayOf(name, version) }
+  }
+
+  @Before
+  fun setUp() {
+    checkKotlinPluginKind(KotlinPluginKind.FIR_PLUGIN)
+    if (navVersion > SafeArgsFeatureVersions.MINIMUM_VERSION) {
+      safeArgsRule.addFakeNavigationDependency(navVersion)
+    }
+    NavigationResourcesModificationListener.ensureSubscribed(safeArgsRule.project)
+  }
+
+  @Test
+  fun createsFragmentArgsClassWithConverters() {
+    addNavXml(
+      """
+      <?xml version="1.0" encoding="utf-8"?>
+      <navigation xmlns:android="http://schemas.android.com/apk/res/android"
+          xmlns:app="http://schemas.android.com/apk/res-auto"
+          android:id="@+id/main"
+          app:startDestination="@id/fragment1">
+        <fragment
+            android:id="@+id/fragment1"
+            android:name="test.safeargs.Fragment1"
+            android:label="Fragment1">
+          <argument
+              android:name="some_argument"
+              app:argType="string"/>
+        </fragment>
+      </navigation>
+    """
+        .trimIndent()
+    )
+
+    analyzeFileContent(
+      """
+      package test.safeargs
+
+      val x: ${caret}Fragment1Args = TODO()
+      """
+        .trimIndent()
+    ) { symbol: KtNamedClassOrObjectSymbol ->
+      assertThat(symbol.psi<KtElement>().isFromResolveExtension).isTrue()
+      assertThat(symbol.classIdIfNonLocal?.asFqNameString())
+        .isEqualTo("test.safeargs.Fragment1Args")
+      assertThat(symbol.render(RENDERER))
+        .isEqualTo(
+          "data class Fragment1Args(someArgument: kotlin.String) : androidx.navigation.NavArgs"
+        )
+
+      assertThat(getRenderedMemberFunctions(symbol, RENDERER))
+        .containsExactlyElementsIn(
+          listOfNotNull(
+            "fun toBundle(): android.os.Bundle",
+            "fun toSavedStateHandle(): androidx.lifecycle.SavedStateHandle"
+              .takeIf { navVersion >= SafeArgsFeatureVersions.TO_SAVED_STATE_HANDLE },
+          )
+        )
+
+      assertThat(getRenderedMemberFunctions(symbol.companionObject!!, RENDERER))
+        .containsExactlyElementsIn(
+          listOfNotNull(
+            """
+            @kotlin.jvm.JvmStatic
+            fun fromBundle(bundle: android.os.Bundle): test.safeargs.Fragment1Args
+          """
+              .trimIndent(),
+            """
+            @kotlin.jvm.JvmStatic
+            fun fromSavedStateHandle(handle: androidx.lifecycle.SavedStateHandle): test.safeargs.Fragment1Args
+          """
+              .trimIndent()
+              .takeIf { navVersion >= SafeArgsFeatureVersions.FROM_SAVED_STATE_HANDLE },
+          )
+        )
+    }
+  }
+
+  @Test
+  fun handlesModification() {
+    val xmlFile =
+      addNavXml(
+        """
+      <?xml version="1.0" encoding="utf-8"?>
+      <navigation xmlns:android="http://schemas.android.com/apk/res/android"
+          xmlns:app="http://schemas.android.com/apk/res-auto"
+          android:id="@+id/main"
+          app:startDestination="@id/fragment1">
+        <fragment
+            android:id="@+id/fragment1"
+            android:name="test.safeargs.Fragment1"
+            android:label="Fragment1">
+          <argument
+              android:name="some_argument"
+              app:argType="string"/>
+        </fragment>
+      </navigation>
+    """
+          .trimIndent()
+      )
+
+    analyzeFileContent(
+      """
+        package test.safeargs
+        val x: Fragment1Args = TODO()
+        val y = x.${caret}someArgument
+      """
+        .trimIndent()
+    ) { symbol: KtPropertySymbol ->
+      assertThat(symbol.returnType.isString).isTrue()
+    }
+
+    val project = safeArgsRule.project
+    WriteCommandAction.runWriteCommandAction(project) {
+      xmlFile.virtualFile.replaceWithoutSaving("some_argument", "some_other_argument", project)
+    }
+
+    analyzeFileContent(
+      """
+        package test.safeargs
+        val x: Fragment1Args = TODO()
+        val y = x.${caret}someOtherArgument
+      """
+        .trimIndent()
+    ) { symbol: KtPropertySymbol ->
+      assertThat(symbol.returnType.isString).isTrue()
+    }
+  }
+
+  @Test
+  fun handlesModeChange() {
+    val xmlFile =
+      addNavXml(
+        """
+      <?xml version="1.0" encoding="utf-8"?>
+      <navigation xmlns:android="http://schemas.android.com/apk/res/android"
+          xmlns:app="http://schemas.android.com/apk/res-auto"
+          android:id="@+id/main"
+          app:startDestination="@id/fragment1">
+        <fragment
+            android:id="@+id/fragment1"
+            android:name="test.safeargs.Fragment1"
+            android:label="Fragment1">
+          <argument
+              android:name="some_argument"
+              app:argType="string"/>
+        </fragment>
+      </navigation>
+    """
+          .trimIndent()
+      )
+
+    analyzeFileContent(
+      """
+        package test.safeargs
+        val x: Fragment1Args = TODO()
+        val y = ${caret}x
+      """
+        .trimIndent()
+    ) { symbol: KtPropertySymbol ->
+      assertThat(symbol.returnType).isNotInstanceOf(KtErrorType::class.java)
+    }
+
+    safeArgsRule.androidFacet.safeArgsMode = SafeArgsMode.NONE
+
+    analyzeFileContent(
+      """
+        package test.safeargs
+        val x: Fragment1Args = TODO()
+        val y = ${caret}x
+      """
+        .trimIndent()
+    ) { symbol: KtPropertySymbol ->
+      assertThat(symbol.returnType).isInstanceOf(KtErrorType::class.java)
+    }
+
+    // This change should be picked up when the mode changes back.
+    WriteCommandAction.runWriteCommandAction(safeArgsRule.project) {
+      xmlFile.virtualFile.replaceWithoutSaving(
+        "some_argument",
+        "some_other_argument",
+        safeArgsRule.project,
+      )
+    }
+    safeArgsRule.androidFacet.safeArgsMode = SafeArgsMode.KOTLIN
+
+    analyzeFileContent(
+      """
+        package test.safeargs
+        val x: Fragment1Args = TODO()
+        val y = x.${caret}someOtherArgument
+      """
+        .trimIndent()
+    ) { symbol: KtPropertySymbol ->
+      assertThat(symbol.returnType.isString).isTrue()
+    }
+  }
+
+  @Test
+  fun mapsScalarArgumentTypes() {
+    addKotlinSource(
+      """
+        package other
+
+        enum class ArgEnum { FOO, BAR }
+      """
+        .trimIndent(),
+      fileName = "otherPackage.kt",
+    )
+    addNavXml(
+      """
+      <?xml version="1.0" encoding="utf-8"?>
+      <navigation xmlns:android="http://schemas.android.com/apk/res/android"
+          xmlns:app="http://schemas.android.com/apk/res-auto"
+          android:id="@+id/main"
+          app:startDestination="@id/fragment1">
+        <fragment
+            android:id="@+id/fragment1"
+            android:name="test.safeargs.Fragment1"
+            android:label="Fragment1">
+          <argument
+              android:name="string_arg"
+              app:argType="string"/>
+          <argument
+              android:name="int_arg"
+              app:argType="integer"/>
+          <argument
+              android:name="reference_arg"
+              app:argType="reference"/>
+          <argument
+              android:name="long_arg"
+              app:argType="long"/>
+          <argument
+              android:name="float_arg"
+              app:argType="float"/>
+          <argument
+              android:name="boolean_arg"
+              app:argType="boolean"/>
+          <argument
+              android:name="in_package_enum_arg"
+              app:argType=".ArgEnum"/>
+          <argument
+              android:name="out_of_package_enum_arg"
+              app:argType="other.ArgEnum"/>
+        </fragment>
+      </navigation>
+    """
+        .trimIndent()
+    )
+
+    analyzeFileContent(
+      """
+      package test.safeargs
+
+      val x: ${caret}Fragment1Args = TODO()
+    """
+        .trimIndent()
+    ) { symbol: KtNamedClassOrObjectSymbol ->
+      assertThat(symbol.classIdIfNonLocal?.asFqNameString())
+        .isEqualTo("test.safeargs.Fragment1Args")
+      assertThat(symbol.psi<KtElement>().isFromResolveExtension).isTrue()
+
+      val paramsToTypeNames =
+        getPrimaryConstructorSymbol(symbol).valueParameters.associate {
+          val paramName = it.name.asString()
+          val typeName = it.returnType.render(position = Variance.INVARIANT)
+          paramName to typeName
+        }
+
+      assertThat(paramsToTypeNames)
+        .containsExactlyEntriesIn(
+          mapOf(
+            "stringArg" to "kotlin.String",
+            "intArg" to "kotlin.Int",
+            "referenceArg" to "kotlin.Int",
+            "longArg" to "kotlin.Long",
+            "floatArg" to "kotlin.Float",
+            "booleanArg" to "kotlin.Boolean",
+            "inPackageEnumArg" to "test.safeargs.ArgEnum",
+            "outOfPackageEnumArg" to "other.ArgEnum",
+          )
+        )
+    }
+  }
+
+  @Test
+  fun mapsArrayArgumentTypes() {
+    addKotlinSource(
+      """
+        package other
+
+        enum class ArgEnum { FOO, BAR }
+      """
+        .trimIndent(),
+      fileName = "otherPackage.kt",
+    )
+    addNavXml(
+      """
+      <?xml version="1.0" encoding="utf-8"?>
+      <navigation xmlns:android="http://schemas.android.com/apk/res/android"
+          xmlns:app="http://schemas.android.com/apk/res-auto"
+          android:id="@+id/main"
+          app:startDestination="@id/fragment1">
+        <fragment
+            android:id="@+id/fragment1"
+            android:name="test.safeargs.Fragment1"
+            android:label="Fragment1">
+          <argument
+              android:name="string_array"
+              app:argType="string[]"/>
+          <argument
+              android:name="int_array"
+              app:argType="integer[]"/>
+          <argument
+              android:name="reference_array"
+              app:argType="reference[]"/>
+          <argument
+              android:name="long_array"
+              app:argType="long[]"/>
+          <argument
+              android:name="float_array"
+              app:argType="float[]"/>
+          <argument
+              android:name="boolean_array"
+              app:argType="boolean[]"/>
+          <argument
+              android:name="in_package_enum_array"
+              app:argType=".ArgEnum[]"/>
+          <argument
+              android:name="out_of_package_enum_array"
+              app:argType="other.ArgEnum[]"/>
+        </fragment>
+      </navigation>
+    """
+        .trimIndent()
+    )
+
+    analyzeFileContent(
+      """
+      package test.safeargs
+
+      val x: ${caret}Fragment1Args = TODO()
+    """
+        .trimIndent()
+    ) { symbol: KtNamedClassOrObjectSymbol ->
+      assertThat(symbol.classIdIfNonLocal?.asFqNameString())
+        .isEqualTo("test.safeargs.Fragment1Args")
+      assertThat(symbol.psi<KtElement>().isFromResolveExtension).isTrue()
+
+      val paramsToTypeNames =
+        getPrimaryConstructorSymbol(symbol).valueParameters.associate {
+          val paramName = it.name.asString()
+          val typeName = it.returnType.render(RENDERER.typeRenderer, position = Variance.INVARIANT)
+          paramName to typeName
+        }
+
+      assertThat(paramsToTypeNames)
+        .containsExactlyEntriesIn(
+          mapOf(
+            "stringArray" to "kotlin.Array<kotlin.String>",
+            "intArray" to "kotlin.IntArray",
+            "referenceArray" to "kotlin.IntArray",
+            "longArray" to "kotlin.LongArray",
+            "floatArray" to "kotlin.FloatArray",
+            "booleanArray" to "kotlin.BooleanArray",
+            "inPackageEnumArray" to "kotlin.Array<test.safeargs.ArgEnum>",
+            "outOfPackageEnumArray" to "kotlin.Array<other.ArgEnum>",
+          )
+        )
+    }
+  }
+
+  @Test
+  fun handlesNullables() {
+    addNavXml(
+      """
+      <?xml version="1.0" encoding="utf-8"?>
+      <navigation xmlns:android="http://schemas.android.com/apk/res/android"
+          xmlns:app="http://schemas.android.com/apk/res-auto"
+          android:id="@+id/main"
+          app:startDestination="@id/fragment1">
+        <fragment
+            android:id="@+id/fragment1"
+            android:name="test.safeargs.Fragment1"
+            android:label="Fragment1">
+          <argument
+              android:name="nullable"
+              app:argType="string"
+              app:nullable="true"/>
+          <argument
+              android:name="implicit_nullable"
+              app:argType="string"
+              android:defaultValue="@null"/>
+        </fragment>
+      </navigation>
+    """
+        .trimIndent()
+    )
+
+    analyzeFileContent(
+      """
+      package test.safeargs
+
+      val x: ${caret}Fragment1Args = TODO()
+      """
+        .trimIndent()
+    ) { symbol: KtNamedClassOrObjectSymbol ->
+      assertThat(symbol.render(RENDERER))
+        .isEqualTo(
+          "data class Fragment1Args(nullable: kotlin.String?, implicitNullable: kotlin.String? = ...) : androidx.navigation.NavArgs"
+        )
+    }
+  }
+
+  @Test
+  fun handlesDefaultValues() {
+    addNavXml(
+      """
+      <?xml version="1.0" encoding="utf-8"?>
+      <navigation xmlns:android="http://schemas.android.com/apk/res/android"
+          xmlns:app="http://schemas.android.com/apk/res-auto"
+          android:id="@+id/main"
+          app:startDestination="@id/fragment1">
+        <fragment
+            android:id="@+id/fragment1"
+            android:name="test.safeargs.Fragment1"
+            android:label="Fragment1">
+          <argument
+              android:name="arg1"
+              app:argType="integer"/>
+          <argument
+              android:name="arg2"
+              app:argType="string"
+              android:defaultValue="foo"/>
+          <argument
+              android:name="arg3"
+              app:argType="reference"/>
+        </fragment>
+      </navigation>
+    """
+        .trimIndent()
+    )
+
+    analyzeFileContent(
+      """
+      package test.safeargs
+
+      val x: ${caret}Fragment1Args = TODO()
+      """
+        .trimIndent()
+    ) { symbol: KtNamedClassOrObjectSymbol ->
+      val renderedValueParameters =
+        getPrimaryConstructorSymbol(symbol).valueParameters.map { it.render(RENDERER) }
+
+      val expectedOrder =
+        if (navVersion >= SafeArgsFeatureVersions.ADJUST_PARAMS_WITH_DEFAULTS) {
+          listOf("arg1: kotlin.Int", "arg3: kotlin.Int", "arg2: kotlin.String = ...")
+        } else {
+          listOf("arg1: kotlin.Int", "arg2: kotlin.String = ...", "arg3: kotlin.Int")
+        }
+
+      assertThat(renderedValueParameters).containsExactlyElementsIn(expectedOrder).inOrder()
+    }
+  }
+
+  @Test
+  fun navigationElements() {
+    val xmlFile =
+      addNavXml(
+        """
+      <?xml version="1.0" encoding="utf-8"?>
+      <navigation xmlns:android="http://schemas.android.com/apk/res/android"
+          xmlns:app="http://schemas.android.com/apk/res-auto"
+          android:id="@+id/main"
+          app:startDestination="@id/fragment1">
+        <fragment
+            android:id="@+id/fragment1"
+            android:name="test.safeargs.Fragment1"
+            android:label="Fragment1">
+          <argument
+              android:name="arg1"
+              app:argType="integer"/>
+        </fragment>
+      </navigation>
+    """
+          .trimIndent()
+      )
+    val fragmentTag = xmlFile.findXmlTagById("fragment1")!!
+    assertThat(fragmentTag.localName).isEqualTo("fragment")
+    val argumentTag = fragmentTag.findChildTagElementByNameAttr("argument", "arg1")!!
+
+    analyzeFileContent(
+      """
+      package test.safeargs
+
+      val x: ${caret}Fragment1Args = TODO()
+      """
+        .trimIndent()
+    ) { symbol: KtNamedClassOrObjectSymbol ->
+      assertThat(getResolveExtensionPsiNavigationTargets(symbol)).containsExactly(fragmentTag)
+    }
+
+    analyzeFileContent(
+      """
+      package test.safeargs
+
+      val x = Fragment1Args(${caret}arg1 = 42)
+      """
+        .trimIndent()
+    ) { symbol: KtParameterSymbol ->
+      assertThat(getResolveExtensionPsiNavigationTargets(symbol)).containsExactly(argumentTag)
+    }
+
+    analyzeFileContent(
+      """
+      package test.safeargs
+
+      val x: Fragment1Args = TODO()
+      val y = x.${caret}arg1
+      """
+        .trimIndent()
+    ) { symbol: KtPropertySymbol ->
+      assertThat(getResolveExtensionPsiNavigationTargets(symbol)).containsExactly(argumentTag)
+    }
+
+    analyzeFileContent(
+      """
+      package test.safeargs
+
+      val x = Fragment1Args.fromBundle(${caret}bundle = TODO())
+      """
+        .trimIndent()
+    ) { symbol: KtParameterSymbol ->
+      assertThat(getResolveExtensionPsiNavigationTargets(symbol)).containsExactly(fragmentTag)
+    }
+
+    analyzeFileContent(
+      """
+      package test.safeargs
+
+      val x: Fragment1Args = TODO()
+      val y = x.${caret}toBundle()
+      """
+        .trimIndent()
+    ) { symbol: KtFunctionSymbol ->
+      assertThat(getResolveExtensionPsiNavigationTargets(symbol)).containsExactly(fragmentTag)
+    }
+  }
+}
diff --git a/nav/safeargs/tests/k2/src/com/android/tools/idea/nav/safeargs/kotlin/k2/DirectionsClassResolveExtensionTest.kt b/nav/safeargs/tests/k2/src/com/android/tools/idea/nav/safeargs/kotlin/k2/DirectionsClassResolveExtensionTest.kt
new file mode 100644
index 0000000..657473c
--- /dev/null
+++ b/nav/safeargs/tests/k2/src/com/android/tools/idea/nav/safeargs/kotlin/k2/DirectionsClassResolveExtensionTest.kt
@@ -0,0 +1,631 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.tools.idea.nav.safeargs.kotlin.k2
+
+import com.android.ide.common.gradle.Version
+import com.android.tools.idea.nav.safeargs.SafeArgsMode
+import com.android.tools.idea.nav.safeargs.extensions.replaceWithoutSaving
+import com.android.tools.idea.nav.safeargs.project.NavigationResourcesModificationListener
+import com.android.tools.idea.nav.safeargs.psi.SafeArgsFeatureVersions
+import com.android.tools.idea.nav.safeargs.psi.xml.findChildTagElementById
+import com.android.tools.idea.nav.safeargs.psi.xml.findChildTagElementByNameAttr
+import com.android.tools.idea.nav.safeargs.psi.xml.findXmlTagById
+import com.android.tools.idea.nav.safeargs.safeArgsMode
+import com.android.tools.idea.testing.caret
+import com.google.common.truth.Truth.assertThat
+import com.intellij.openapi.command.WriteCommandAction
+import com.intellij.psi.PsiElement
+import com.intellij.testFramework.RunsInEdt
+import org.intellij.lang.annotations.Language
+import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol
+import org.jetbrains.kotlin.analysis.api.symbols.KtNamedClassOrObjectSymbol
+import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySymbol
+import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
+import org.jetbrains.kotlin.analysis.api.symbols.psi
+import org.jetbrains.kotlin.analysis.api.types.KtErrorType
+import org.jetbrains.kotlin.descriptors.Visibilities
+import org.jetbrains.kotlin.idea.base.plugin.KotlinPluginKind
+import org.jetbrains.kotlin.idea.base.plugin.checkKotlinPluginKind
+import org.jetbrains.kotlin.psi.KtElement
+import org.junit.Before
+import org.junit.Ignore
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+@RunWith(Parameterized::class)
+@RunsInEdt
+class DirectionsClassResolveExtensionTest(
+  @Suppress("UNUSED_PARAMETER") navVersionName: String,
+  private val navVersion: Version,
+) : AbstractSafeArgsResolveExtensionTest() {
+  companion object {
+    @JvmStatic
+    @Parameterized.Parameters(name = "{0} ({1})")
+    fun parameters(): Collection<Array<Any>> =
+      KNOWN_SAFE_ARGS_VERSIONS.map { (name, version) -> arrayOf(name, version) }
+  }
+
+  @Before
+  fun setUp() {
+    checkKotlinPluginKind(KotlinPluginKind.FIR_PLUGIN)
+    if (navVersion > SafeArgsFeatureVersions.MINIMUM_VERSION) {
+      safeArgsRule.addFakeNavigationDependency(navVersion)
+    }
+    NavigationResourcesModificationListener.ensureSubscribed(safeArgsRule.project)
+  }
+
+  @Test
+  fun createsFunctionsForDestinations() {
+    addNavXml(
+      """
+        <?xml version="1.0" encoding="utf-8"?>
+        <navigation
+            xmlns:android="http://schemas.android.com/apk/res/android"
+            xmlns:app="http://schemas.android.com/apk/res-auto"
+            android:id="@+id/main"
+            app:startDestination="@id/fragment1">
+          <action
+              android:id="@+id/action_inherited"/>
+          <fragment
+              android:id="@+id/fragment1"
+              android:name=".Fragment1"
+              android:label="Fragment1">
+            <action
+                android:id="@+id/action_fragment1_to_fragment2"
+                app:destination="@+id/fragment2"/>
+            <action
+                android:id="@+id/action_fragment1_to_main"
+                app:popUpTo="@+id/main"/>
+          </fragment>
+          <fragment
+              android:id="@+id/fragment2">
+          </fragment>
+        </navigation>
+      """
+        .trimIndent()
+    )
+
+    analyzeFileContent(
+      """
+        package test.safeargs
+
+        val x: ${caret}Fragment1Directions = TODO()
+      """
+        .trimIndent()
+    ) { symbol: KtNamedClassOrObjectSymbol ->
+      assertThat(symbol.psi<KtElement>().isFromResolveExtension).isTrue()
+      assertThat(symbol.classIdIfNonLocal?.asFqNameString())
+        .isEqualTo("test.safeargs.Fragment1Directions")
+      assertThat(getPrimaryConstructorSymbol(symbol).visibility).isEqualTo(Visibilities.Private)
+      assertThat(getRenderedMemberFunctions(symbol, RENDERER)).isEmpty()
+      assertThat(getRenderedMemberFunctions(symbol.companionObject!!, RENDERER))
+        .containsExactly(
+          "fun actionFragment1ToFragment2(): androidx.navigation.NavDirections",
+          "fun actionFragment1ToMain(): androidx.navigation.NavDirections",
+          "fun actionInherited(): androidx.navigation.NavDirections",
+        )
+    }
+  }
+
+  @Test
+  fun handlesModifications() {
+    val xmlFile =
+      addNavXml(
+        """
+        <?xml version="1.0" encoding="utf-8"?>
+        <navigation
+            xmlns:android="http://schemas.android.com/apk/res/android"
+            xmlns:app="http://schemas.android.com/apk/res-auto"
+            android:id="@+id/main"
+            app:startDestination="@id/fragment1">
+          <action
+              android:id="@+id/action_inherited"/>
+          <fragment
+              android:id="@+id/fragment1"
+              android:name=".Fragment1"
+              android:label="Fragment1">
+            <action
+                android:id="@+id/action_fragment1_to_fragment2"
+                app:destination="@+id/fragment2"/>
+            <action
+                android:id="@+id/action_fragment1_to_main"
+                app:popUpTo="@+id/main"/>
+          </fragment>
+          <fragment
+              android:id="@+id/fragment2">
+          </fragment>
+        </navigation>
+      """
+          .trimIndent()
+      )
+
+    analyzeFileContent(
+      """
+        package test.safeargs
+
+        val x = Fragment1Directions::${caret}actionFragment1ToFragment2
+      """
+        .trimIndent()
+    ) { symbol: KtFunctionSymbol ->
+      assertThat(symbol.valueParameters).isEmpty()
+    }
+
+    WriteCommandAction.runWriteCommandAction(safeArgsRule.project) {
+      xmlFile.virtualFile.replaceWithoutSaving(
+        "@+id/action_fragment1_to_fragment2",
+        "@+id/some_other_action",
+        safeArgsRule.project,
+      )
+    }
+
+    analyzeFileContent(
+      """
+        package test.safeargs
+
+        val x = Fragment1Directions::${caret}someOtherAction
+      """
+        .trimIndent()
+    ) { symbol: KtFunctionSymbol ->
+      assertThat(symbol.valueParameters).isEmpty()
+    }
+  }
+
+  @Test
+  @Ignore("b/269235670")
+  fun handlesModeChange() {
+    val xmlFile =
+      addNavXml(
+        """
+        <?xml version="1.0" encoding="utf-8"?>
+        <navigation
+            xmlns:android="http://schemas.android.com/apk/res/android"
+            xmlns:app="http://schemas.android.com/apk/res-auto"
+            android:id="@+id/main"
+            app:startDestination="@id/fragment1">
+          <action
+              android:id="@+id/action_inherited"/>
+          <fragment
+              android:id="@+id/fragment1"
+              android:name=".Fragment1"
+              android:label="Fragment1">
+            <action
+                android:id="@+id/action_fragment1_to_fragment2"
+                app:destination="@+id/fragment2"/>
+            <action
+                android:id="@+id/action_fragment1_to_main"
+                app:popUpTo="@+id/main"/>
+          </fragment>
+          <fragment
+              android:id="@+id/fragment2">
+          </fragment>
+        </navigation>
+      """
+          .trimIndent()
+      )
+
+    analyzeFileContent(
+      """
+        package test.safeargs
+
+        val x: Fragment1Directions = TODO()
+        val y = ${caret}x
+      """
+        .trimIndent()
+    ) { symbol: KtPropertySymbol ->
+      assertThat(symbol.returnType).isNotInstanceOf(KtErrorType::class.java)
+    }
+
+    safeArgsRule.androidFacet.safeArgsMode = SafeArgsMode.NONE
+
+    analyzeFileContent(
+      """
+        package test.safeargs
+
+        val x: Fragment1Directions = TODO()
+        val y = ${caret}x
+      """
+        .trimIndent()
+    ) { symbol: KtPropertySymbol ->
+      assertThat(symbol.returnType).isInstanceOf(KtErrorType::class.java)
+    }
+
+    // Change should be picked up after we change modes again.
+    WriteCommandAction.runWriteCommandAction(safeArgsRule.project) {
+      xmlFile.virtualFile.replaceWithoutSaving(
+        "@+id/action_fragment1_to_fragment2",
+        "@+id/some_other_action",
+        safeArgsRule.project,
+      )
+    }
+    safeArgsRule.androidFacet.safeArgsMode = SafeArgsMode.KOTLIN
+
+    analyzeFileContent(
+      """
+        package test.safeargs
+
+        val x = Fragment1Directions::${caret}someOtherAction
+      """
+        .trimIndent()
+    ) { symbol: KtFunctionSymbol ->
+      assertThat(symbol.valueParameters).isEmpty()
+    }
+  }
+
+  @Test
+  fun mapsArguments() {
+    addKotlinSource(
+      """
+        package other
+
+        enum class ArgEnum { FOO, BAR }
+      """
+        .trimIndent()
+    )
+    addNavXml(
+      """
+        <?xml version="1.0" encoding="utf-8"?>
+        <navigation
+            xmlns:android="http://schemas.android.com/apk/res/android"
+            xmlns:app="http://schemas.android.com/apk/res-auto"
+            android:id="@+id/main"
+            app:startDestination="@id/fragment1">
+          <fragment
+              android:id="@+id/fragment1"
+              android:name=".Fragment1"
+              android:label="Fragment1">
+            <action
+                android:id="@+id/action_scalar"
+                app:destination="@+id/fragment2">
+              <argument
+                  android:name="string_arg"
+                  app:argType="string"/>
+              <argument
+                  android:name="int_arg"
+                  app:argType="integer"/>
+              <argument
+                  android:name="reference_arg"
+                  app:argType="reference"/>
+              <argument
+                  android:name="long_arg"
+                  app:argType="long"/>
+              <argument
+                  android:name="float_arg"
+                  app:argType="float"/>
+              <argument
+                  android:name="boolean_arg"
+                  app:argType="boolean"/>
+              <argument
+                  android:name="in_package_enum_arg"
+                  app:argType=".ArgEnum"/>
+              <argument
+                  android:name="out_of_package_enum_arg"
+                  app:argType="other.ArgEnum"/>
+            </action>
+            <action
+                android:id="@+id/action_array"
+                app:destination="@+id/fragment2">
+              <argument
+                  android:name="string_array"
+                  app:argType="string[]"/>
+              <argument
+                  android:name="int_array"
+                  app:argType="integer[]"/>
+              <argument
+                  android:name="reference_array"
+                  app:argType="reference[]"/>
+              <argument
+                  android:name="long_array"
+                  app:argType="long[]"/>
+              <argument
+                  android:name="float_array"
+                  app:argType="float[]"/>
+              <argument
+                  android:name="boolean_array"
+                  app:argType="boolean[]"/>
+              <argument
+                  android:name="in_package_enum_array"
+                  app:argType=".ArgEnum[]"/>
+              <argument
+                  android:name="out_of_package_enum_array"
+                  app:argType="other.ArgEnum[]"/>
+            </action>
+          </fragment>
+          <fragment
+              android:id="@+id/fragment2">
+          </fragment>
+        </navigation>
+      """
+        .trimIndent()
+    )
+
+    analyzeFileContent(
+      """
+        package test.safeargs
+
+        enum class ArgEnum { BAZ, QUUX }
+
+        val x: ${caret}Fragment1Directions = TODO()
+      """
+        .trimIndent()
+    ) { symbol: KtNamedClassOrObjectSymbol ->
+      assertThat(getRenderedMemberFunctions(symbol.companionObject!!, RENDERER))
+        .containsExactly(
+          "fun actionScalar(" +
+            "stringArg: kotlin.String, " +
+            "intArg: kotlin.Int, " +
+            "referenceArg: kotlin.Int, " +
+            "longArg: kotlin.Long, " +
+            "floatArg: kotlin.Float, " +
+            "booleanArg: kotlin.Boolean, " +
+            "inPackageEnumArg: test.safeargs.ArgEnum, " +
+            "outOfPackageEnumArg: other.ArgEnum" +
+            "): androidx.navigation.NavDirections",
+          "fun actionArray(" +
+            "stringArray: kotlin.Array<kotlin.String>, " +
+            "intArray: kotlin.IntArray, " +
+            "referenceArray: kotlin.IntArray, " +
+            "longArray: kotlin.LongArray, " +
+            "floatArray: kotlin.FloatArray, " +
+            "booleanArray: kotlin.BooleanArray, " +
+            "inPackageEnumArray: kotlin.Array<test.safeargs.ArgEnum>, " +
+            "outOfPackageEnumArray: kotlin.Array<other.ArgEnum>" +
+            "): androidx.navigation.NavDirections",
+        )
+    }
+  }
+
+  @Test
+  fun combinesArgumentsFromActionAndDestination() {
+    addNavXml(
+      """
+        <?xml version="1.0" encoding="utf-8"?>
+        <navigation
+            xmlns:android="http://schemas.android.com/apk/res/android"
+            xmlns:app="http://schemas.android.com/apk/res-auto"
+            android:id="@+id/main"
+            app:startDestination="@id/fragment1">
+          <fragment
+              android:id="@+id/fragment1"
+              android:name=".Fragment1"
+              android:label="Fragment1">
+            <action
+                android:id="@+id/action_fragment1_to_fragment2"
+                app:destination="@+id/fragment2">
+              <argument
+                  android:name="argument_from_action"
+                  app:argType="integer"/>
+            </action>
+          </fragment>
+          <fragment
+              android:id="@+id/fragment2"
+              android:name=".Fragment2"
+              android:label="Fragment2">
+            <argument
+                android:name="argument_from_destination"
+                app:argType="integer"/>
+          </fragment>
+        </navigation>
+      """
+        .trimIndent()
+    )
+
+    analyzeFileContent(
+      """
+        package test.safeargs
+
+        val x = Fragment1Directions::${caret}actionFragment1ToFragment2
+      """
+        .trimIndent()
+    ) { symbol: KtFunctionSymbol ->
+      assertThat(symbol.render(RENDERER))
+        .isEqualTo(
+          "fun actionFragment1ToFragment2(" +
+            "argumentFromAction: kotlin.Int, " +
+            "argumentFromDestination: kotlin.Int" +
+            "): androidx.navigation.NavDirections"
+        )
+    }
+  }
+
+  @Test
+  fun overridesDefaultArgumentsFromDestinationWithAction() {
+    addNavXml(
+      """
+        <?xml version="1.0" encoding="utf-8"?>
+        <navigation
+            xmlns:android="http://schemas.android.com/apk/res/android"
+            xmlns:app="http://schemas.android.com/apk/res-auto"
+            android:id="@+id/main"
+            app:startDestination="@id/fragment1">
+          <fragment
+              android:id="@+id/fragment1"
+              android:name=".Fragment1"
+              android:label="Fragment1">
+            <action
+                android:id="@+id/action_fragment1_to_fragment2"
+                app:destination="@+id/fragment2">
+              <argument
+                  android:name="argument"
+                  app:argType="integer"
+                  android:defaultValue="42"/>
+            </action>
+          </fragment>
+          <fragment
+              android:id="@+id/fragment2"
+              android:name=".Fragment2"
+              android:label="Fragment2">
+            <argument
+                android:name="argument"
+                app:argType="integer"/>
+          </fragment>
+        </navigation>
+      """
+        .trimIndent()
+    )
+
+    analyzeFileContent(
+      """
+        package test.safeargs
+
+        val x = Fragment1Directions::${caret}actionFragment1ToFragment2
+      """
+        .trimIndent()
+    ) { symbol: KtFunctionSymbol ->
+      assertThat(symbol.render(RENDERER))
+        .isEqualTo(
+          "fun actionFragment1ToFragment2(argument: kotlin.Int = ...): androidx.navigation.NavDirections"
+        )
+    }
+  }
+
+  @Test
+  fun adjustsDefaultArgumentOrder() {
+    addNavXml(
+      """
+        <?xml version="1.0" encoding="utf-8"?>
+        <navigation
+            xmlns:android="http://schemas.android.com/apk/res/android"
+            xmlns:app="http://schemas.android.com/apk/res-auto"
+            android:id="@+id/main"
+            app:startDestination="@id/fragment1">
+          <fragment
+              android:id="@+id/fragment1"
+              android:name=".Fragment1"
+              android:label="Fragment1">
+            <action
+                android:id="@+id/action_fragment1_to_fragment2"
+                app:destination="@+id/fragment2">
+              <argument
+                  android:name="argument_before"
+                  app:argType="integer"/>
+              <argument
+                  android:name="argument_with_default"
+                  app:argType="integer"
+                  android:defaultValue="42"/>
+              <argument
+                  android:name="argument_after"
+                  app:argType="integer"/>
+            </action>
+          </fragment>
+          <fragment
+              android:id="@+id/fragment2"
+              android:name=".Fragment2"
+              android:label="Fragment2">
+          </fragment>
+        </navigation>
+      """
+        .trimIndent()
+    )
+
+    analyzeFileContent(
+      """
+        package test.safeargs
+
+        val x = Fragment1Directions::${caret}actionFragment1ToFragment2
+      """
+        .trimIndent()
+    ) { symbol: KtFunctionSymbol ->
+      val argumentBody =
+        if (navVersion >= SafeArgsFeatureVersions.ADJUST_PARAMS_WITH_DEFAULTS) {
+          "argumentBefore: kotlin.Int, argumentAfter: kotlin.Int, argumentWithDefault: kotlin.Int = ..."
+        } else {
+          "argumentBefore: kotlin.Int, argumentWithDefault: kotlin.Int = ..., argumentAfter: kotlin.Int"
+        }
+      assertThat(symbol.render(RENDERER))
+        .isEqualTo(
+          "fun actionFragment1ToFragment2($argumentBody): androidx.navigation.NavDirections"
+        )
+    }
+  }
+
+  @Test
+  fun navigationElements() {
+    val xmlFile =
+      addNavXml(
+        """
+        <?xml version="1.0" encoding="utf-8"?>
+        <navigation
+            xmlns:android="http://schemas.android.com/apk/res/android"
+            xmlns:app="http://schemas.android.com/apk/res-auto"
+            android:id="@+id/main"
+            app:startDestination="@id/fragment1">
+          <fragment
+              android:id="@+id/fragment1"
+              android:name=".Fragment1"
+              android:label="Fragment1">
+            <action
+                android:id="@+id/some_action"
+                app:destination="@+id/fragment2">
+              <argument
+                  android:name="overridden"
+                  app:argType="integer"
+                  android:defaultValue="42"/>
+              <argument
+                  android:name="from_action"
+                  app:argType="integer"
+                  android:defaultValue="@null"/>
+            </action>
+          </fragment>
+          <fragment
+              android:id="@+id/fragment2"
+              android:name=".Fragment2"
+              android:label="Fragment2">
+            <argument
+                android:name="overridden"
+                app:argType="integer"/>
+            <argument
+                android:name="from_destination"
+                app:argType="integer"
+                android:defaultValue="@null"/>
+          </fragment>
+        </navigation>
+      """
+          .trimIndent()
+      )
+
+    val fragment1Tag = xmlFile.findXmlTagById("fragment1")!!
+    val actionTag = fragment1Tag.findChildTagElementById("action", "some_action")!!
+    val argOverriddenInActionTag =
+      actionTag.findChildTagElementByNameAttr("argument", "overridden")!!
+    val argFromActionTag = actionTag.findChildTagElementByNameAttr("argument", "from_action")!!
+    val fragment2Tag = xmlFile.findXmlTagById("fragment2")!!
+    val argFromDestinationTag =
+      fragment2Tag.findChildTagElementByNameAttr("argument", "from_destination")!!
+
+    "val x: ${caret}Fragment1Directions" navigatesTo fragment1Tag
+    "val x = Fragment1Directions.${caret}someAction()" navigatesTo actionTag
+    "val x = Fragment1Directions.someAction(${caret}fromAction = 42)" navigatesTo argFromActionTag
+    "val x = Fragment1Directions.someAction(${caret}overridden = 42)" navigatesTo
+      argOverriddenInActionTag
+    "val x = Fragment1Directions.someAction(${caret}fromDestination = 42)" navigatesTo
+      argFromDestinationTag
+  }
+
+  private infix fun @receiver:Language("kotlin") String.navigatesTo(target: PsiElement?) {
+    analyzeFileContent(
+      """
+        package test.safeargs
+
+        ${this}
+      """
+        .trimIndent()
+    ) { symbol: KtSymbol ->
+      assertThat(getResolveExtensionPsiNavigationTargets(symbol))
+        .containsExactlyElementsIn(listOfNotNull(target))
+    }
+  }
+}
diff --git a/nav/safeargs/tests/k2/src/com/android/tools/idea/nav/safeargs/kotlin/k2/SafeArgsK2TestSuite.java b/nav/safeargs/tests/k2/src/com/android/tools/idea/nav/safeargs/kotlin/k2/SafeArgsK2TestSuite.java
new file mode 100644
index 0000000..4cc4f96
--- /dev/null
+++ b/nav/safeargs/tests/k2/src/com/android/tools/idea/nav/safeargs/kotlin/k2/SafeArgsK2TestSuite.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.tools.idea.nav.safeargs.kotlin.k2;
+
+import com.android.testutils.JarTestSuiteRunner;
+import com.android.tools.idea.nav.safeargs.SafeArgsTestSuite;
+import com.android.tools.idea.nav.safeargs.SafeArgsTestSuiteBase;
+import org.junit.runner.RunWith;
+
+@RunWith(JarTestSuiteRunner.class)
+@JarTestSuiteRunner.ExcludeClasses({
+  SafeArgsK2TestSuite.class,  // a suite mustn't contain itself
+})
+public class SafeArgsK2TestSuite extends SafeArgsTestSuiteBase {
+}
diff --git a/nav/safeargs/tests/k2/src/com/android/tools/idea/nav/safeargs/kotlin/k2/SafeArgsResolveExtensionProviderTest.kt b/nav/safeargs/tests/k2/src/com/android/tools/idea/nav/safeargs/kotlin/k2/SafeArgsResolveExtensionProviderTest.kt
new file mode 100644
index 0000000..9cf67d7
--- /dev/null
+++ b/nav/safeargs/tests/k2/src/com/android/tools/idea/nav/safeargs/kotlin/k2/SafeArgsResolveExtensionProviderTest.kt
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.tools.idea.nav.safeargs.kotlin.k2
+
+import com.android.tools.idea.nav.safeargs.SafeArgsMode
+import com.android.tools.idea.nav.safeargs.safeArgsMode
+import com.google.common.truth.Truth.assertThat
+import com.intellij.facet.FacetManager
+import com.intellij.openapi.application.runWriteAction
+import com.intellij.openapi.module.Module
+import com.intellij.testFramework.RunsInEdt
+import org.jetbrains.android.facet.AndroidFacet
+import org.jetbrains.kotlin.analysis.api.resolve.extensions.KtResolveExtension
+import org.jetbrains.kotlin.analysis.project.structure.KtModule
+import org.jetbrains.kotlin.analysis.project.structure.KtSdkModule
+import org.jetbrains.kotlin.analysis.project.structure.directRegularDependenciesOfType
+import org.jetbrains.kotlin.idea.base.projectStructure.getMainKtSourceModule
+import org.junit.Before
+import org.junit.Test
+
+@RunsInEdt
+class SafeArgsResolveExtensionProviderTest : AbstractSafeArgsResolveExtensionTest() {
+
+  private lateinit var module: Module
+
+  @Before
+  fun setUp() {
+    module = safeArgsRule.module
+  }
+
+  @Test
+  fun sourceModule_kotlinMode_createsExtension_registersListener() {
+    safeArgsRule.androidFacet.safeArgsMode = SafeArgsMode.KOTLIN
+    assertThat(module.getMainKtSourceModule()!!.provideExtensions())
+      .containsExactly(SafeArgsResolveExtensionModuleService.getInstance(safeArgsRule.module))
+    assertThat(isChangeListenerRegistered).isTrue()
+  }
+
+  @Test
+  fun sourceModule_javaMode_doesNotCreateExtension_registersListener() {
+    safeArgsRule.androidFacet.safeArgsMode = SafeArgsMode.JAVA
+    assertThat(module.getMainKtSourceModule()!!.provideExtensions()).isEmpty()
+    assertThat(isChangeListenerRegistered).isTrue()
+  }
+
+  @Test
+  fun sourceModule_noSafeArgsMode_doesNotCreateExtension_registersListener() {
+    safeArgsRule.androidFacet.safeArgsMode = SafeArgsMode.NONE
+    assertThat(module.getMainKtSourceModule()!!.provideExtensions()).isEmpty()
+    assertThat(isChangeListenerRegistered).isTrue()
+  }
+
+  @Test
+  fun nonAndroidSourceModule_doesNotCreateExtension_registersListener() {
+    runWriteAction {
+      FacetManager.getInstance(module)
+        .createModifiableModel()
+        .apply { getFacetsByType(AndroidFacet.ID).forEach { removeFacet(it) } }
+        .commit()
+    }
+
+    assertThat(module.getMainKtSourceModule()!!.provideExtensions()).isEmpty()
+    assertThat(isChangeListenerRegistered).isTrue()
+  }
+
+  @Test
+  fun nonSourceModule_doesNotCreateExtension_doesNotRegisterListener() {
+    val sourceKtModule = module.getMainKtSourceModule()!!
+    val sdkKtModule = sourceKtModule.directRegularDependenciesOfType<KtSdkModule>().first()
+
+    assertThat(sdkKtModule.provideExtensions()).isEmpty()
+    assertThat(isChangeListenerRegistered).isFalse()
+  }
+
+  private fun KtModule.provideExtensions(): List<KtResolveExtension> =
+    SafeArgsResolveExtensionProvider().provideExtensionsFor(this)
+
+  private val isChangeListenerRegistered: Boolean
+    get() = module.project.getServiceIfCreated(ChangeListenerProjectService::class.java) != null
+}
diff --git a/nav/safeargs/tests/k2/src/com/android/tools/idea/nav/safeargs/kotlin/k2/TypeResolutionUtilsTest.kt b/nav/safeargs/tests/k2/src/com/android/tools/idea/nav/safeargs/kotlin/k2/TypeResolutionUtilsTest.kt
new file mode 100644
index 0000000..1eafede
--- /dev/null
+++ b/nav/safeargs/tests/k2/src/com/android/tools/idea/nav/safeargs/kotlin/k2/TypeResolutionUtilsTest.kt
@@ -0,0 +1,91 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.tools.idea.nav.safeargs.kotlin.k2
+
+import com.android.tools.idea.nav.safeargs.index.NavArgumentData
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+
+class TypeResolutionUtilsTest {
+  private data class NavArgumentDataImpl(
+    override val name: String,
+    override val type: String? = null,
+    override val defaultValue: String? = null,
+    override val nullable: String? = null,
+  ) : NavArgumentData
+
+  private fun resolve(
+    type: String? = null,
+    defaultValue: String? = null,
+    nullable: String? = null,
+  ): String =
+    NavArgumentDataImpl("arg", type, defaultValue, nullable).resolveKotlinType(PACKAGE_NAME)
+
+  @Test
+  fun primitives_explicit() {
+    assertThat(resolve(type = "string")).isEqualTo("kotlin.String")
+    assertThat(resolve(type = "integer")).isEqualTo("kotlin.Int")
+    assertThat(resolve(type = "reference")).isEqualTo("kotlin.Int")
+    assertThat(resolve(type = "long")).isEqualTo("kotlin.Long")
+    assertThat(resolve(type = "float")).isEqualTo("kotlin.Float")
+    assertThat(resolve(type = "boolean")).isEqualTo("kotlin.Boolean")
+  }
+
+  @Test
+  fun primitives_inferredType() {
+    assertThat(resolve(defaultValue = "foo")).isEqualTo("kotlin.String")
+    assertThat(resolve(defaultValue = "42")).isEqualTo("kotlin.Int")
+    assertThat(resolve(defaultValue = "42.0")).isEqualTo("kotlin.Float")
+    assertThat(resolve(defaultValue = "true")).isEqualTo("kotlin.Boolean")
+    assertThat(resolve(defaultValue = "@+id/foo")).isEqualTo("kotlin.Int")
+  }
+
+  @Test
+  fun fallback_inferredType() {
+    assertThat(resolve(defaultValue = null)).isEqualTo("kotlin.String")
+    assertThat(resolve(defaultValue = "@null")).isEqualTo("kotlin.String?")
+  }
+
+  @Test
+  fun primitiveArrays() {
+    assertThat(resolve(type = "string[]")).isEqualTo("kotlin.Array<kotlin.String>")
+    assertThat(resolve(type = "integer[]")).isEqualTo("kotlin.IntArray")
+    assertThat(resolve(type = "reference[]")).isEqualTo("kotlin.IntArray")
+    assertThat(resolve(type = "long[]")).isEqualTo("kotlin.LongArray")
+    assertThat(resolve(type = "float[]")).isEqualTo("kotlin.FloatArray")
+    assertThat(resolve(type = "boolean[]")).isEqualTo("kotlin.BooleanArray")
+  }
+
+  @Test
+  fun nullables() {
+    assertThat(resolve(type = "reference", nullable = "true")).isEqualTo("kotlin.Int?")
+    assertThat(resolve(type = "reference[]", nullable = "true")).isEqualTo("kotlin.IntArray?")
+    assertThat(resolve(type = "reference", defaultValue = "@null")).isEqualTo("kotlin.Int?")
+  }
+
+  @Test
+  fun userTypes() {
+    assertThat(resolve(type = ".Baz")).isEqualTo("foo.bar.Baz")
+    assertThat(resolve(type = "quux.Baz")).isEqualTo("quux.Baz")
+    assertThat(resolve(type = ".Baz[]")).isEqualTo("kotlin.Array<foo.bar.Baz>")
+    assertThat(resolve(type = ".Baz", nullable = "true")).isEqualTo("foo.bar.Baz?")
+    assertThat(resolve(type = ".Baz", defaultValue = "@null")).isEqualTo("foo.bar.Baz?")
+  }
+
+  companion object {
+    private const val PACKAGE_NAME = "foo.bar"
+  }
+}
diff --git a/preview-designer/resources/bundle/preview/PreviewBundle.properties b/preview-designer/resources/bundle/preview/PreviewBundle.properties
index 1f85de9..efa5cc8 100644
--- a/preview-designer/resources/bundle/preview/PreviewBundle.properties
+++ b/preview-designer/resources/bundle/preview/PreviewBundle.properties
@@ -39,11 +39,15 @@
 action.animation.inspector.title=Start Animation Preview
 action.animation.inspector.essentials.mode.description=Animation Preview is not available in Preview Essentials Mode
 action.animation.inspector.description=Inspect animations frame-by-frame
+action.scene.view.control.title=View Control
+action.scene.view.control.description=Control the views and layout of preview elements
+action.scene.view.control.essentials.mode.description=Some actions are not available in Preview Essentials Mode
 action.stop.animation.inspector.title=Stop Animation Preview
 action.stop.animation.inspector.description=Closes the Animation Preview
 action.interactive.title=Start Interactive Mode
 action.interactive.description=Live preview to test gestures
 action.interactive.essentials.mode.description=Interactive Mode is not available in Essentials Mode
+action.group.switch.title=Switch Preview Group
 
 action.stop.interactive.title=Stop Interactive Mode
 action.stop.interactive.description=Stops interactive mode
@@ -54,4 +58,5 @@
 grid.groups=Grid Groups
 new.list.layout.title=List
 new.grid.layout.title=Grid
-gallery.mode.title=Gallery
\ No newline at end of file
+gallery.mode.title=Gallery
+group.switch.all=All
\ No newline at end of file
diff --git a/preview-designer/src/com/android/tools/idea/preview/RenderQualityManager.kt b/preview-designer/src/com/android/tools/idea/preview/RenderQualityManager.kt
index 6d6149f..030dab5 100644
--- a/preview-designer/src/com/android/tools/idea/preview/RenderQualityManager.kt
+++ b/preview-designer/src/com/android/tools/idea/preview/RenderQualityManager.kt
@@ -160,8 +160,13 @@
   override fun needsQualityChange(sceneManager: LayoutlibSceneManager): Boolean =
     !isPaused &&
       sceneManager.let {
-        (!it.renderResult.isErrorResult() || it.renderResult.isCancellationException()) &&
-          abs(it.lastRenderQuality - getTargetQuality(it)) > myPolicy.acceptedErrorMargin
+        // Refreshes are skipped in any of the following scenarios:
+        // - Last render failed and not due to a cancellation exception
+        // - The current target quality is substantially different to the one used in the last
+        //   successful render or the last render was cancelled.
+        it.renderResult.isCancellationException() ||
+          (!it.renderResult.isErrorResult() &&
+            abs(it.lastRenderQuality - getTargetQuality(it)) > myPolicy.acceptedErrorMargin)
       }
 
   override fun pause() {
diff --git a/preview-designer/src/com/android/tools/idea/preview/actions/ActionUtils.kt b/preview-designer/src/com/android/tools/idea/preview/actions/ActionUtils.kt
index 1036868..f601edd 100644
--- a/preview-designer/src/com/android/tools/idea/preview/actions/ActionUtils.kt
+++ b/preview-designer/src/com/android/tools/idea/preview/actions/ActionUtils.kt
@@ -17,6 +17,7 @@
 
 import com.android.tools.idea.actions.SCENE_VIEW
 import com.android.tools.idea.common.actions.ActionButtonWithToolTipDescription
+import com.android.tools.idea.common.surface.SceneView
 import com.android.tools.idea.preview.modes.PreviewMode
 import com.android.tools.idea.preview.modes.PreviewModeManager
 import com.android.tools.idea.preview.mvvm.PREVIEW_VIEW_MODEL_STATUS
@@ -32,11 +33,13 @@
 import com.intellij.openapi.actionSystem.AnActionWrapper
 import com.intellij.openapi.actionSystem.CommonDataKeys
 import com.intellij.openapi.actionSystem.DataContext
+import com.intellij.openapi.actionSystem.DataKey
 import com.intellij.openapi.actionSystem.DefaultActionGroup
 import com.intellij.openapi.actionSystem.Presentation
 import com.intellij.openapi.actionSystem.ex.CustomComponentAction
 import com.intellij.openapi.fileEditor.FileEditor
 import com.intellij.openapi.fileEditor.FileEditorManager
+import com.intellij.util.concurrency.annotations.RequiresBackgroundThread
 
 /**
  * Helper method that navigates back to the previous [PreviewMode] for all [PreviewModeManager]s in
@@ -45,46 +48,47 @@
  * @param e the [AnActionEvent] holding the context of the action
  */
 fun navigateBack(e: AnActionEvent) {
-  findPreviewModeManagersForContext(e.dataContext).forEach { it.restorePrevious() }
+  e.dataContext.findPreviewManager(PreviewModeManager.KEY)?.restorePrevious()
 }
 
 /**
- * Returns a list of all [PreviewModeManager]s related to the current context (which is implied to
- * be bound to a particular file). The search is done among the open preview parts and
- * [PreviewRepresentation]s (if any) of open file editors.
+ * Returns a preview manager [T] related to the current context (which is implied to be bound to a
+ * particular file), or null if one is not found. The search is done among the open preview parts
+ * and [PreviewRepresentation] of the selected file editor.
  *
  * This call might access the [CommonDataKeys.VIRTUAL_FILE] so it should not be called in the EDT
  * thread. For actions using it, they should use [ActionUpdateThread.BGT].
  */
-internal fun findPreviewModeManagersForContext(context: DataContext): List<PreviewModeManager> {
-  context.getData(PreviewModeManager.KEY)?.let {
-    // The context is associated to a PreviewModeManager so return it
-    return listOf(it)
+@RequiresBackgroundThread
+inline fun <reified T> DataContext.findPreviewManager(key: DataKey<T>): T? {
+  getData(key)?.let {
+    // The context is associated to a preview manager so return it
+    return it
   }
 
-  // Fallback to finding the PreviewModeManager by looking into all the editors
-  val project = context.getData(CommonDataKeys.PROJECT) ?: return emptyList()
-  val file = context.getData(CommonDataKeys.VIRTUAL_FILE) ?: return emptyList()
+  // Fallback to finding the preview manager by looking into all the editors
+  val project = getData(CommonDataKeys.PROJECT) ?: return null
+  val file = getData(CommonDataKeys.VIRTUAL_FILE) ?: return null
 
-  return FileEditorManager.getInstance(project)?.getAllEditors(file)?.mapNotNull {
-    it.getPreviewModeManager()
-  } ?: emptyList()
+  return FileEditorManager.getInstance(project)?.getSelectedEditor(file)?.getPreviewManager<T>()
 }
 
 /**
- * Returns the [PreviewModeManager] or null if this [FileEditor]'s preview representation is not a
- * [PreviewModeManager].
+ * Returns the preview manager of type [T] or null if this [FileEditor]'s preview representation is
+ * not of type [T].
  */
-private fun FileEditor.getPreviewModeManager(): PreviewModeManager? =
+inline fun <reified T> FileEditor.getPreviewManager(): T? =
   when (this) {
-    is MultiRepresentationPreview -> this.currentRepresentation as? PreviewModeManager
+    is MultiRepresentationPreview -> this.currentRepresentation as? T
     is TextEditorWithMultiRepresentationPreview<out MultiRepresentationPreview> ->
-      this.preview.currentRepresentation as? PreviewModeManager
+      this.preview.currentRepresentation as? T
     else -> null
   }
 
 private class PreviewNonInteractiveActionWrapper(actions: List<AnAction>) :
   DefaultActionGroup(actions) {
+  override fun getActionUpdateThread() = ActionUpdateThread.BGT
+
   override fun update(e: AnActionEvent) {
     super.update(e)
 
@@ -100,12 +104,12 @@
   PreviewNonInteractiveActionWrapper(this)
 
 /**
- * Makes the given action only visible when the Compose preview is not in interactive or animation
- * modes. Returns an [ActionGroup] that handles the visibility.
+ * Makes the given action only visible when the preview is not in interactive or animation modes.
+ * Returns an [ActionGroup] that handles the visibility.
  */
 fun AnAction.visibleOnlyInStaticPreview(): ActionGroup = listOf(this).visibleOnlyInStaticPreview()
 
-/** Hide the given actions if the [sceneView] contains render errors. */
+/** Hide the given actions if the [SceneView] contains render errors. */
 fun List<AnAction>.hideIfRenderErrors(): List<AnAction> = map {
   ShowUnderConditionWrapper(it) { context -> !hasSceneViewErrors(context) }
 }
diff --git a/compose-designer/src/com/android/tools/idea/compose/preview/actions/GroupSwitchAction.kt b/preview-designer/src/com/android/tools/idea/preview/actions/GroupSwitchAction.kt
similarity index 71%
rename from compose-designer/src/com/android/tools/idea/compose/preview/actions/GroupSwitchAction.kt
rename to preview-designer/src/com/android/tools/idea/preview/actions/GroupSwitchAction.kt
index b5f859d..f7bef38 100644
--- a/compose-designer/src/com/android/tools/idea/compose/preview/actions/GroupSwitchAction.kt
+++ b/preview-designer/src/com/android/tools/idea/preview/actions/GroupSwitchAction.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2019 The Android Open Source Project
+ * Copyright (C) 2024 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -13,21 +13,24 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.android.tools.idea.compose.preview.actions
+package com.android.tools.idea.preview.actions
 
 import com.android.tools.adtui.actions.DropDownAction
-import com.android.tools.idea.compose.preview.PreviewGroup
-import com.android.tools.idea.compose.preview.findComposePreviewManagerForContext
-import com.android.tools.idea.compose.preview.message
+import com.android.tools.idea.preview.PreviewBundle.message
+import com.android.tools.idea.preview.groups.PreviewGroup
+import com.android.tools.idea.preview.groups.PreviewGroupManager
 import com.intellij.openapi.actionSystem.ActionUpdateThread
 import com.intellij.openapi.actionSystem.AnActionEvent
 import com.intellij.openapi.actionSystem.DataContext
 import com.intellij.openapi.actionSystem.ToggleAction
 
 /** [DropDownAction] that allows the user filtering the visible previews by group. */
-internal class GroupSwitchAction :
-  DropDownAction(null, message("action.group.switch.title"), null) {
-  // Actions calling findComposePreviewManagersForContext in the update method, must run in BGT
+class GroupSwitchAction(
+  private val isEnabled: (e: AnActionEvent) -> Boolean = { true },
+  private val isVisible: (e: AnActionEvent) -> Boolean = { true },
+) : DropDownAction(null, message("action.group.switch.title"), null) {
+
+  /** Actions calling [findPreviewManager] in the update method, must run in BGT */
   override fun getActionUpdateThread(): ActionUpdateThread = ActionUpdateThread.BGT
 
   /** [ToggleAction] that sets the given [group] as filter. */
@@ -39,7 +42,7 @@
 
     override fun setSelected(e: AnActionEvent, state: Boolean) {
       if (state) {
-        findComposePreviewManagerForContext(e.dataContext)?.groupFilter = group
+        e.dataContext.findPreviewManager(PreviewGroupManager.KEY)?.groupFilter = group
       }
     }
   }
@@ -50,12 +53,11 @@
     super.update(e)
 
     val presentation = e.presentation
-    val previewManager = findComposePreviewManagerForContext(e.dataContext)
+    val previewManager = e.dataContext.findPreviewManager(PreviewGroupManager.KEY)
     val availableGroups = previewManager?.availableGroupsFlow?.value?.toSet() ?: emptySet()
-    presentation.isVisible = availableGroups.isNotEmpty() && previewManager?.isFilterEnabled != true
+    presentation.isVisible = availableGroups.isNotEmpty() && isVisible(e)
+    presentation.isEnabled = availableGroups.isNotEmpty() && isEnabled(e)
 
-    presentation.isEnabled =
-      availableGroups.isNotEmpty() && previewManager?.status()?.isRefreshing != true
     if (presentation.isVisible) {
       presentation.text = previewManager?.groupFilter?.displayName
     }
@@ -63,7 +65,7 @@
 
   override fun updateActions(context: DataContext): Boolean {
     removeAll()
-    val previewManager = findComposePreviewManagerForContext(context)
+    val previewManager = context.findPreviewManager(PreviewGroupManager.KEY)
     val availableGroups = previewManager?.availableGroupsFlow?.value?.toSet() ?: emptySet()
     if (availableGroups.isEmpty()) return true
 
diff --git a/preview-designer/src/com/android/tools/idea/preview/actions/StopAnimationInspectorAction.kt b/preview-designer/src/com/android/tools/idea/preview/actions/StopAnimationInspectorAction.kt
index b1ed28b..0738577 100644
--- a/preview-designer/src/com/android/tools/idea/preview/actions/StopAnimationInspectorAction.kt
+++ b/preview-designer/src/com/android/tools/idea/preview/actions/StopAnimationInspectorAction.kt
@@ -17,6 +17,7 @@
 
 import com.android.tools.idea.preview.PreviewBundle.message
 import com.android.tools.idea.preview.modes.PreviewMode
+import com.android.tools.idea.preview.modes.PreviewModeManager
 import com.intellij.openapi.actionSystem.ActionUpdateThread
 import com.intellij.openapi.actionSystem.AnActionEvent
 import com.intellij.ui.AnActionButton
@@ -36,21 +37,15 @@
   override fun displayTextInToolbar(): Boolean = true
 
   override fun updateButton(e: AnActionEvent) {
-    e.presentation.isEnabled =
-      findPreviewModeManagersForContext(e.dataContext).any {
-        it.mode.value is PreviewMode.AnimationInspection
-      } && !isDisabled(e)
-    e.presentation.isVisible =
-      findPreviewModeManagersForContext(e.dataContext).any {
-        it.mode.value is PreviewMode.AnimationInspection
-      }
+    val previewMode = e.dataContext.findPreviewManager(PreviewModeManager.KEY)?.mode?.value
+    e.presentation.isEnabled = previewMode is PreviewMode.AnimationInspection && !isDisabled(e)
+    e.presentation.isVisible = previewMode is PreviewMode.AnimationInspection
   }
 
   override fun actionPerformed(e: AnActionEvent) {
     navigateBack(e)
   }
 
-  // BGT is needed when calling findComposePreviewManagersForContext because it accesses the
-  // VirtualFile
+  /** BGT is needed when calling [findPreviewManager] because it accesses the VirtualFile */
   override fun getActionUpdateThread() = ActionUpdateThread.BGT
 }
diff --git a/preview-designer/src/com/android/tools/idea/preview/actions/StopInteractivePreviewAction.kt b/preview-designer/src/com/android/tools/idea/preview/actions/StopInteractivePreviewAction.kt
index 92ce22d..7803a3b 100644
--- a/preview-designer/src/com/android/tools/idea/preview/actions/StopInteractivePreviewAction.kt
+++ b/preview-designer/src/com/android/tools/idea/preview/actions/StopInteractivePreviewAction.kt
@@ -17,6 +17,7 @@
 
 import com.android.tools.idea.preview.PreviewBundle.message
 import com.android.tools.idea.preview.modes.PreviewMode
+import com.android.tools.idea.preview.modes.PreviewModeManager
 import com.intellij.openapi.actionSystem.ActionUpdateThread
 import com.intellij.openapi.actionSystem.AnActionEvent
 import com.intellij.ui.AnActionButton
@@ -35,21 +36,15 @@
   override fun displayTextInToolbar(): Boolean = true
 
   override fun updateButton(e: AnActionEvent) {
-    e.presentation.isEnabled =
-      findPreviewModeManagersForContext(e.dataContext).any {
-        it.mode.value is PreviewMode.Interactive
-      } && !isDisabled(e)
-    e.presentation.isVisible =
-      findPreviewModeManagersForContext(e.dataContext).any {
-        it.mode.value is PreviewMode.Interactive
-      }
+    val previewMode = e.dataContext.findPreviewManager(PreviewModeManager.KEY)?.mode?.value
+    e.presentation.isEnabled = previewMode is PreviewMode.Interactive && !isDisabled(e)
+    e.presentation.isVisible = previewMode is PreviewMode.Interactive
   }
 
   override fun actionPerformed(e: AnActionEvent) {
     navigateBack(e)
   }
 
-  // BGT is needed when calling findComposePreviewManagersForContext because it accesses the
-  // VirtualFile
+  /** BGT is needed when calling [findPreviewManager] because it accesses the VirtualFile */
   override fun getActionUpdateThread() = ActionUpdateThread.BGT
 }
diff --git a/compose-designer/src/com/android/tools/idea/compose/preview/actions/SwitchSurfaceLayoutManagerAction.kt b/preview-designer/src/com/android/tools/idea/preview/actions/SwitchSurfaceLayoutManagerAction.kt
similarity index 90%
rename from compose-designer/src/com/android/tools/idea/compose/preview/actions/SwitchSurfaceLayoutManagerAction.kt
rename to preview-designer/src/com/android/tools/idea/preview/actions/SwitchSurfaceLayoutManagerAction.kt
index 1c67189..34e4e4b 100644
--- a/compose-designer/src/com/android/tools/idea/compose/preview/actions/SwitchSurfaceLayoutManagerAction.kt
+++ b/preview-designer/src/com/android/tools/idea/preview/actions/SwitchSurfaceLayoutManagerAction.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2023 The Android Open Source Project
+ * Copyright (C) 2024 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -13,13 +13,12 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.android.tools.idea.compose.preview.actions
+package com.android.tools.idea.preview.actions
 
 import com.android.tools.adtui.actions.DropDownAction
 import com.android.tools.idea.actions.DESIGN_SURFACE
 import com.android.tools.idea.common.actions.ActionButtonWithToolTipDescription
-import com.android.tools.idea.compose.preview.COMPOSE_PREVIEW_MANAGER
-import com.android.tools.idea.compose.preview.ComposePreviewManager
+import com.android.tools.idea.preview.modes.PreviewModeManager
 import com.android.tools.idea.preview.modes.SurfaceLayoutManagerOption
 import com.android.tools.idea.uibuilder.surface.LayoutManagerSwitcher
 import com.intellij.icons.AllIcons
@@ -35,7 +34,7 @@
 class SwitchSurfaceLayoutManagerAction(
   layoutManagers: List<SurfaceLayoutManagerOption>,
   private val isActionEnabled: (AnActionEvent) -> Boolean = { true },
-  private val updateMode: (SurfaceLayoutManagerOption, ComposePreviewManager) -> Unit,
+  private val updateMode: (SurfaceLayoutManagerOption, PreviewModeManager) -> Unit,
 ) : DropDownAction("Switch Layout", "Changes the layout of the preview elements.", null) {
 
   /**
@@ -54,7 +53,7 @@
 
     override fun setSelected(e: AnActionEvent, state: Boolean) {
       if (state) {
-        val previewManager = e.getData(COMPOSE_PREVIEW_MANAGER) ?: return
+        val previewManager = e.getData(PreviewModeManager.KEY) ?: return
         updateMode(option, previewManager)
       }
     }
diff --git a/preview-designer/src/com/android/tools/idea/preview/actions/ViewControlAction.kt b/preview-designer/src/com/android/tools/idea/preview/actions/ViewControlAction.kt
new file mode 100644
index 0000000..93e6ec5
--- /dev/null
+++ b/preview-designer/src/com/android/tools/idea/preview/actions/ViewControlAction.kt
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.tools.idea.preview.actions
+
+import com.android.tools.adtui.actions.DropDownAction
+import com.android.tools.idea.preview.PreviewBundle.message
+import com.intellij.icons.AllIcons
+import com.intellij.openapi.actionSystem.ActionUpdateThread
+import com.intellij.openapi.actionSystem.AnActionEvent
+import com.intellij.openapi.actionSystem.Presentation
+import com.intellij.ui.icons.copyIcon
+
+/**
+ * When using [AllIcons.Debugger.RestoreLayout] as the icon, this action is considered as a
+ * multi-choice group, even [Presentation.setMultiChoice] sets to false. (See
+ * [com.intellij.openapi.actionSystem.impl.Utils.isMultiChoiceGroup])
+ *
+ * We clone the icon here, so we can control the multi-choice state of this action ourselves.
+ */
+open class ViewControlAction(
+  private val isEnabled: (e: AnActionEvent) -> Boolean,
+  private val isEssentialsModeEnabled: () -> Boolean,
+  private val essentialModeDescription: String =
+    message("action.scene.view.control.essentials.mode.description"),
+) :
+  DropDownAction(
+    message("action.scene.view.control.title"),
+    message("action.scene.view.control.description"),
+    copyIcon(AllIcons.Debugger.RestoreLayout, null, true),
+  ) {
+
+  override fun update(e: AnActionEvent) {
+    super.update(e)
+    e.presentation.isEnabled = isEnabled(e)
+    e.presentation.description =
+      if (isEssentialsModeEnabled()) essentialModeDescription
+      else message("action.scene.view.control.description")
+  }
+
+  // Actions calling isDisabled in the update method, must run in BGT
+  override fun getActionUpdateThread(): ActionUpdateThread = ActionUpdateThread.BGT
+}
diff --git a/compose-designer/src/com/android/tools/idea/compose/preview/analytics/PreviewCanvasTracker.kt b/preview-designer/src/com/android/tools/idea/preview/analytics/PreviewCanvasTracker.kt
similarity index 96%
rename from compose-designer/src/com/android/tools/idea/compose/preview/analytics/PreviewCanvasTracker.kt
rename to preview-designer/src/com/android/tools/idea/preview/analytics/PreviewCanvasTracker.kt
index 0a88a04..69cc8ab 100644
--- a/compose-designer/src/com/android/tools/idea/compose/preview/analytics/PreviewCanvasTracker.kt
+++ b/preview-designer/src/com/android/tools/idea/preview/analytics/PreviewCanvasTracker.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2023 The Android Open Source Project
+ * Copyright (C) 2024 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.android.tools.idea.compose.preview.analytics
+package com.android.tools.idea.preview.analytics
 
 import com.android.tools.idea.common.analytics.DesignerUsageTrackerManager
 import com.android.tools.idea.uibuilder.surface.layout.GridSurfaceLayoutManager
diff --git a/preview-designer/src/com/android/tools/idea/preview/analytics/PreviewRefreshTracker.kt b/preview-designer/src/com/android/tools/idea/preview/analytics/PreviewRefreshTracker.kt
index 0916f4a..659c644 100644
--- a/preview-designer/src/com/android/tools/idea/preview/analytics/PreviewRefreshTracker.kt
+++ b/preview-designer/src/com/android/tools/idea/preview/analytics/PreviewRefreshTracker.kt
@@ -17,13 +17,13 @@
 
 import com.android.tools.idea.common.analytics.DesignerUsageTrackerManager
 import com.android.tools.idea.common.analytics.setApplicationId
+import com.android.tools.idea.common.surface.DesignSurface
 import com.google.wireless.android.sdk.stats.AndroidStudioEvent
 import com.google.wireless.android.sdk.stats.PreviewRefreshEvent
 import com.intellij.openapi.diagnostic.Logger
 import java.util.concurrent.Executor
 import java.util.concurrent.atomic.AtomicBoolean
 import java.util.function.Consumer
-import org.jetbrains.android.facet.AndroidFacet
 
 /** Tracker implementation for the refresh process of a preview tool. */
 interface PreviewRefreshTracker {
@@ -33,7 +33,7 @@
     private val MANAGER =
       DesignerUsageTrackerManager(::PreviewRefreshDefaultTracker, PreviewRefreshNopTracker)
 
-    fun getInstance(facet: AndroidFacet?) = MANAGER.getInstance(facet)
+    fun getInstance(surface: DesignSurface<*>?) = MANAGER.getInstance(surface)
   }
 }
 
@@ -58,11 +58,11 @@
  */
 private class PreviewRefreshDefaultTracker(
   private val executor: Executor,
-  private val facet: AndroidFacet?,
+  private val surface: DesignSurface<*>?,
   private val studioEventTracker: Consumer<AndroidStudioEvent.Builder>,
 ) : PreviewRefreshTracker {
   override fun logEvent(event: PreviewRefreshEvent): AndroidStudioEvent.Builder {
-    event.createAndroidStudioEvent().setApplicationId(facet).let {
+    event.createAndroidStudioEvent().setApplicationId(surface).let {
       executor.execute { studioEventTracker.accept(it) }
       return it
     }
diff --git a/compose-designer/src/com/android/tools/idea/compose/preview/PreviewGroup.kt b/preview-designer/src/com/android/tools/idea/preview/groups/PreviewGroup.kt
similarity index 89%
rename from compose-designer/src/com/android/tools/idea/compose/preview/PreviewGroup.kt
rename to preview-designer/src/com/android/tools/idea/preview/groups/PreviewGroup.kt
index 8f3808c..f3ae92b 100644
--- a/compose-designer/src/com/android/tools/idea/compose/preview/PreviewGroup.kt
+++ b/preview-designer/src/com/android/tools/idea/preview/groups/PreviewGroup.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2023 The Android Open Source Project
+ * Copyright (C) 2024 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -13,8 +13,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.android.tools.idea.compose.preview
+package com.android.tools.idea.preview.groups
 
+import com.android.tools.idea.preview.PreviewBundle.message
 import javax.swing.Icon
 
 /** Class representing groups available for selection in the [ComposePreviewManager]. */
diff --git a/preview-designer/src/com/android/tools/idea/preview/groups/PreviewGroupManager.kt b/preview-designer/src/com/android/tools/idea/preview/groups/PreviewGroupManager.kt
new file mode 100644
index 0000000..3781f8d
--- /dev/null
+++ b/preview-designer/src/com/android/tools/idea/preview/groups/PreviewGroupManager.kt
@@ -0,0 +1,45 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.tools.idea.preview.groups
+
+import com.android.tools.idea.preview.actions.GroupSwitchAction
+import com.android.tools.preview.PreviewElement
+import com.intellij.openapi.actionSystem.DataKey
+import kotlinx.coroutines.flow.StateFlow
+
+/**
+ * Interface used for Preview Representations that support [PreviewGroup]s. It allows filtering
+ * [PreviewElement]s based on a list of available [PreviewGroup]s or [PreviewGroup.All] when no
+ * filtering should be applied.
+ *
+ * @see [GroupSwitchAction]
+ */
+interface PreviewGroupManager {
+  /**
+   * [StateFlow] of available named groups in this preview. The editor can contain multiple groups
+   * and only one will be displayed at a given time.
+   */
+  val availableGroupsFlow: StateFlow<Set<PreviewGroup.Named>>
+
+  /**
+   * Currently selected group from [availableGroupsFlow] or [PreviewGroup.All] if none is selected.
+   */
+  var groupFilter: PreviewGroup
+
+  companion object {
+    val KEY = DataKey.create<PreviewGroupManager>("PreviewGroupManager")
+  }
+}
diff --git a/preview-designer/src/com/android/tools/idea/preview/representation/CommonPreviewRepresentation.kt b/preview-designer/src/com/android/tools/idea/preview/representation/CommonPreviewRepresentation.kt
index 646edce..d4da231 100644
--- a/preview-designer/src/com/android/tools/idea/preview/representation/CommonPreviewRepresentation.kt
+++ b/preview-designer/src/com/android/tools/idea/preview/representation/CommonPreviewRepresentation.kt
@@ -51,6 +51,7 @@
 import com.android.tools.idea.uibuilder.editor.multirepresentation.PreferredVisibility
 import com.android.tools.idea.uibuilder.editor.multirepresentation.PreviewRepresentation
 import com.android.tools.idea.uibuilder.scene.LayoutlibSceneManager
+import com.android.tools.idea.uibuilder.surface.LayoutManagerSwitcher
 import com.android.tools.idea.uibuilder.surface.NlDesignSurface
 import com.android.tools.idea.util.runWhenSmartAndSyncedOnEdt
 import com.android.tools.preview.PreviewDisplaySettings
@@ -428,6 +429,9 @@
 
         previewModeManager.mode.collect {
           lastMode?.let { last -> onExit(last) }
+          // The layout update needs to happen before onEnter, so that any zooming performed
+          // in onEnter uses the correct preview layout when measuring scale.
+          updateLayoutManager(it)
           onEnter(it)
           lastMode = it
         }
@@ -505,4 +509,14 @@
     interactiveManager.stop()
     createRefreshJob(invalidate = true)?.join()
   }
+
+  private suspend fun updateLayoutManager(mode: PreviewMode) {
+    withContext(uiThread) {
+      val layoutManager = surface.sceneViewLayoutManager as LayoutManagerSwitcher
+      layoutManager.setLayoutManager(
+        mode.layoutOption.layoutManager,
+        mode.layoutOption.sceneViewAlignment,
+      )
+    }
+  }
 }
diff --git a/preview-designer/testSrc/com/android/tools/idea/preview/RenderQualityManagerTest.kt b/preview-designer/testSrc/com/android/tools/idea/preview/RenderQualityManagerTest.kt
index dbfb988..560ed7d 100644
--- a/preview-designer/testSrc/com/android/tools/idea/preview/RenderQualityManagerTest.kt
+++ b/preview-designer/testSrc/com/android/tools/idea/preview/RenderQualityManagerTest.kt
@@ -181,6 +181,21 @@
   }
 
   @Test
+  fun testCancelledExceptionTriggersQualityChange_EvenForSameQuality() = runBlocking {
+    tool.errorMargin = 0.2f
+    tool.currentQuality = 0.5f
+
+    tool.targetQuality = 0.5f
+    val renderCancelledResult = mock<RenderResult>()
+    val mockResult = mock<Result>()
+    whenever(mockResult.isSuccess).thenReturn(false)
+    whenever(mockResult.exception).thenReturn(CancellationException())
+    whenever(renderCancelledResult.renderResult).thenReturn(mockResult)
+    whenever(sceneManagerMock.renderResult).thenReturn(renderCancelledResult)
+    assertTrue(qualityManager.needsQualityChange(sceneManagerMock))
+  }
+
+  @Test
   fun testErrorDoesNotTriggerQualityChange() = runBlocking {
     tool.errorMargin = 0.2f
     tool.currentQuality = 0.5f
diff --git a/compose-designer/testSrc/com/android/tools/idea/compose/preview/actions/SwitchSurfaceLayoutManagerActionTest.kt b/preview-designer/testSrc/com/android/tools/idea/preview/actions/SwitchSurfaceLayoutManagerActionTest.kt
similarity index 95%
rename from compose-designer/testSrc/com/android/tools/idea/compose/preview/actions/SwitchSurfaceLayoutManagerActionTest.kt
rename to preview-designer/testSrc/com/android/tools/idea/preview/actions/SwitchSurfaceLayoutManagerActionTest.kt
index 4920374..ba7067b 100644
--- a/compose-designer/testSrc/com/android/tools/idea/compose/preview/actions/SwitchSurfaceLayoutManagerActionTest.kt
+++ b/preview-designer/testSrc/com/android/tools/idea/preview/actions/SwitchSurfaceLayoutManagerActionTest.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2023 The Android Open Source Project
+ * Copyright (C) 2024 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.android.tools.idea.compose.preview.actions
+package com.android.tools.idea.preview.actions
 
 import com.android.tools.idea.common.surface.layout.EmptySurfaceLayoutManager
 import com.android.tools.idea.preview.modes.SurfaceLayoutManagerOption
diff --git a/compose-designer/testSrc/com/android/tools/idea/compose/preview/analytics/PreviewCanvasTrackerTest.kt b/preview-designer/testSrc/com/android/tools/idea/preview/analytics/PreviewCanvasTrackerTest.kt
similarity index 95%
rename from compose-designer/testSrc/com/android/tools/idea/compose/preview/analytics/PreviewCanvasTrackerTest.kt
rename to preview-designer/testSrc/com/android/tools/idea/preview/analytics/PreviewCanvasTrackerTest.kt
index 945de45..1b72363 100644
--- a/compose-designer/testSrc/com/android/tools/idea/compose/preview/analytics/PreviewCanvasTrackerTest.kt
+++ b/preview-designer/testSrc/com/android/tools/idea/preview/analytics/PreviewCanvasTrackerTest.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2020 The Android Open Source Project
+ * Copyright (C) 2024 The Android Open Source Project
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.android.tools.idea.compose.preview.analytics
+package com.android.tools.idea.preview.analytics
 
 import com.android.tools.idea.uibuilder.surface.layout.GroupPadding
 import com.android.tools.idea.uibuilder.surface.layout.GroupedGridSurfaceLayoutManager
diff --git a/profilers-android/src/com/android/tools/idea/profilers/AndroidProfilerToolWindow.kt b/profilers-android/src/com/android/tools/idea/profilers/AndroidProfilerToolWindow.kt
index 5cd0453..b81b952 100644
--- a/profilers-android/src/com/android/tools/idea/profilers/AndroidProfilerToolWindow.kt
+++ b/profilers-android/src/com/android/tools/idea/profilers/AndroidProfilerToolWindow.kt
@@ -101,7 +101,7 @@
       StartupManager.getInstance(project).runWhenProjectIsInitialized { profilers.preferredProcessName = getPreferredProcessName(project) }
     }
 
-    ideProfilerComponents = IntellijProfilerComponents(project, ideProfilerServices.featureTracker)
+    ideProfilerComponents = IntellijProfilerComponents(project, this, ideProfilerServices.featureTracker)
 
     // Create and store the task handlers in a map.
     initializeTaskHandlers()
diff --git a/profilers-android/src/com/android/tools/idea/profilers/IntellijProfilerComponents.java b/profilers-android/src/com/android/tools/idea/profilers/IntellijProfilerComponents.java
index 3b9a450..674dff3 100644
--- a/profilers-android/src/com/android/tools/idea/profilers/IntellijProfilerComponents.java
+++ b/profilers-android/src/com/android/tools/idea/profilers/IntellijProfilerComponents.java
@@ -31,6 +31,7 @@
 import com.android.tools.profilers.cpu.config.ProfilingConfiguration;
 import com.android.tools.profilers.cpu.config.UnspecifiedConfiguration;
 import com.android.tools.profilers.stacktrace.LoadingPanel;
+import com.intellij.openapi.Disposable;
 import com.intellij.openapi.project.Project;
 import com.intellij.ui.components.JBLoadingPanel;
 import java.awt.BorderLayout;
@@ -45,10 +46,16 @@
 
   @NotNull private final Project myProject;
 
+  @NotNull private final Disposable myParentDisposable;
+
   @NotNull private final FeatureTracker myFeatureTracker;
 
-  public IntellijProfilerComponents(@NotNull Project project, @NotNull FeatureTracker featureTracker) {
+  public IntellijProfilerComponents(
+    @NotNull Project project,
+    @NotNull Disposable parentDisposable,
+    @NotNull FeatureTracker featureTracker) {
     myProject = project;
+    myParentDisposable = parentDisposable;
     myFeatureTracker = featureTracker;
   }
 
@@ -92,7 +99,7 @@
   @NotNull
   @Override
   public StackTraceGroup createStackGroup() {
-    return new IntelliJStackTraceGroup(myProject);
+    return new IntelliJStackTraceGroup(myProject, myParentDisposable);
   }
 
   @NotNull
diff --git a/profilers-ui/src/com/android/tools/profilers/taskbased/common/constants/TaskBasedUxIcons.kt b/profilers-ui/src/com/android/tools/profilers/taskbased/common/constants/TaskBasedUxIcons.kt
index 3374e40..22c4710 100644
--- a/profilers-ui/src/com/android/tools/profilers/taskbased/common/constants/TaskBasedUxIcons.kt
+++ b/profilers-ui/src/com/android/tools/profilers/taskbased/common/constants/TaskBasedUxIcons.kt
@@ -62,6 +62,9 @@
   // The settings icon is used as a button to invoke the task configuration dialog.
   val TASK_CONFIG_ICON = TaskBasedUxIcon("studio/icons/common/settings.svg", StudioIcons::class.java, StudioIcons.Common.SETTINGS)
 
+  // The garbage icon is used for the delete recording button.
+  val DELETE_RECORDING_ICON = TaskBasedUxIcon("studio/icons/common/delete.svg", StudioIcons::class.java, StudioIcons.Common.DELETE)
+
   /** The following are the AllIcons used in the Task-Based UX Profiler. **/
   val RESTART_ICON = TaskBasedUxIcon("actions/restart.svg", AllIcons::class.java, AllIcons.Actions.Restart)
 
diff --git a/profilers-ui/src/com/android/tools/profilers/taskbased/common/constants/TaskBasedUxStrings.kt b/profilers-ui/src/com/android/tools/profilers/taskbased/common/constants/TaskBasedUxStrings.kt
index b219e90..d6a2755 100644
--- a/profilers-ui/src/com/android/tools/profilers/taskbased/common/constants/TaskBasedUxStrings.kt
+++ b/profilers-ui/src/com/android/tools/profilers/taskbased/common/constants/TaskBasedUxStrings.kt
@@ -34,4 +34,8 @@
   const val IMPORT_RECORDING_DESC = "Import recording"
   const val EXPORT_RECORDING_DESC = "Export recording"
   const val EXPORT_RECORDING_DISABLED_TOOLTIP = "Recording is not exportable"
+
+  // Delete recording strings
+  const val DELETE_RECORDING_DESC = "Delete recording"
+  const val DELETE_RECORDING_DISABLED_TOOLTIP = "Recording is not deletable"
 }
\ No newline at end of file
diff --git a/profilers-ui/src/com/android/tools/profilers/taskbased/tabs/pastrecordings/recordinglist/RecordingList.kt b/profilers-ui/src/com/android/tools/profilers/taskbased/tabs/pastrecordings/recordinglist/RecordingList.kt
index ae5fbf7..00e858e 100644
--- a/profilers-ui/src/com/android/tools/profilers/taskbased/tabs/pastrecordings/recordinglist/RecordingList.kt
+++ b/profilers-ui/src/com/android/tools/profilers/taskbased/tabs/pastrecordings/recordinglist/RecordingList.kt
@@ -27,8 +27,11 @@
 fun RecordingList(recordingListModel: RecordingListModel, ideProfilerComponents: IdeProfilerComponents, modifier: Modifier = Modifier) {
   Column(modifier = modifier) {
     val isRecordingExportable = recordingListModel.isSelectedRecordingExportable()
+    val isRecordingSelected = recordingListModel.isRecordingSelected()
     val selectedRecording by recordingListModel.selectedRecording.collectAsState()
     RecordingListActionsBar(artifact = recordingListModel.exportableArtifact, isRecordingExportable = isRecordingExportable,
+                            isRecordingSelected = isRecordingSelected,
+                            doDeleteSelectedRecording = recordingListModel::doDeleteSelectedRecording,
                             profilers = recordingListModel.profilers, ideProfilerComponents = ideProfilerComponents)
 
     val recordingList by recordingListModel.recordingList.collectAsState()
diff --git a/profilers-ui/src/com/android/tools/profilers/taskbased/tabs/pastrecordings/recordinglist/RecordingListActionsBar.kt b/profilers-ui/src/com/android/tools/profilers/taskbased/tabs/pastrecordings/recordinglist/RecordingListActionsBar.kt
index c9573f6..7a75ef5 100644
--- a/profilers-ui/src/com/android/tools/profilers/taskbased/tabs/pastrecordings/recordinglist/RecordingListActionsBar.kt
+++ b/profilers-ui/src/com/android/tools/profilers/taskbased/tabs/pastrecordings/recordinglist/RecordingListActionsBar.kt
@@ -25,17 +25,21 @@
 import com.android.tools.profilers.ExportArtifactUtils
 import com.android.tools.profilers.ExportableArtifact
 import com.android.tools.profilers.IdeProfilerComponents
-import com.android.tools.profilers.sessions.SessionsView.Companion.getImportAction
 import com.android.tools.profilers.StudioProfilers
 import com.android.tools.profilers.sessions.SessionArtifact
+import com.android.tools.profilers.sessions.SessionsView.Companion.getImportAction
 import com.android.tools.profilers.taskbased.common.constants.TaskBasedUxDimensions.RECORDING_LIST_ACTIONS_BAR_CONTENT_PADDING_DP
+import com.android.tools.profilers.taskbased.common.constants.TaskBasedUxIcons.DELETE_RECORDING_ICON
 import com.android.tools.profilers.taskbased.common.constants.TaskBasedUxIcons.DISABLED_ICON_ALPHA
 import com.android.tools.profilers.taskbased.common.constants.TaskBasedUxIcons.ENABLED_ICON_ALPHA
 import com.android.tools.profilers.taskbased.common.constants.TaskBasedUxIcons.EXPORT_RECORDING_ICON
 import com.android.tools.profilers.taskbased.common.constants.TaskBasedUxIcons.IMPORT_RECORDING_ICON
+import com.android.tools.profilers.taskbased.common.constants.TaskBasedUxStrings.DELETE_RECORDING_DESC
+import com.android.tools.profilers.taskbased.common.constants.TaskBasedUxStrings.DELETE_RECORDING_DISABLED_TOOLTIP
 import com.android.tools.profilers.taskbased.common.constants.TaskBasedUxStrings.EXPORT_RECORDING_DESC
 import com.android.tools.profilers.taskbased.common.constants.TaskBasedUxStrings.EXPORT_RECORDING_DISABLED_TOOLTIP
 import com.android.tools.profilers.taskbased.common.constants.TaskBasedUxStrings.IMPORT_RECORDING_DESC
+import com.intellij.openapi.ui.Messages
 import org.jetbrains.jewel.ui.component.Icon
 import org.jetbrains.jewel.ui.component.IconButton
 import org.jetbrains.jewel.ui.component.Text
@@ -45,6 +49,8 @@
 @Composable
 fun RecordingListActionsBar(artifact: SessionArtifact<*>?,
                             isRecordingExportable: Boolean,
+                            isRecordingSelected: Boolean,
+                            doDeleteSelectedRecording: () -> Unit,
                             profilers: StudioProfilers,
                             ideProfilerComponents: IdeProfilerComponents) {
   Row {
@@ -81,5 +87,27 @@
         }
       }
     )
+
+    Tooltip(
+      tooltip = { Text(if (isRecordingSelected) DELETE_RECORDING_DESC else DELETE_RECORDING_DISABLED_TOOLTIP) },
+      content = {
+        IconButton(enabled = isRecordingSelected, modifier = Modifier.testTag("DeleteRecordingButton"), onClick = {
+          if (ideProfilerComponents.createUiMessageHandler().displayOkCancelMessage("Confirm Deletion",
+                                                                                    "Do you really want to delete this recording?", "OK",
+                                                                                    "Cancel", Messages.getQuestionIcon(), null)) {
+            doDeleteSelectedRecording()
+          }
+        }) {
+          Icon(
+            resource = DELETE_RECORDING_ICON.path,
+            contentDescription = DELETE_RECORDING_DESC,
+            iconClass = DELETE_RECORDING_ICON.iconClass,
+            modifier = Modifier.padding(RECORDING_LIST_ACTIONS_BAR_CONTENT_PADDING_DP).alpha(
+              if (isRecordingSelected) ENABLED_ICON_ALPHA else DISABLED_ICON_ALPHA
+            ),
+          )
+        }
+      }
+    )
   }
 }
\ No newline at end of file
diff --git a/profilers-ui/testSrc/com/android/tools/profilers/taskbased/tabs/pastrecordings/recordinglist/RecordingListTest.kt b/profilers-ui/testSrc/com/android/tools/profilers/taskbased/tabs/pastrecordings/recordinglist/RecordingListTest.kt
index 756f676..ea158d7 100644
--- a/profilers-ui/testSrc/com/android/tools/profilers/taskbased/tabs/pastrecordings/recordinglist/RecordingListTest.kt
+++ b/profilers-ui/testSrc/com/android/tools/profilers/taskbased/tabs/pastrecordings/recordinglist/RecordingListTest.kt
@@ -18,6 +18,7 @@
 import androidx.compose.ui.test.assertCountEquals
 import androidx.compose.ui.test.assertHasClickAction
 import androidx.compose.ui.test.assertIsEnabled
+import androidx.compose.ui.test.assertIsNotDisplayed
 import androidx.compose.ui.test.assertIsNotEnabled
 import androidx.compose.ui.test.junit4.createComposeRule
 import androidx.compose.ui.test.onAllNodesWithTag
@@ -28,17 +29,22 @@
 import com.android.tools.adtui.model.FakeTimer
 import com.android.tools.idea.transport.faketransport.FakeGrpcChannel
 import com.android.tools.idea.transport.faketransport.FakeTransportService
+import com.android.tools.profiler.proto.Common
 import com.android.tools.profilers.FakeIdeProfilerComponents
 import com.android.tools.profilers.FakeIdeProfilerServices
 import com.android.tools.profilers.ProfilerClient
 import com.android.tools.profilers.SessionArtifactUtils.createSessionItemWithSystemTraceArtifact
 import com.android.tools.profilers.StudioProfilers
+import com.android.tools.profilers.Utils
 import com.android.tools.profilers.com.android.tools.profilers.JewelThemedComposableWrapper
 import com.android.tools.profilers.event.FakeEventService
 import com.android.tools.profilers.sessions.SessionsManager
 import com.android.tools.profilers.taskbased.home.selections.recordings.RecordingListModel
+import com.android.tools.profilers.taskbased.selections.recordings.RecordingListModelTest
 import com.android.tools.profilers.taskbased.tabs.pastrecordings.recordinglist.RecordingList
+import com.android.tools.profilers.tasks.ProfilerTaskType
 import com.android.tools.profilers.tasks.taskhandlers.ProfilerTaskHandlerFactory
+import com.android.tools.profilers.tasks.taskhandlers.singleartifact.cpu.SystemTraceTaskHandler
 import com.google.common.truth.Truth.assertThat
 import org.junit.Before
 import org.junit.Ignore
@@ -134,4 +140,63 @@
     // Assert export button is enabled as a selection of an exportable artifact is made.
     composeTestRule.onNodeWithTag("ExportRecordingButton").assertIsEnabled()
   }
+
+  @Test
+  fun `test selection of deletable recording enables delete recording button click action`() {
+    composeTestRule.setContent {
+      JewelThemedComposableWrapper(isDark = true) {
+        RecordingList(recordingListModel, myComponents)
+      }
+    }
+
+    // Non-null session item is deletable.
+    recordingListModel.setRecordingList(listOf(createSessionItemWithSystemTraceArtifact("Recording 1", 1L, 1L, myProfilers)))
+
+    // Assert both the data model and the UI reflect the past recording entry.
+    assertThat(recordingListModel.recordingList.value).hasSize(1)
+    composeTestRule.onAllNodesWithTag("RecordingListRow").assertCountEquals(1)
+
+    // Assert delete button is disabled as no selection is made.
+    assertThat(recordingListModel.selectedRecording.value).isEqualTo(null)
+    composeTestRule.onNodeWithTag("DeleteRecordingButton").assertIsNotEnabled()
+
+    // Select the recording.
+    composeTestRule.onAllNodesWithTag("RecordingListRow")[0].assertHasClickAction()
+    composeTestRule.onAllNodesWithTag("RecordingListRow")[0].performClick()
+
+    // Assert delete button is enabled as a selection of a deletable recording is made.
+    composeTestRule.onNodeWithTag("DeleteRecordingButton").assertIsEnabled()
+  }
+
+  @Test
+  fun `test deletion of selected recording updates rendered list`() {
+    composeTestRule.setContent {
+      JewelThemedComposableWrapper(isDark = true) {
+        RecordingList(recordingListModel, myComponents)
+      }
+    }
+
+    // Create a finished session/recording. To invoke the delete session functionality, a real session must be started and finished.
+    myProfilers.addTaskHandler(ProfilerTaskType.SYSTEM_TRACE, SystemTraceTaskHandler(myManager, false))
+    val device = Common.Device.newBuilder().setDeviceId(1).setState(Common.Device.State.ONLINE).build()
+    val process = Utils.debuggableProcess { pid = 10; deviceId = 1 }
+    RecordingListModelTest.startAndStopSession(device, process, Common.ProfilerTaskType.SYSTEM_TRACE, myManager)
+
+    // Assert both the data model and the UI reflect the past recording entry.
+    assertThat(recordingListModel.recordingList.value).hasSize(1)
+    composeTestRule.onAllNodesWithTag("RecordingListRow").assertCountEquals(1)
+
+    // Select Recording 1.
+    composeTestRule.onAllNodesWithTag("RecordingListRow")[0].assertHasClickAction()
+    composeTestRule.onAllNodesWithTag("RecordingListRow")[0].performClick()
+
+    // Invoke delete button is enabled as a selection of a deletable recording is made.
+    composeTestRule.onNodeWithTag("DeleteRecordingButton").assertIsEnabled().assertHasClickAction()
+    composeTestRule.onNodeWithTag("DeleteRecordingButton").performClick()
+
+    // Assert both the data model and the UI reflect the deletion of Recording 1.
+    assertThat(recordingListModel.recordingList.value).hasSize(0)
+    composeTestRule.onAllNodesWithTag("RecordingListRow").assertCountEquals(1)
+    composeTestRule.onNodeWithTag("RecordingListRow").assertIsNotDisplayed()
+  }
 }
diff --git a/profilers/src/com/android/tools/profilers/sessions/SessionsManager.java b/profilers/src/com/android/tools/profilers/sessions/SessionsManager.java
index 37594c0..f299c9b 100644
--- a/profilers/src/com/android/tools/profilers/sessions/SessionsManager.java
+++ b/profilers/src/com/android/tools/profilers/sessions/SessionsManager.java
@@ -580,7 +580,8 @@
     }
 
     // When deleting a currently selected session, set the session back to default so the profilers will go to the null stage.
-    if (sessionIsSelectedSession) {
+    // In the Task-Based UX, however, the selected session/task remains selected even if it is deleted.
+    if (sessionIsSelectedSession && !myProfilers.getIdeServices().getFeatureConfig().isTaskBasedUxEnabled()) {
       setSessionInternal(Common.Session.getDefaultInstance());
     }
 
diff --git a/profilers/src/com/android/tools/profilers/taskbased/home/selections/recordings/RecordingListModel.kt b/profilers/src/com/android/tools/profilers/taskbased/home/selections/recordings/RecordingListModel.kt
index 6cac97c..f5a5745 100644
--- a/profilers/src/com/android/tools/profilers/taskbased/home/selections/recordings/RecordingListModel.kt
+++ b/profilers/src/com/android/tools/profilers/taskbased/home/selections/recordings/RecordingListModel.kt
@@ -47,18 +47,31 @@
       .onChange(SessionAspect.SESSIONS) { sessionItemsUpdated() }
   }
 
-  val exportableArtifact get() = if (isSelectedRecordingExportable()) selectedRecording.value!!.getChildArtifacts().first() else null
-
   fun onRecordingSelection(newRecording: SessionItem?) {
     resetTaskSelection()
     _selectedRecording.value = newRecording
     updateTaskSelection()
   }
 
-  fun isSelectedRecordingExportable() = selectedRecording.value.let {
+  fun isSelectedRecordingExportable() = _selectedRecording.value.let {
     it != null && it.containsExactlyOneArtifact() && (it.getChildArtifacts().firstOrNull()?.canExport ?: false)
   }
 
+  val exportableArtifact get() = if (isSelectedRecordingExportable()) selectedRecording.value!!.getChildArtifacts().first() else null
+
+  fun isRecordingSelected() = _selectedRecording.value != null
+
+  fun doDeleteSelectedRecording() {
+    assert(isRecordingSelected())
+    _selectedRecording.value!!.deleteSession()
+    resetTaskSelection()
+    resetRecordingSelection()
+  }
+
+  private fun resetRecordingSelection() {
+    _selectedRecording.value = null
+  }
+
   /**
    * Constructs and returns a comma separated string of tasks that can be launched from a given recording.
    */
diff --git a/profilers/testSrc/com/android/tools/profilers/sessions/SessionsManagerTest.kt b/profilers/testSrc/com/android/tools/profilers/sessions/SessionsManagerTest.kt
index 9a62c07..ee0acbf 100644
--- a/profilers/testSrc/com/android/tools/profilers/sessions/SessionsManagerTest.kt
+++ b/profilers/testSrc/com/android/tools/profilers/sessions/SessionsManagerTest.kt
@@ -788,6 +788,40 @@
   }
 
   @Test
+  fun testDeleteSelectedSessionInTaskBasedUX() {
+    ideProfilerServices.enableTaskBasedUx(true)
+    myProfilers.addTaskHandler(ProfilerTaskType.SYSTEM_TRACE, SystemTraceTaskHandler(myManager, false))
+    val device = Common.Device.newBuilder().setDeviceId(1).setState(Common.Device.State.ONLINE).build()
+    val process = debuggableProcess { pid = 10; deviceId = 1 }
+    myTransportService.addDevice(device)
+    myTransportService.addProcess(device, process)
+    myTimer.tick(FakeTimer.ONE_SECOND_IN_NS)
+    myProfilers.setProcess(device, process, Common.ProfilerTaskType.SYSTEM_TRACE, false)
+    myManager.update()
+    myTimer.tick(FakeTimer.ONE_SECOND_IN_NS)
+
+    // Create a finished session and a ongoing profiling session.
+    endSessionHelper()
+    myManager.update()
+    myTimer.tick(FakeTimer.ONE_SECOND_IN_NS)
+
+    val session = myManager.selectedSession
+    assertThat(myManager.selectedSession).isEqualTo(session)
+    assertThat(myManager.isSessionAlive).isFalse()
+    assertThat(myProfilers.device).isEqualTo(device)
+    assertThat(myProfilers.process).isEqualTo(process)
+
+    myManager.deleteSession(session)
+    myManager.update()
+    // Although deleted, the session remains selected.
+    assertThat(myManager.selectedSession).isEqualTo(session)
+    assertThat(myManager.isSessionAlive).isFalse()
+    assertThat(myProfilers.device).isEqualTo(device)
+    assertThat(myProfilers.process).isEqualTo(process)
+    assertThat(myManager.sessionArtifacts.size).isEqualTo(0)
+  }
+
+  @Test
   fun `new ongoing FULL session with non-UNSPECIFIED task type is auto-selected as profiling and selected session in task-based ux`() {
     ideProfilerServices.enableTaskBasedUx(true)
     myProfilers.addTaskHandler(ProfilerTaskType.SYSTEM_TRACE, SystemTraceTaskHandler(myManager, false))
diff --git a/profilers/testSrc/com/android/tools/profilers/taskbased/pastrecordings/PastRecordingsTabModelTest.kt b/profilers/testSrc/com/android/tools/profilers/taskbased/pastrecordings/PastRecordingsTabModelTest.kt
index bc671dd..49dd0ea 100644
--- a/profilers/testSrc/com/android/tools/profilers/taskbased/pastrecordings/PastRecordingsTabModelTest.kt
+++ b/profilers/testSrc/com/android/tools/profilers/taskbased/pastrecordings/PastRecordingsTabModelTest.kt
@@ -24,9 +24,12 @@
 import com.android.tools.profilers.ProfilerClient
 import com.android.tools.profilers.SessionArtifactUtils
 import com.android.tools.profilers.StudioProfilers
+import com.android.tools.profilers.Utils
 import com.android.tools.profilers.event.FakeEventService
 import com.android.tools.profilers.sessions.SessionsManager
+import com.android.tools.profilers.taskbased.selections.recordings.RecordingListModelTest
 import com.android.tools.profilers.tasks.ProfilerTaskType
+import com.android.tools.profilers.tasks.taskhandlers.singleartifact.cpu.SystemTraceTaskHandler
 import com.android.tools.profilers.tasks.taskhandlers.ProfilerTaskHandlerFactory
 import com.google.common.truth.Truth
 import org.junit.Before
@@ -131,4 +134,27 @@
     // ART-based recordings have multiple supported tasks.
     Truth.assertThat(pastRecordingsTabModel.selectedTaskType).isEqualTo(ProfilerTaskType.UNSPECIFIED)
   }
+
+  @Test
+  fun `test task type and recording selection resets after recording deletion`() {
+    pastRecordingsTabModel.taskGridModel.onTaskSelection(ProfilerTaskType.SYSTEM_TRACE)
+    Truth.assertThat(pastRecordingsTabModel.selectedTaskType).isEqualTo(ProfilerTaskType.SYSTEM_TRACE)
+
+    myProfilers.addTaskHandler(ProfilerTaskType.SYSTEM_TRACE, SystemTraceTaskHandler(myManager, false))
+    val device = Common.Device.newBuilder().setDeviceId(1).setState(Common.Device.State.ONLINE).build()
+    val process = Utils.debuggableProcess { pid = 10; deviceId = 1 }
+    RecordingListModelTest.startAndStopSession(device, process, Common.ProfilerTaskType.SYSTEM_TRACE, myManager)
+    val recordingListModel = pastRecordingsTabModel.recordingListModel
+    // Select the recording.
+    val recording = recordingListModel.recordingList.value.first()
+    recordingListModel.onRecordingSelection(recording)
+    Truth.assertThat(recordingListModel.selectedRecording.value).isEqualTo(recording)
+
+    // Perform deletion of selected recording.
+    recordingListModel.doDeleteSelectedRecording()
+
+    // Make sure task type and recording selection have been reset.
+    Truth.assertThat(recordingListModel.selectedRecording.value).isEqualTo(null)
+    Truth.assertThat(pastRecordingsTabModel.selectedTaskType).isEqualTo(ProfilerTaskType.UNSPECIFIED)
+  }
 }
\ No newline at end of file
diff --git a/profilers/testSrc/com/android/tools/profilers/taskbased/selections/recordings/RecordingListModelTest.kt b/profilers/testSrc/com/android/tools/profilers/taskbased/selections/recordings/RecordingListModelTest.kt
index a3f9caa..110a390 100644
--- a/profilers/testSrc/com/android/tools/profilers/taskbased/selections/recordings/RecordingListModelTest.kt
+++ b/profilers/testSrc/com/android/tools/profilers/taskbased/selections/recordings/RecordingListModelTest.kt
@@ -81,7 +81,7 @@
     val session1Timestamp = 1L
     val session2Timestamp = 2L
     myTimer.currentTimeNs = session1Timestamp
-    startAndStopSession(device, process1, Common.ProfilerTaskType.SYSTEM_TRACE)
+    startAndStopSession(device, process1, Common.ProfilerTaskType.SYSTEM_TRACE, myManager)
     val session1 = myManager.selectedSession
     val heapDumpTimestamp = 10L
     val heapDumpInfo = Memory.HeapDumpInfo.newBuilder().setStartTime(heapDumpTimestamp).setEndTime(heapDumpTimestamp + 1).build()
@@ -96,7 +96,7 @@
     assertThat(recordingList[0].getChildArtifacts()[0]).isInstanceOf(HprofSessionArtifact::class.java)
 
     myTimer.currentTimeNs = session2Timestamp
-    startAndStopSession(device, process2, Common.ProfilerTaskType.NATIVE_ALLOCATIONS)
+    startAndStopSession(device, process2, Common.ProfilerTaskType.NATIVE_ALLOCATIONS, myManager)
     val session2 = myManager.selectedSession
     val cpuTraceTimestamp = 20L
     val cpuTraceInfo = Trace.TraceInfo.newBuilder().setFromTimestamp(cpuTraceTimestamp).setToTimestamp(
@@ -283,7 +283,7 @@
     val sessionTimestamp = 1L
     myTimer.currentTimeNs = sessionTimestamp
     // Start a session but do not end it, simulating an ongoing task.
-    startSession(device, process, Common.ProfilerTaskType.SYSTEM_TRACE)
+    startSession(device, process, Common.ProfilerTaskType.SYSTEM_TRACE, myManager)
     val session1 = myManager.selectedSession
     val heapDumpInfo = Memory.HeapDumpInfo.newBuilder().setStartTime(10L).setEndTime(Long.MAX_VALUE).build()
     val heapDumpEvent = ProfilersTestData.generateMemoryHeapDumpData(sessionTimestamp, sessionTimestamp, heapDumpInfo)
@@ -295,14 +295,68 @@
     assertThat(recordingList.size).isEqualTo(0)
   }
 
-  private fun startAndStopSession(device: Common.Device, process: Common.Process, taskType: Common.ProfilerTaskType) {
-    startSession(device, process, taskType)
-    myManager.endCurrentSession()
-    myManager.update()
+  @Test
+  fun `session item with no child artifacts is deletable`() {
+    val sessionId = 1L
+    val session = Common.Session.newBuilder().setSessionId(sessionId).build()
+    val sessionItem = SessionArtifactUtils.createSessionItem(myProfilers, session, sessionId, listOf())
+    recordingListModel.onRecordingSelection(sessionItem)
+    assertThat(recordingListModel.isRecordingSelected()).isTrue()
   }
 
-  private fun startSession(device: Common.Device, process: Common.Process, taskType: Common.ProfilerTaskType) {
-    myManager.beginSession(1, device, process, taskType, false)
-    myManager.update()
+  @Test
+  fun `session item with a child artifact is deletable`() {
+    val sessionId = 1L
+    val session = Common.Session.newBuilder().setSessionId(sessionId).build()
+    val javaKotlinAllocationsArtifact = SessionArtifactUtils.createAllocationSessionArtifact(myProfilers, session, 0L, 1L)
+    val sessionItem = SessionArtifactUtils.createSessionItem(myProfilers, session, sessionId, listOf(javaKotlinAllocationsArtifact))
+    recordingListModel.onRecordingSelection(sessionItem)
+    assertThat(recordingListModel.isRecordingSelected()).isTrue()
+  }
+
+  @Test
+  fun `deleting past recording updates recording list`() {
+    val device = Common.Device.newBuilder().setDeviceId(1).setState(Common.Device.State.ONLINE).build()
+    val process = Common.Process.newBuilder().setPid(10).setState(Common.Process.State.ALIVE).build()
+
+    // Check the recording list to make sure the recordings/SessionItems are empty.
+    var recordingList = recordingListModel.recordingList.value.toList()
+    assertThat(recordingList.isEmpty()).isTrue()
+
+    val sessionTimestamp = 1L
+    myTimer.currentTimeNs = sessionTimestamp
+    // Start and end a session, simulating a finished task recording.
+    startAndStopSession(device, process, Common.ProfilerTaskType.SYSTEM_TRACE, myManager)
+
+    // Because the session/task is still ongoing, it should be filtered out of the recording list.
+    recordingList = recordingListModel.recordingList.value.toList()
+    assertThat(recordingList.size).isEqualTo(1)
+
+    // Select and delete the recording.
+    recordingListModel.onRecordingSelection(recordingList.first())
+    recordingListModel.doDeleteSelectedRecording()
+
+    // Make sure the recording list has updated.
+    recordingList = recordingListModel.recordingList.value.toList()
+    assertThat(recordingList).isEmpty()
+  }
+
+  companion object {
+    fun startAndStopSession(device: Common.Device,
+                            process: Common.Process,
+                            taskType: Common.ProfilerTaskType,
+                            sessionsManager: SessionsManager) {
+      startSession(device, process, taskType, sessionsManager)
+      sessionsManager.endCurrentSession()
+      sessionsManager.update()
+    }
+
+    private fun startSession(device: Common.Device,
+                             process: Common.Process,
+                             taskType: Common.ProfilerTaskType,
+                             sessionsManager: SessionsManager) {
+      sessionsManager.beginSession(1, device, process, taskType, false)
+      sessionsManager.update()
+    }
   }
 }
\ No newline at end of file
diff --git a/project-system-gradle-models/src/com/android/tools/idea/gradle/model/IdeAndroidGradlePluginProjectFlags.kt b/project-system-gradle-models/src/com/android/tools/idea/gradle/model/IdeAndroidGradlePluginProjectFlags.kt
index 2661c22..27aea24 100644
--- a/project-system-gradle-models/src/com/android/tools/idea/gradle/model/IdeAndroidGradlePluginProjectFlags.kt
+++ b/project-system-gradle-models/src/com/android/tools/idea/gradle/model/IdeAndroidGradlePluginProjectFlags.kt
@@ -47,6 +47,8 @@
   /** Whether the ML model binding feature is enabled for this project. */
   val mlModelBindingEnabled: Boolean
 
+  val androidResourcesEnabled: Boolean
+
   /** Whether the Android Test Platform is enabled for this project. */
   val unifiedTestPlatformEnabled: Boolean
 
diff --git a/project-system-gradle-models/src/com/android/tools/idea/gradle/model/IdeBuildType.kt b/project-system-gradle-models/src/com/android/tools/idea/gradle/model/IdeBuildType.kt
index 54b0d1c..3ac7c44 100644
--- a/project-system-gradle-models/src/com/android/tools/idea/gradle/model/IdeBuildType.kt
+++ b/project-system-gradle-models/src/com/android/tools/idea/gradle/model/IdeBuildType.kt
@@ -22,6 +22,9 @@
   /** Whether the build type is configured to generate an apk with debuggable native code. */
   val isJniDebuggable: Boolean
 
+  /** Whether the build type is configured to be build with support for pseudolocales. */
+  val isPseudoLocalesEnabled: Boolean
+
   /** Whether the build type is configured to generate an apk with debuggable renderscript code. */
   val isRenderscriptDebuggable: Boolean
 
diff --git a/project-system-gradle-models/src/com/android/tools/idea/gradle/model/IdeSyncIssue.kt b/project-system-gradle-models/src/com/android/tools/idea/gradle/model/IdeSyncIssue.kt
index bc44519..f763aa2 100644
--- a/project-system-gradle-models/src/com/android/tools/idea/gradle/model/IdeSyncIssue.kt
+++ b/project-system-gradle-models/src/com/android/tools/idea/gradle/model/IdeSyncIssue.kt
@@ -289,13 +289,17 @@
      * Using an empty flavor dimension.
      */
     const val TYPE_EMPTY_FLAVOR_DIMENSION = 52
-    // NOTE: When adding a new type here, increment the index by 1. This index may not be consistent
-    // with the corresponding value in studio_stats.proto (e.g., it could be lower by 1), because of
-    // an indexing issue in the past (see http://issuetracker.google.com/138278313).
 
     /**
      * A sync issue type for exceptions that were converted to a sync issue.
      */
     const val TYPE_EXCEPTION = 53
+
+    /** Indicates that the namespace is missing  */
+    const val TYPE_NAMESPACE_NOT_SET = 54
+
+    // NOTE: When adding a new type here, increment the index by 1. This index may not be consistent
+    // with the corresponding value in studio_stats.proto (e.g., it could be lower by 1), because of
+    // an indexing issue in the past (see http://issuetracker.google.com/138278313).
   }
 }
diff --git a/project-system-gradle-models/src/com/android/tools/idea/gradle/model/impl/IdeAndroidGradlePluginProjectFlagsImpl.kt b/project-system-gradle-models/src/com/android/tools/idea/gradle/model/impl/IdeAndroidGradlePluginProjectFlagsImpl.kt
index 6aa1d7d..fa2a6cd 100644
--- a/project-system-gradle-models/src/com/android/tools/idea/gradle/model/impl/IdeAndroidGradlePluginProjectFlagsImpl.kt
+++ b/project-system-gradle-models/src/com/android/tools/idea/gradle/model/impl/IdeAndroidGradlePluginProjectFlagsImpl.kt
@@ -55,6 +55,8 @@
   /** Whether the ML model binding feature is enabled for this project. */
   override val mlModelBindingEnabled: Boolean,
 
+  override val androidResourcesEnabled: Boolean,
+
   /** Whether the Android Test Platform is enabled for this project. */
   override val unifiedTestPlatformEnabled: Boolean,
 
diff --git a/project-system-gradle-models/src/com/android/tools/idea/gradle/model/impl/IdeBuildTypeImpl.kt b/project-system-gradle-models/src/com/android/tools/idea/gradle/model/impl/IdeBuildTypeImpl.kt
index 8e00d03..7f4744b 100644
--- a/project-system-gradle-models/src/com/android/tools/idea/gradle/model/impl/IdeBuildTypeImpl.kt
+++ b/project-system-gradle-models/src/com/android/tools/idea/gradle/model/impl/IdeBuildTypeImpl.kt
@@ -30,6 +30,7 @@
   override val multiDexEnabled: Boolean?,
   override val isDebuggable: Boolean,
   override val isJniDebuggable: Boolean,
+  override val isPseudoLocalesEnabled: Boolean,
   override val isRenderscriptDebuggable: Boolean,
   override val renderscriptOptimLevel: Int,
   override val isMinifyEnabled: Boolean,
diff --git a/project-system-gradle-sync/src/com/android/tools/idea/gradle/project/sync/AdditionalClassifierArtifactsModelCollector.kt b/project-system-gradle-sync/src/com/android/tools/idea/gradle/project/sync/AdditionalClassifierArtifactsModelCollector.kt
index 888a453..bd61ff2 100644
--- a/project-system-gradle-sync/src/com/android/tools/idea/gradle/project/sync/AdditionalClassifierArtifactsModelCollector.kt
+++ b/project-system-gradle-sync/src/com/android/tools/idea/gradle/project/sync/AdditionalClassifierArtifactsModelCollector.kt
@@ -35,11 +35,11 @@
   actionRunner.runActions(
     inputModules.map { module ->
       ActionToRun(fun(controller: BuildController) {
-        if (module.agpVersion?.isAtLeast(3, 5, 0) != true) return
+        if (!module.modelVersions.agp.isAtLeast(3, 5, 0)) return
         // In later versions of AGP the information contained within the AdditionalClassifierArtifactsModel has been moved
         // to the individual libraries.
         val agp810a08 = AgpVersion.parse("8.1.0-alpha08")
-        if (module.agpVersion >= agp810a08 && useMultiVariantAdditionalArtifactSupport) return
+        if (module.modelVersions.agp >= agp810a08 && useMultiVariantAdditionalArtifactSupport) return
 
         // Collect the library identifiers to download sources and javadoc for, and filter out the cached ones and local jar/aars.
         val identifiers = module.getLibraryDependencies(libraryResolver).filter {
diff --git a/project-system-gradle-sync/src/com/android/tools/idea/gradle/project/sync/AgpCompatibility.kt b/project-system-gradle-sync/src/com/android/tools/idea/gradle/project/sync/AgpCompatibility.kt
index 9d6e268..4ffa5f1 100644
--- a/project-system-gradle-sync/src/com/android/tools/idea/gradle/project/sync/AgpCompatibility.kt
+++ b/project-system-gradle-sync/src/com/android/tools/idea/gradle/project/sync/AgpCompatibility.kt
@@ -27,28 +27,28 @@
 internal val MODEL_CONSUMER_VERSION = ModelConsumerVersion(67, 1, "Android Studio Jellyfish")
 
 
-internal fun checkAgpVersionCompatibility(minimumModelConsumerVersion: ModelConsumerVersion?, agpVersion: AgpVersion, syncOptions: SyncActionOptions) {
+internal fun checkAgpVersionCompatibility(modelVersions: ModelVersions, syncOptions: SyncActionOptions) {
   /**
    * For AGPs that support minimumModelConsumerVersion, use that to determine the maximum supported,
    * otherwise fall back to [computeAndroidGradlePluginCompatibility]
    */
-  if (minimumModelConsumerVersion != null && syncOptions.flags.studioFlagSupportFutureAgpVersions) {
+  if (modelVersions.minimumModelConsumer != null && syncOptions.flags.studioFlagSupportFutureAgpVersions) {
      return when {
       // TODO(b/272491108): Include the human readable minimum model consumer version (i.e the version of Studio to update to) in this error message
-      agpVersion < MINIMUM_SUPPORTED_AGP_VERSION -> throw AgpVersionTooOld(agpVersion)
-      (minimumModelConsumerVersion > MODEL_CONSUMER_VERSION) -> throw AgpVersionTooNew(agpVersion)
+      modelVersions.agp < MINIMUM_SUPPORTED_AGP_VERSION -> throw AgpVersionTooOld(modelVersions.agp)
+      (modelVersions.minimumModelConsumer > MODEL_CONSUMER_VERSION) -> throw AgpVersionTooNew(modelVersions.agp)
       else -> Unit // Compatible
     }
   }
 
-  return when (computeAndroidGradlePluginCompatibility(agpVersion, LATEST_KNOWN_ANDROID_GRADLE_PLUGIN_VERSION)) {
+  return when (computeAndroidGradlePluginCompatibility(modelVersions.agp, LATEST_KNOWN_ANDROID_GRADLE_PLUGIN_VERSION)) {
     // We want to report to the user that they are using an AGP version that is below the minimum supported version for Android Studio,
     // and this is regardless of whether we want to trigger the upgrade assistant or not. Sync should always fail here.
-    AndroidGradlePluginCompatibility.BEFORE_MINIMUM -> throw AgpVersionTooOld(agpVersion)
+    AndroidGradlePluginCompatibility.BEFORE_MINIMUM -> throw AgpVersionTooOld(modelVersions.agp)
     AndroidGradlePluginCompatibility.DIFFERENT_PREVIEW ->
-      if (!syncOptions.flags.studioFlagDisableForcedUpgrades) throw AgpVersionIncompatible(agpVersion) else Unit
+      if (!syncOptions.flags.studioFlagDisableForcedUpgrades) throw AgpVersionIncompatible(modelVersions.agp) else Unit
     AndroidGradlePluginCompatibility.AFTER_MAXIMUM ->
-      if (!syncOptions.flags.studioFlagDisableForcedUpgrades) throw AgpVersionTooNew(agpVersion) else Unit
+      if (!syncOptions.flags.studioFlagDisableForcedUpgrades) throw AgpVersionTooNew(modelVersions.agp) else Unit
     AndroidGradlePluginCompatibility.COMPATIBLE, AndroidGradlePluginCompatibility.DEPRECATED -> Unit
   }
 }
diff --git a/project-system-gradle-sync/src/com/android/tools/idea/gradle/project/sync/AndroidExtraModelProviderWorker.kt b/project-system-gradle-sync/src/com/android/tools/idea/gradle/project/sync/AndroidExtraModelProviderWorker.kt
index 507539c..08ba671 100644
--- a/project-system-gradle-sync/src/com/android/tools/idea/gradle/project/sync/AndroidExtraModelProviderWorker.kt
+++ b/project-system-gradle-sync/src/com/android/tools/idea/gradle/project/sync/AndroidExtraModelProviderWorker.kt
@@ -80,14 +80,14 @@
             val v2AndroidGradleModules = modules.filterIsInstance<BasicV2AndroidModuleGradleProject>()
 
             modules.filterIsInstance<BasicIncompleteAndroidModule>().forEach {
-              checkAgpVersionCompatibility(it.minimumModelConsumerVersion, it.agpVersion, syncOptions)
+              checkAgpVersionCompatibility(it.modelVersions, syncOptions)
             }
             verifyIncompatibleAgpVersionsAreNotUsedOrFailSync(modules)
 
             val gradleVersion = safeActionRunner.runAction { it.getModel(BuildEnvironment::class.java).gradle.gradleVersion }
             val v2ModelBuildersSupportParallelSync =
               v2AndroidGradleModules
-                .all { canUseParallelSync(AgpVersion.tryParse(it.versions.agp), gradleVersion) }
+                .all { canUseParallelSync(it.modelVersions, gradleVersion) }
 
             val configuredSyncActionRunner = safeActionRunner.enableParallelFetchForV2Models(
               v2ModelBuildersSupportParallelSync,
@@ -152,8 +152,8 @@
             // Request V2 models if flag is enabled.
             if (syncOptions.flags.studioFlagUseV2BuilderModels) {
               // First request the Versions model to make sure we can fetch V2 models.
-              val versions = controller.findNonParameterizedV2Model(gradleProject, Versions::class.java)
-              if (versions != null && canFetchV2Models(AgpVersion.tryParse(versions.agp))) {
+              val versions = controller.findNonParameterizedV2Model(gradleProject, Versions::class.java)?.convert()
+              if (versions != null && canFetchV2Models(versions)) {
                 // This means we can request V2.
                 return BasicV2AndroidModuleGradleProject(gradleProject, buildPath, versions, syncOptions)
               }
@@ -166,7 +166,7 @@
               return BasicV1AndroidModuleGradleProject(
                 gradleProject,
                 buildPath,
-                legacyV1AgpVersionModel
+                ModelVersions(agp = AgpVersion.parse(legacyV1AgpVersionModel.agp), minimumModelConsumer = null)
               )
 
             return BasicNonAndroidIncompleteGradleModule(gradleProject, buildPath) // Check here tha Version does not return anything.
@@ -182,14 +182,27 @@
 private fun verifyIncompatibleAgpVersionsAreNotUsedOrFailSync(modules: List<BasicIncompleteGradleModule>) {
   val agpVersionsAndGradleBuilds = modules
     .filterIsInstance<BasicIncompleteAndroidModule>()
-    .map { it.agpVersion to it.buildPath }
+    .map { it.modelVersions.agp to it.buildPath }
   // Fail Sync if we do not use the same AGP version across all the android projects.
   if (agpVersionsAndGradleBuilds.isNotEmpty() && agpVersionsAndGradleBuilds.map { it.first }.distinct().singleOrNull() == null)
     throw AgpVersionsMismatch(agpVersionsAndGradleBuilds)
 }
 
-private fun canFetchV2Models(gradlePluginVersion: AgpVersion?): Boolean {
-  return gradlePluginVersion != null && gradlePluginVersion.isAtLeast(7, 2, 0, "alpha", 1, true)
+private val MINIMUM_AGP_FOR_VERSIONS_MAP = AgpVersion.parse("7.3.0")
+
+private fun Versions.convert(): ModelVersions {
+  val agpVersion = AgpVersion.parse(agp)
+  return ModelVersions(
+    agp = agpVersion,
+    minimumModelConsumer = if (agpVersion < MINIMUM_AGP_FOR_VERSIONS_MAP) null else versions[Versions.MINIMUM_MODEL_CONSUMER]?.let { version ->
+      // Human-readable field was added before MINIMUM_MODEL_CONSUMER was reported, and is required for MINIMUM_MODEL_CONSUMER.
+      ModelConsumerVersion(version.major, version.minor, version.humanReadable ?: error("AGP that reports a MINIMUM_MODEL_CONSUMER version must have a human readable version"))
+    },
+  )
+}
+
+private fun canFetchV2Models(versions: ModelVersions): Boolean {
+  return versions.agp.isAtLeast(7, 2, 0, "alpha", 1, true)
 }
 
 /**
@@ -201,9 +214,8 @@
  * - using at least AGP 7.3.0-alpha-04.
  *  @returns true if we can fetch the V2 models in parallel, otherwise, returns false.
  */
-private fun canUseParallelSync(agpVersion: AgpVersion?, gradleVersion: String): Boolean {
+private fun canUseParallelSync(modelVersions: ModelVersions, gradleVersion: String): Boolean {
   return GradleVersion.version(gradleVersion) >= GradleVersion.version("7.4.2") &&
-         agpVersion != null &&
-         ((agpVersion >= AgpVersion(7, 2, 0) && agpVersion < "7.3.0-alpha01") ||
-          agpVersion.isAtLeast(7, 3, 0, "alpha", 4, true))
+         ((modelVersions.agp >= AgpVersion(7, 2, 0) && modelVersions.agp < "7.3.0-alpha01") ||
+          modelVersions.agp.isAtLeast(7, 3, 0, "alpha", 4, true))
 }
diff --git a/project-system-gradle-sync/src/com/android/tools/idea/gradle/project/sync/AndroidProjectResult.kt b/project-system-gradle-sync/src/com/android/tools/idea/gradle/project/sync/AndroidProjectResult.kt
index 0844391..29c108d 100644
--- a/project-system-gradle-sync/src/com/android/tools/idea/gradle/project/sync/AndroidProjectResult.kt
+++ b/project-system-gradle-sync/src/com/android/tools/idea/gradle/project/sync/AndroidProjectResult.kt
@@ -21,7 +21,6 @@
 import com.android.builder.model.v2.ide.Variant
 import com.android.builder.model.v2.models.AndroidDsl
 import com.android.builder.model.v2.models.BasicAndroidProject
-import com.android.builder.model.v2.models.Versions
 import com.android.ide.gradle.model.GradlePropertiesModel
 import com.android.ide.gradle.model.LegacyAndroidGradlePluginProperties
 import com.android.tools.idea.gradle.model.impl.IdeAndroidProjectImpl
@@ -34,7 +33,6 @@
   class V1Project(
     val modelCache: ModelCache.V1,
     override val legacyAndroidGradlePluginProperties: LegacyAndroidGradlePluginProperties?,
-    override val agpVersion: String,
     override val ideAndroidProject: IdeAndroidProjectImpl,
     override val allVariantNames: Set<String>,
     override val defaultVariantName: String?,
@@ -47,7 +45,7 @@
   class V2Project(
     val modelCache: ModelCache.V2,
     override val legacyAndroidGradlePluginProperties: LegacyAndroidGradlePluginProperties?,
-    override val agpVersion: String,
+    private val modelVersions: ModelVersions,
     override val ideAndroidProject: IdeAndroidProjectImpl,
     private val basicVariants: List<BasicVariant>,
     private val v2Variants: List<IdeVariantCoreImpl>,
@@ -70,7 +68,6 @@
       legacyAndroidGradlePluginProperties: LegacyAndroidGradlePluginProperties?,
       gradlePropertiesModel: GradlePropertiesModel,
     ): ModelResult<V1Project> {
-      val agpVersion: String = safeGet(androidProject::getModelVersion, "")
       val allVariantNames: Set<String> = safeGet(androidProject::getVariantNames, null).orEmpty().toSet()
       val defaultVariantName: String? = safeGet(androidProject::getDefaultVariant, null)
           ?: allVariantNames.getDefaultOrFirstItem("debug")
@@ -90,7 +87,6 @@
         V1Project(
           modelCache = modelCache,
           legacyAndroidGradlePluginProperties = legacyAndroidGradlePluginProperties,
-          agpVersion = agpVersion,
           ideAndroidProject = ideAndroidProject,
           allVariantNames = allVariantNames,
           defaultVariantName = defaultVariantName,
@@ -106,14 +102,13 @@
       buildId: BuildId,
       basicAndroidProject: BasicAndroidProject,
       androidProject: com.android.builder.model.v2.models.AndroidProject,
-      modelVersions: Versions,
+      modelVersions: ModelVersions,
       androidDsl: AndroidDsl,
       legacyAndroidGradlePluginProperties: LegacyAndroidGradlePluginProperties?,
       gradlePropertiesModel: GradlePropertiesModel,
       skipRuntimeClasspathForLibraries: Boolean,
       useNewDependencyGraphModel: Boolean,
     ): ModelResult<V2Project> {
-      val agpVersion: String = modelVersions.agp
       val basicVariants: List<BasicVariant> = basicAndroidProject.variants.toList()
       val defaultVariantName: String? =
           // Try to get the default variant based on default BuildTypes and productFlavors, otherwise get first one in the list.
@@ -154,7 +149,7 @@
         V2Project(
           modelCache = modelCache,
           legacyAndroidGradlePluginProperties = legacyAndroidGradlePluginProperties,
-          agpVersion = agpVersion,
+          modelVersions = modelVersions,
           ideAndroidProject = ideAndroidProject,
           basicVariants = basicVariants,
           v2Variants = v2Variants,
@@ -168,7 +163,6 @@
     }
   }
 
-  abstract val agpVersion: String
   abstract val ideAndroidProject: IdeAndroidProjectImpl
   abstract val allVariantNames: Set<String>
   abstract val defaultVariantName: String?
@@ -200,7 +194,7 @@
     val androidModuleId = module.gradleProject.toModuleId()
     val adjustedVariantName = module.adjustForTestFixturesSuffix(configuration.variant)
     val variant = controller.findVariantModel(module, adjustedVariantName) ?: return ModelResult.create { null }
-    return modelCache.variantFrom(module.androidProject, variant, legacyAndroidGradlePluginProperties, module.agpVersion, androidModuleId)
+    return modelCache.variantFrom(module.androidProject, variant, legacyAndroidGradlePluginProperties, module.modelVersions, androidModuleId)
   }
 }
 
diff --git a/project-system-gradle-sync/src/com/android/tools/idea/gradle/project/sync/BasicModules.kt b/project-system-gradle-sync/src/com/android/tools/idea/gradle/project/sync/BasicModules.kt
index 5a07e55..6d7b967 100644
--- a/project-system-gradle-sync/src/com/android/tools/idea/gradle/project/sync/BasicModules.kt
+++ b/project-system-gradle-sync/src/com/android/tools/idea/gradle/project/sync/BasicModules.kt
@@ -19,13 +19,11 @@
 import com.android.builder.model.NativeAndroidProject
 import com.android.builder.model.v2.models.AndroidDsl
 import com.android.builder.model.v2.models.BasicAndroidProject
-import com.android.builder.model.v2.models.Versions
 import com.android.builder.model.v2.models.ndk.NativeModule
 import com.android.ide.common.repository.AgpVersion
 import com.android.ide.gradle.model.GradlePropertiesModel
 import com.android.ide.gradle.model.LegacyAndroidGradlePluginProperties
 import com.android.ide.gradle.model.LegacyAndroidGradlePluginPropertiesModelParameters
-import com.android.ide.gradle.model.LegacyV1AgpVersionModel
 import com.android.tools.idea.gradle.project.sync.ModelResult.Companion.ignoreExceptionsAndGet
 import com.android.tools.idea.gradle.project.sync.ModelResult.Companion.mapCatching
 import org.gradle.tooling.BuildController
@@ -53,20 +51,22 @@
 }
 
 /** The information about the model consumer version required by AGP */
-internal data class ModelConsumerVersion(val major: Int, val minor: Int, val description: String) : Comparable<ModelConsumerVersion> {
+data class ModelConsumerVersion(val major: Int, val minor: Int, val description: String) : Comparable<ModelConsumerVersion> {
   override fun compareTo(other: ModelConsumerVersion): Int {
     return if (this.major != other.major) this.major.compareTo(other.major) else this.minor.compareTo(other.minor)
   }
 }
 
+data class ModelVersions(
+  val agp: AgpVersion,
+  val minimumModelConsumer: ModelConsumerVersion?
+)
+
 /**
  * The container class of Android modules.
  */
-internal sealed class BasicIncompleteAndroidModule(gradleProject: BasicGradleProject, buildPath: String)
+internal sealed class BasicIncompleteAndroidModule(gradleProject: BasicGradleProject, buildPath: String, val modelVersions: ModelVersions)
   :  BasicIncompleteGradleModule(gradleProject, buildPath) {
-  abstract val agpVersion: AgpVersion
-  abstract val minimumModelConsumerVersion: ModelConsumerVersion?
-
 }
 
 /**
@@ -77,10 +77,8 @@
 internal class BasicV1AndroidModuleGradleProject(
   gradleProject: BasicGradleProject,
   buildPath: String,
-  private val legacyV1AgpVersion: LegacyV1AgpVersionModel
-) :  BasicIncompleteAndroidModule(gradleProject, buildPath) {
-  override val agpVersion: AgpVersion = AgpVersion.parse(legacyV1AgpVersion.agp)
-  override val minimumModelConsumerVersion: ModelConsumerVersion? = null // Fall back to the computeAndroidGradlePluginCompatibility checks
+  modelVersions: ModelVersions,
+) :  BasicIncompleteAndroidModule(gradleProject, buildPath, modelVersions) {
 
   override fun getGradleModuleAction(
     internedModels: InternedModels,
@@ -96,7 +94,7 @@
 
         val legacyAndroidGradlePluginProperties = controller.findModel(gradleProject, LegacyAndroidGradlePluginProperties::class.java, LegacyAndroidGradlePluginPropertiesModelParameters::class.java) {
           it.componentToApplicationIdMap = true
-          it.namespace = agpVersion.major < 7
+          it.namespace = modelVersions.agp.major < 7
         }
         val gradlePropertiesModel = controller.findModel(gradleProject, GradlePropertiesModel::class.java)
           ?: error("Cannot get GradlePropertiesModel (V1) for project '$gradleProject'")
@@ -126,6 +124,7 @@
               else null
 
             createAndroidModuleV1(
+              modelVersions,
               gradleProject,
               androidProjectResult,
               nativeAndroidProject,
@@ -148,7 +147,6 @@
     )
   }
 }
-val MINIMUM_AGP_FOR_VERSIONS_MAP = AgpVersion.parse("7.3.0")
 
 /**
  * The container class of Android modules that can be fetched using V2 builder models.
@@ -156,16 +154,10 @@
 internal class BasicV2AndroidModuleGradleProject(
   gradleProject: BasicGradleProject,
   buildPath: String,
-  val versions: Versions,
+  modelVersions: ModelVersions,
   val syncActionOptions: SyncActionOptions,
-) : BasicIncompleteAndroidModule(gradleProject, buildPath) {
-  override val agpVersion: AgpVersion = AgpVersion.tryParse(versions.agp) ?: error("AGP returned incorrect version: ${versions.agp}")
-  override val minimumModelConsumerVersion: ModelConsumerVersion? =
-    if (agpVersion < MINIMUM_AGP_FOR_VERSIONS_MAP) null
-    else versions.versions[Versions.MINIMUM_MODEL_CONSUMER]?.let { version ->
-      // Human-readable field was added before MINIMUM_MODEL_CONSUMER was reported, and is required for MINIMUM_MODEL_CONSUMER.
-      ModelConsumerVersion(version.major, version.minor, version.humanReadable ?: error("AGP that reports a MINIMUM_MODEL_CONSUMER version must have a human readable version"))
-    }
+) : BasicIncompleteAndroidModule(gradleProject, buildPath, modelVersions) {
+
 
   override fun getGradleModuleAction(
     internedModels: InternedModels,
@@ -179,8 +171,7 @@
           ?: error("Cannot get V2AndroidProject model for $gradleProject")
         val androidDsl = controller.findNonParameterizedV2Model(gradleProject, AndroidDsl::class.java)
           ?: error("Cannot get AndroidDsl model for $gradleProject")
-        val agpVersion = agpVersion
-        val modelIncludesApplicationId = agpVersion.agpModelIncludesApplicationId
+        val modelIncludesApplicationId = modelVersions.agpModelIncludesApplicationId
         val legacyAndroidGradlePluginProperties = if (!modelIncludesApplicationId) {
           controller.findModel(gradleProject, LegacyAndroidGradlePluginProperties::class.java, LegacyAndroidGradlePluginPropertiesModelParameters::class.java) {
             it.componentToApplicationIdMap = !modelIncludesApplicationId
@@ -192,7 +183,7 @@
         val gradlePropertiesModel = controller.findModel(gradleProject, GradlePropertiesModel::class.java)
           ?: error("Cannot get GradlePropertiesModel (V2) for project '$gradleProject'")
 
-        val modelCache = modelCacheV2Impl(internedModels, agpVersion, syncActionOptions.syncTestMode,
+        val modelCache = modelCacheV2Impl(internedModels, modelVersions, syncActionOptions.syncTestMode,
                                           syncActionOptions.flags.studioFlagMultiVariantAdditionalArtifactSupport)
         val rootBuildId = buildInfo.buildPathMap[":"] ?: error("Root build (':') not found")
         val androidProjectResult =
@@ -202,13 +193,13 @@
             buildId = BuildId(gradleProject.projectIdentifier.buildIdentifier.rootDir),
             basicAndroidProject = basicAndroidProject,
             androidProject = androidProject,
-            modelVersions = versions,
+            modelVersions = modelVersions,
             androidDsl = androidDsl,
             legacyAndroidGradlePluginProperties = legacyAndroidGradlePluginProperties,
             gradlePropertiesModel = gradlePropertiesModel,
             skipRuntimeClasspathForLibraries = syncActionOptions.flags.studioFlagSkipRuntimeClasspathForLibraries,
             useNewDependencyGraphModel = syncActionOptions.flags.studioFlagUseNewDependencyGraphModel
-                                         && agpVersion.isAtLeast(8,2,0, "alpha", 3, false)
+                                         && modelVersions.agp.isAtLeast(8,2,0, "alpha", 3, false)
           )
 
         return androidProjectResult.mapCatching { androidProjectResult ->
@@ -216,6 +207,7 @@
           val nativeModule = controller.findNativeModuleModel(gradleProject, syncAllVariantsAndAbis = false)
 
           createAndroidModuleV2(
+            modelVersions,
             gradleProject,
             androidProjectResult,
             nativeModule,
@@ -260,6 +252,7 @@
 }
 
 private fun createAndroidModuleV1(
+  modelVersions: ModelVersions,
   gradleProject: BasicGradleProject,
   androidProjectResult: AndroidProjectResult.V1Project,
   nativeAndroidProject: NativeAndroidProject?,
@@ -267,8 +260,6 @@
   buildPathMap: Map<String, BuildId>,
   modelCache: ModelCache.V1
 ): AndroidModule {
-  val agpVersion: AgpVersion? = AgpVersion.tryParse(androidProjectResult.agpVersion)
-
   val ideAndroidProject = androidProjectResult.ideAndroidProject
   val allVariantNames = androidProjectResult.allVariantNames
   val defaultVariantName: String? = androidProjectResult.defaultVariantName
@@ -279,7 +270,7 @@
   val ideNativeModule = nativeModule?.let(modelCache::nativeModuleFrom)
 
   val androidModule = AndroidModule.V1(
-    agpVersion = agpVersion,
+    modelVersions = modelVersions,
     buildPathMap = buildPathMap,
     gradleProject = gradleProject,
     androidProject = ideAndroidProject,
@@ -301,13 +292,13 @@
 }
 
 private fun createAndroidModuleV2(
+  modelVersions: ModelVersions,
   gradleProject: BasicGradleProject,
   androidProjectResult: AndroidProjectResult.V2Project,
   nativeModule: NativeModule?,
   buildPathMap: Map<String, BuildId>,
   modelCache: ModelCache
 ): AndroidModule {
-  val agpVersion: AgpVersion? = AgpVersion.tryParse(androidProjectResult.agpVersion)
 
   val ideAndroidProject = androidProjectResult.ideAndroidProject
   val allVariantNames = androidProjectResult.allVariantNames
@@ -316,7 +307,7 @@
   val ideNativeModule = nativeModule?.let(modelCache::nativeModuleFrom)
 
   return AndroidModule.V2(
-    agpVersion = agpVersion,
+    modelVersions = modelVersions,
     buildPathMap = buildPathMap,
     gradleProject = gradleProject,
     androidProject = ideAndroidProject,
diff --git a/project-system-gradle-sync/src/com/android/tools/idea/gradle/project/sync/GradleModules.kt b/project-system-gradle-sync/src/com/android/tools/idea/gradle/project/sync/GradleModules.kt
index e15b0be..601a98f 100644
--- a/project-system-gradle-sync/src/com/android/tools/idea/gradle/project/sync/GradleModules.kt
+++ b/project-system-gradle-sync/src/com/android/tools/idea/gradle/project/sync/GradleModules.kt
@@ -93,7 +93,7 @@
  * The container class for Android module, containing its Android model, Variant models, and dependency modules.
  */
 sealed class AndroidModule constructor(
-  val agpVersion: AgpVersion?,
+  val modelVersions: ModelVersions,
   val buildPathMap: Map<String, BuildId>,
   gradleProject: BasicGradleProject,
   val androidProject: IdeAndroidProjectImpl,
@@ -142,7 +142,7 @@
   }
 
   class V1(
-    agpVersion: AgpVersion?,
+    modelVersions: ModelVersions,
     buildPathMap: Map<String, BuildId>,
     gradleProject: BasicGradleProject,
     androidProject: IdeAndroidProjectImpl,
@@ -156,7 +156,7 @@
     nativeModule: IdeNativeModule?,
     legacyAndroidGradlePluginProperties: LegacyAndroidGradlePluginProperties?,
   ) : AndroidModule(
-    agpVersion = agpVersion,
+    modelVersions = modelVersions,
     buildPathMap = buildPathMap,
     gradleProject = gradleProject,
     androidProject = androidProject,
@@ -189,7 +189,7 @@
   }
 
   class V2(
-    agpVersion: AgpVersion?,
+    modelVersions: ModelVersions,
     buildPathMap: Map<String, BuildId>,
     gradleProject: BasicGradleProject,
     androidProject: IdeAndroidProjectImpl,
@@ -200,7 +200,7 @@
     nativeModule: IdeNativeModule?,
     legacyAndroidGradlePluginProperties: LegacyAndroidGradlePluginProperties?,
   ) : AndroidModule(
-    agpVersion = agpVersion,
+    modelVersions = modelVersions,
     buildPathMap = buildPathMap,
     gradleProject = gradleProject,
     androidProject = androidProject,
diff --git a/project-system-gradle-sync/src/com/android/tools/idea/gradle/project/sync/IdeModelFactoryV2.kt b/project-system-gradle-sync/src/com/android/tools/idea/gradle/project/sync/IdeModelFactoryV2.kt
index 75b0d92..604c565 100644
--- a/project-system-gradle-sync/src/com/android/tools/idea/gradle/project/sync/IdeModelFactoryV2.kt
+++ b/project-system-gradle-sync/src/com/android/tools/idea/gradle/project/sync/IdeModelFactoryV2.kt
@@ -19,7 +19,6 @@
 import com.android.builder.model.v2.ide.ProjectInfo
 import com.android.ide.common.gradle.Component
 import com.android.ide.common.gradle.Version
-import com.android.ide.common.repository.AgpVersion
 import com.android.tools.idea.gradle.model.IdeModuleWellKnownSourceSet
 import com.android.tools.idea.gradle.model.IdeUnresolvedLibrary
 import com.android.tools.idea.gradle.model.impl.IdeAndroidLibraryImpl
@@ -31,7 +30,7 @@
 import java.io.File
 
 class IdeModelFactoryV2(
-  agpVersion: AgpVersion,
+  modelVersions: ModelVersions,
   multiVariantAdditionalArtifactSupport: Boolean,
 ) {
 
@@ -39,9 +38,9 @@
    * Sources, JavaDocs and Samples are only provided in libraries after AGP version 8.1.0-alpha8.
    * Any attempt to read these values from a version prior to this will result in an exception.
    */
-  val isAGPVersion8dot1dot0alpha8orLater = agpVersion.isAtLeast(8, 1, 0, "alpha", 8, false)
+  val isAGPVersion8dot1dot0alpha8orLater = modelVersions.agp.isAtLeast(8, 1, 0, "alpha", 8, false)
   val useAdditionalArtifactsFromLibraries = isAGPVersion8dot1dot0alpha8orLater && multiVariantAdditionalArtifactSupport
-  val supportsAbsoluteGradleBuildPaths = agpVersion.isAtLeast(8, 2, 0, "alpha", 13, false)
+  val supportsAbsoluteGradleBuildPaths = modelVersions.agp.isAtLeast(8, 2, 0, "alpha", 13, false)
 
   fun androidLibraryFrom(androidLibrary: Library, deduplicate: String.() -> String) : IdeAndroidLibraryImpl {
     fun File.deduplicateFile(): File = File(path.deduplicate())
diff --git a/project-system-gradle-sync/src/com/android/tools/idea/gradle/project/sync/ModelCache.kt b/project-system-gradle-sync/src/com/android/tools/idea/gradle/project/sync/ModelCache.kt
index 628551a..51befcf 100644
--- a/project-system-gradle-sync/src/com/android/tools/idea/gradle/project/sync/ModelCache.kt
+++ b/project-system-gradle-sync/src/com/android/tools/idea/gradle/project/sync/ModelCache.kt
@@ -67,7 +67,7 @@
       androidProject: IdeAndroidProjectImpl,
       variant: Variant,
       legacyAndroidGradlePluginProperties: LegacyAndroidGradlePluginProperties?,
-      modelVersion: AgpVersion?,
+      modelVersions: ModelVersions,
       androidModuleId: ModuleId
     ): ModelResult<IdeVariantWithPostProcessor>
 
@@ -117,7 +117,7 @@
       buildId: BuildId,
       basicProject: BasicAndroidProject,
       project: com.android.builder.model.v2.models.AndroidProject,
-      androidVersion: Versions,
+      androidVersion: ModelVersions,
       androidDsl: AndroidDsl,
       legacyAndroidGradlePluginProperties: LegacyAndroidGradlePluginProperties?,
       gradlePropertiesModel: GradlePropertiesModel,
@@ -137,7 +137,7 @@
       return if (useV2BuilderModels) {
         modelCacheV2Impl(
           internedModels,
-          AgpVersion.parse(Version.ANDROID_GRADLE_PLUGIN_VERSION),
+          ModelVersions(agp = AgpVersion.parse(Version.ANDROID_GRADLE_PLUGIN_VERSION), minimumModelConsumer = null),
           syncTestMode = SyncTestMode.PRODUCTION,
           false,
         )
@@ -203,8 +203,8 @@
   return sortedNames.first()
 }
 
-internal val AgpVersion.agpModelIncludesApplicationId: Boolean
-   get() = isAtLeast(7, 4, 0, "alpha", 4, false)
+internal val ModelVersions.agpModelIncludesApplicationId: Boolean
+   get() = agp.isAtLeast(7, 4, 0, "alpha", 4, false)
 
 internal fun convertArtifactName(name: String): IdeArtifactName = when (name) {
   ARTIFACT_NAME_MAIN -> IdeArtifactName.MAIN
diff --git a/project-system-gradle-sync/src/com/android/tools/idea/gradle/project/sync/ModelCacheV1Impl.kt b/project-system-gradle-sync/src/com/android/tools/idea/gradle/project/sync/ModelCacheV1Impl.kt
index da69f8f..d2135b3 100644
--- a/project-system-gradle-sync/src/com/android/tools/idea/gradle/project/sync/ModelCacheV1Impl.kt
+++ b/project-system-gradle-sync/src/com/android/tools/idea/gradle/project/sync/ModelCacheV1Impl.kt
@@ -291,6 +291,7 @@
       multiDexEnabled = copyNewProperty(buildType::multiDexEnabled),
       isDebuggable = buildType.isDebuggable,
       isJniDebuggable = buildType.isJniDebuggable,
+      isPseudoLocalesEnabled = buildType.isPseudoLocalesEnabled,
       isRenderscriptDebuggable = buildType.isRenderscriptDebuggable,
       renderscriptOptimLevel = buildType.renderscriptOptimLevel,
       isMinifyEnabled = buildType.isMinifyEnabled,
@@ -801,7 +802,7 @@
   fun androidArtifactFrom(
     artifact: AndroidArtifact,
     bootClasspath: Collection<String>,
-    agpVersion: AgpVersion?,
+    modelVersions: ModelVersions,
     variantName: String?,
     variantNameForDependencies: String?,
     androidModuleId: ModuleId?,
@@ -927,7 +928,7 @@
     androidProject: IdeAndroidProjectImpl,
     variant: Variant,
     legacyAndroidGradlePluginProperties: LegacyAndroidGradlePluginProperties?,
-    modelVersion: AgpVersion?,
+    modelVersions: ModelVersions,
     androidModuleId: ModuleId
   ): ModelResult<IdeVariantWithPostProcessor> {
     val mergedFlavor = copyModel(variant.mergedFlavor, ::productFlavorFrom)
@@ -947,7 +948,7 @@
       androidArtifactFrom(
         artifact = it,
         bootClasspath = androidProject.bootClasspath,
-        agpVersion = modelVersion,
+        modelVersions = modelVersions,
         variantName = variant.name,
         // For main artifacts, we shouldn't use the variant's name in module dependencies, but Test projects are an exception because
         // we only have one main artifact that is a test artifact, so we need to handle this as a special case.
@@ -973,7 +974,7 @@
       androidArtifactFrom(
         artifact = it,
         bootClasspath = androidProject.bootClasspath,
-        agpVersion = modelVersion,
+        modelVersions = modelVersions,
         variantName = variant.name,
         variantNameForDependencies = variant.name,
         androidModuleId = androidModuleId,
@@ -998,9 +999,7 @@
       versionCode = mergedFlavor.versionCode,
       versionNameWithSuffix = mergedFlavor.versionName?.let { it + versionNameSuffix.orEmpty() },
       versionNameSuffix = versionNameSuffix,
-      instantAppCompatible = (modelVersion != null &&
-        modelVersion.isAtLeast(3, 3, 0, "alpha", 10, true) &&
-        variant.isInstantAppCompatible),
+      instantAppCompatible = (modelVersions.agp.isAtLeast(3, 3, 0, "alpha", 10, true) && variant.isInstantAppCompatible),
       vectorDrawablesUseSupportLibrary = mergedFlavor.vectorDrawables?.useSupportLibrary ?: false,
       resourceConfigurations = mergedFlavor.resourceConfigurations,
       testInstrumentationRunner = mergedFlavor.testInstrumentationRunner,
@@ -1246,6 +1245,8 @@
       transitiveRClasses = booleanFlagMap.getBooleanFlag(AndroidGradlePluginProjectFlags.BooleanFlag.TRANSITIVE_R_CLASS),
       usesCompose = booleanFlagMap.getBooleanFlag(AndroidGradlePluginProjectFlags.BooleanFlag.JETPACK_COMPOSE),
       mlModelBindingEnabled = booleanFlagMap.getBooleanFlag(AndroidGradlePluginProjectFlags.BooleanFlag.ML_MODEL_BINDING),
+      /** Treated as enabled for AGP < 8.4. if we need to know the actual answer we could add it to LegacyAndroidGradlePluginPropertiesModelBuilder */
+      androidResourcesEnabled = true,
       unifiedTestPlatformEnabled = booleanFlagMap.getBooleanFlag(AndroidGradlePluginProjectFlags.BooleanFlag.UNIFIED_TEST_PLATFORM),
       useAndroidX = gradlePropertiesModel.useAndroidX ?: com.android.builder.model.v2.ide.AndroidGradlePluginProjectFlags.BooleanFlag.USE_ANDROID_X.legacyDefault
     )
@@ -1383,10 +1384,10 @@
       androidProject: IdeAndroidProjectImpl,
       variant: Variant,
       legacyAndroidGradlePluginProperties: LegacyAndroidGradlePluginProperties?,
-      modelVersion: AgpVersion?,
+      modelVersions: ModelVersions,
       androidModuleId: ModuleId
     ): ModelResult<IdeVariantWithPostProcessor> =
-      variantFrom(androidProject, variant, legacyAndroidGradlePluginProperties, modelVersion, androidModuleId)
+      variantFrom(androidProject, variant, legacyAndroidGradlePluginProperties, modelVersions, androidModuleId)
 
     override fun androidProjectFrom(
       rootBuildId: BuildId,
diff --git a/project-system-gradle-sync/src/com/android/tools/idea/gradle/project/sync/ModelCacheV2Impl.kt b/project-system-gradle-sync/src/com/android/tools/idea/gradle/project/sync/ModelCacheV2Impl.kt
index 7ca8501..d367f56 100644
--- a/project-system-gradle-sync/src/com/android/tools/idea/gradle/project/sync/ModelCacheV2Impl.kt
+++ b/project-system-gradle-sync/src/com/android/tools/idea/gradle/project/sync/ModelCacheV2Impl.kt
@@ -47,7 +47,6 @@
 import com.android.builder.model.v2.models.AndroidDsl
 import com.android.builder.model.v2.models.AndroidProject
 import com.android.builder.model.v2.models.BasicAndroidProject
-import com.android.builder.model.v2.models.Versions
 import com.android.builder.model.v2.models.ndk.NativeAbi
 import com.android.builder.model.v2.models.ndk.NativeBuildSystem
 import com.android.builder.model.v2.models.ndk.NativeModule
@@ -129,11 +128,11 @@
 //       cannot validate the structure at compile time.
 internal fun modelCacheV2Impl(
   internedModels: InternedModels,
-  agpVersion: AgpVersion,
+  modelVersions: ModelVersions,
   syncTestMode: SyncTestMode,
   multiVariantAdditionalArtifactSupport: Boolean,
 ): ModelCache.V2 {
-  val modelFactory = IdeModelFactoryV2(agpVersion, multiVariantAdditionalArtifactSupport)
+  val modelFactory = IdeModelFactoryV2(modelVersions, multiVariantAdditionalArtifactSupport)
   fun String.deduplicate() = internedModels.intern(this)
   fun List<String>.deduplicateStrings(): List<String> = this.map { it.deduplicate() }
   fun Map<String, String>.deduplicateStrings(): Map<String, String> = map { (k, v) -> k.deduplicate() to v.deduplicate() }.toMap()
@@ -167,7 +166,7 @@
       myCustomSourceDirectories = provider.customDirectories?.map {
         IdeCustomSourceDirectoryImpl(it.sourceTypeName, folder, it.directory.makeRelativeAndDeduplicate())
       } ?: emptyList(),
-      myBaselineProfileDirectories = if (agpVersion.isAtLeast(8, 0, 0, "beta", 1, false))
+      myBaselineProfileDirectories = if (modelVersions.agp.isAtLeast(8, 0, 0, "beta", 1, false))
         provider.baselineProfileDirectories?.makeRelativeAndDeduplicate() ?: mutableListOf()
       else
         mutableListOf()
@@ -391,6 +390,7 @@
       multiDexEnabled = buildType.multiDexEnabled,
       isDebuggable = buildType.isDebuggable,
       isJniDebuggable = buildType.isJniDebuggable,
+      isPseudoLocalesEnabled = buildType.isPseudoLocalesEnabled,
       isRenderscriptDebuggable = buildType.isRenderscriptDebuggable,
       renderscriptOptimLevel = buildType.renderscriptOptimLevel,
       isMinifyEnabled = buildType.isMinifyEnabled,
@@ -718,7 +718,7 @@
    fall back to that value.
   */
   fun getDesugaredMethodsList(artifact: AndroidArtifact, fallback: Collection<File>): Collection<File> {
-    return if (agpVersion.isAtLeast(8, 0, 0, "alpha", 2, false))
+    return if (modelVersions.agp.isAtLeast(8, 0, 0, "alpha", 2, false))
       artifact.desugaredMethodsFiles
     else
       fallback
@@ -734,7 +734,7 @@
   ): IdeAndroidArtifactCoreImpl {
     val testInfo = artifact.testInfo
 
-    val applicationId: String? = getApplicationIdFromArtifact(agpVersion, artifact, name, legacyAndroidGradlePluginProperties, mainVariantName)
+    val applicationId: String? = getApplicationIdFromArtifact(modelVersions, artifact, name, legacyAndroidGradlePluginProperties, mainVariantName)
 
     return IdeAndroidArtifactCoreImpl(
       name = name,
@@ -758,16 +758,16 @@
       buildInformation = buildTasksOutputInformationFrom(artifact),
       codeShrinker = convertCodeShrinker(artifact.codeShrinker),
       isTestArtifact = name == IdeArtifactName.ANDROID_TEST,
-      privacySandboxSdkInfo = if (agpVersion.isAtLeast(8, 3, 0, "alpha", 14, false))
+      privacySandboxSdkInfo = if (modelVersions.agp.isAtLeast(8, 3, 0, "alpha", 14, false))
         artifact.privacySandboxSdkInfo?.let {
           IdePrivacySandboxSdkInfoImpl(it.task, it.outputListingFile, it.additionalApkSplitTask, it.additionalApkSplitFile, it.taskLegacy, it.outputListingLegacyFile)
         }
       else
         null,
       desugaredMethodsFiles = getDesugaredMethodsList(artifact, fallbackDesugaredMethodsFiles),
-      generatedClassPaths = if (agpVersion.isAtLeast(8, 2, 0, "alpha", 7, false))
+      generatedClassPaths = if (modelVersions.agp.isAtLeast(8, 2, 0, "alpha", 7, false))
         artifact.generatedClassPaths else emptyMap(),
-      bytecodeTransforms = if (agpVersion.isAtLeast(8, 3, 0, "alpha", 14, false)) artifact.bytecodeTransformations.toIdeModels() else null,
+      bytecodeTransforms = if (modelVersions.agp.isAtLeast(8, 3, 0, "alpha", 14, false)) artifact.bytecodeTransformations.toIdeModels() else null,
     )
   }
 
@@ -840,9 +840,9 @@
       unresolvedDependencies = emptyList(),
       mockablePlatformJar = artifact.mockablePlatformJar,
       isTestArtifact = name == IdeArtifactName.UNIT_TEST,
-      generatedClassPaths = if (agpVersion.isAtLeast(8, 2, 0, "alpha", 7, false))
+      generatedClassPaths = if (modelVersions.agp.isAtLeast(8, 2, 0, "alpha", 7, false))
         artifact.generatedClassPaths else emptyMap(),
-      bytecodeTransforms = if (agpVersion.isAtLeast(8, 3, 0, "alpha", 14, false)) artifact.bytecodeTransformations.toIdeModels() else null,
+      bytecodeTransforms = if (modelVersions.agp.isAtLeast(8, 3, 0, "alpha", 14, false)) artifact.bytecodeTransformations.toIdeModels() else null,
     )
   }
 
@@ -934,7 +934,7 @@
       if (mergedFlavor.versionNameSuffix == null && buildType?.versionNameSuffix == null) null
       else mergedFlavor.versionNameSuffix.orEmpty() + buildType?.versionNameSuffix.orEmpty()
     val variantName = variant.name.deduplicate()
-    val fallbackDesugaredMethodsFiles = if (agpVersion.isAtLeast(7, 3, 0, "alpha", 6, false)) variant.desugaredMethods else emptyList()
+    val fallbackDesugaredMethodsFiles = if (modelVersions.agp.isAtLeast(7, 3, 0, "alpha", 6, false)) variant.desugaredMethods else emptyList()
 
     return ModelResult.create {
       IdeVariantCoreImpl(
@@ -974,7 +974,7 @@
         testInstrumentationRunner = mergedFlavor.testInstrumentationRunner?.deduplicate(),
         testInstrumentationRunnerArguments = mergedFlavor.testInstrumentationRunnerArguments.deduplicateStrings(),
         testedTargetVariants = getTestedTargetVariants(variant),
-        runTestInSeparateProcess = agpVersion.isAtLeast(8, 3, 0, "alpha", 11, true)
+        runTestInSeparateProcess = modelVersions.agp.isAtLeast(8, 3, 0, "alpha", 11, true)
                                 && variant.runTestInSeparateProcess,
         resValues = merge({ resValues }, { resValues }, ::combineMaps),
         proguardFiles = merge({ proguardFiles }, { proguardFiles }, ::combineSets),
@@ -1205,6 +1205,8 @@
       transitiveRClasses = AndroidGradlePluginProjectFlags.BooleanFlag.TRANSITIVE_R_CLASS.getValue(flags),
       usesCompose = AndroidGradlePluginProjectFlags.BooleanFlag.JETPACK_COMPOSE.getValue(flags),
       mlModelBindingEnabled = AndroidGradlePluginProjectFlags.BooleanFlag.ML_MODEL_BINDING.getValue(flags),
+      /** Treated as enabled for AGP < 8.4. if we need to know the actual answer we could add it to LegacyAndroidGradlePluginPropertiesModelBuilder */
+      androidResourcesEnabled = AndroidGradlePluginProjectFlags.BooleanFlag.BUILD_FEATURE_ANDROID_RESOURCES.getValue(flags),
       unifiedTestPlatformEnabled = AndroidGradlePluginProjectFlags.BooleanFlag.UNIFIED_TEST_PLATFORM.getValue(flags),
       // If the property is not found in AGPProjectFlags (e.g., when opening older AGPs), get it from GradlePropertiesModel
       useAndroidX = AndroidGradlePluginProjectFlags.BooleanFlag.USE_ANDROID_X.getValue(flags, gradlePropertiesModel.useAndroidX)
@@ -1225,7 +1227,7 @@
     buildId: BuildId,
     basicProject: BasicAndroidProject,
     project: AndroidProject,
-    modelsVersions: Versions,
+    modelVersions: ModelVersions,
     androidDsl: AndroidDsl,
     legacyAndroidGradlePluginProperties: LegacyAndroidGradlePluginProperties?,
     gradlePropertiesModel: GradlePropertiesModel,
@@ -1250,9 +1252,9 @@
     val basicVariantsCopy: Collection<IdeBasicVariantImpl> = project.variants.map {
       IdeBasicVariantImpl(
         name = it.name,
-        applicationId = getApplicationIdFromArtifact(agpVersion, it.mainArtifact, IdeArtifactName.MAIN, legacyAndroidGradlePluginProperties, it.name),
+        applicationId = getApplicationIdFromArtifact(modelVersions, it.mainArtifact, IdeArtifactName.MAIN, legacyAndroidGradlePluginProperties, it.name),
         testApplicationId = it.androidTestArtifact?.let { androidTestArtifact ->
-          getApplicationIdFromArtifact(agpVersion, androidTestArtifact, IdeArtifactName.ANDROID_TEST, legacyAndroidGradlePluginProperties, it.name)
+          getApplicationIdFromArtifact(modelVersions, androidTestArtifact, IdeArtifactName.ANDROID_TEST, legacyAndroidGradlePluginProperties, it.name)
         }
       )
     }
@@ -1271,13 +1273,13 @@
     val lintChecksJarsCopy: List<File> = project.lintChecksJars.deduplicateFiles()
     val isBaseSplit = basicProject.projectType == ProjectType.APPLICATION
     val agpFlags: IdeAndroidGradlePluginProjectFlagsImpl = androidGradlePluginProjectFlagsFrom(project.flags, gradlePropertiesModel)
-    val desugarLibConfig = project.takeIf { agpVersion.isAtLeast(8, 1, 0, "alpha", 5, false) }?.desugarLibConfig.orEmpty()
-    val lintJar = project.takeIf { agpVersion.isAtLeast(8, 4, 0, "alpha", 6, false) }?.lintJar?.deduplicateFile()
+    val desugarLibConfig = project.takeIf { modelVersions.agp.isAtLeast(8, 1, 0, "alpha", 5, false) }?.desugarLibConfig.orEmpty()
+    val lintJar = project.takeIf { modelVersions.agp.isAtLeast(8, 4, 0, "alpha", 6, false) }?.lintJar?.deduplicateFile()
 
     return ModelResult.create {
       if (syncTestMode == SyncTestMode.TEST_EXCEPTION_HANDLING) error("**internal error for tests**")
       IdeAndroidProjectImpl(
-        agpVersion = modelsVersions.agp,
+        agpVersion = modelVersions.agp.toString(),
         projectPath = IdeProjectPathImpl(
           rootBuildId = rootBuildId.asFile,
           buildId = buildId.asFile,
@@ -1355,7 +1357,7 @@
       buildId: BuildId,
       basicProject: BasicAndroidProject,
       project: AndroidProject,
-      androidVersion: Versions,
+      androidVersion: ModelVersions,
       androidDsl: AndroidDsl,
       legacyAndroidGradlePluginProperties: LegacyAndroidGradlePluginProperties?,
       gradlePropertiesModel: GradlePropertiesModel,
@@ -1378,12 +1380,12 @@
 }
 
 private fun getApplicationIdFromArtifact(
-  agpVersion: AgpVersion,
+  modelVersions: ModelVersions,
   artifact: AndroidArtifact,
   name: IdeArtifactName,
   legacyAndroidGradlePluginProperties: LegacyAndroidGradlePluginProperties?,
   mainVariantName: String
-) = if (agpVersion.agpModelIncludesApplicationId) {
+) = if (modelVersions.agpModelIncludesApplicationId) {
   artifact.applicationId
 } else {
   when (name) {
diff --git a/project-system-gradle/BUILD b/project-system-gradle/BUILD
index fe1719f..caa156b 100644
--- a/project-system-gradle/BUILD
+++ b/project-system-gradle/BUILD
@@ -39,7 +39,6 @@
         "//tools/vendor/google/ml/sml-android:ml.sml-android",
         "//tools/vendor/google/android-ndk:android-ndk",
         "//tools/adt/idea/compose-designer:intellij.android.compose-designer",
-        "//tools/adt/idea/designer/customview:intellij.android.designer.customview",
         "//tools/adt/idea/designer:intellij.android.designer",
         "//tools/vendor/google/firebase:firebase",
         "//tools/adt/idea/gmd-code-completion:intellij.android.gmd-code-completion",
@@ -107,7 +106,8 @@
     split_test_targets = {
         "jdk.integration": {
             "data": [
-                "//prebuilts/studio/jdk/jdk11",
+                "//prebuilts/studio/jdk/jdk11:jdk11",
+                "//prebuilts/studio/jdk/jdk17:jdk17_runtime_files",
             ],
             "test_filter": "com.android.tools.idea.gradle.project.sync.jdk.integration",
         },
diff --git a/project-system-gradle/OWNERS b/project-system-gradle/OWNERS
new file mode 100644
index 0000000..196abec
--- /dev/null
+++ b/project-system-gradle/OWNERS
@@ -0,0 +1,23 @@
+akerim@google.com
+alexgolubev@google.com
+amishar@google.com
+amrmahmoud@google.com
+bingran@google.com
+cmw@google.com
+gavra@google.com
+hmehmed@google.com
+hungnv@google.com
+jedo@google.com
+karimai@google.com
+lukeedgar@google.com
+micahjo@google.com
+mlazeba@google.com
+spollom@google.com
+srmurguia@google.com
+vmadalin@google.com
+xav@google.com
+xof@google.com
+
+# IntelliJ Platform SDK merges
+gharrma@google.com
+ralucas@google.com
diff --git a/project-system-gradle/src/com/android/tools/idea/gradle/dependencies/DependenciesInserter.kt b/project-system-gradle/src/com/android/tools/idea/gradle/dependencies/DependenciesInserter.kt
index 1b5b658..d6233c6 100644
--- a/project-system-gradle/src/com/android/tools/idea/gradle/dependencies/DependenciesInserter.kt
+++ b/project-system-gradle/src/com/android/tools/idea/gradle/dependencies/DependenciesInserter.kt
@@ -27,10 +27,114 @@
 import org.jetbrains.kotlin.utils.addIfNotNull
 
 open class DependenciesInserter(private val projectModel: ProjectBuildModel) {
+
+  /**
+   * Adds plugin in a smart way. Consider version catalog vs non version catalog projects.
+   * Looks for pluginsManagement (settings) section, plugins block in root project buildscript,
+   * buildscript dependencies section.
+   * In case none above found (new project) we fall back to adding project level plugin alias
+   * (as plugin itself is declared in version catalog for new projects) to root project plugin block.
+   */
+  fun addPlugin(pluginId: String,
+                classpathDependency: String,
+                buildModel: GradleBuildModel,
+                pluginMatcher: PluginMatcher = IdPluginMatcher(pluginId),
+                classpathMatcher: DependencyMatcher = GroupNameDependencyMatcher(CLASSPATH_CONFIGURATION_NAME,
+                                                                                 classpathDependency)): Set<PsiFile> {
+    val dependency = Dependency.parse(classpathDependency)
+    require(dependency.version != null) { "Classpath $classpathDependency version is empty" }
+    val version = dependency.version!!.toString()
+    val projectBuildModel = projectModel.projectBuildModel ?: error("Build model for root project not found")
+    val result = sequenceOf(
+      lazy { tryAddToPluginsManagementBlock(pluginId, version, projectBuildModel, pluginMatcher) },
+      lazy { tryAddToPluginsBlock(pluginId, version, projectBuildModel, pluginMatcher) },
+      lazy { tryAddToBuildscriptDependencies(classpathDependency, projectBuildModel, classpathMatcher) }
+    ).firstOrNull { it.value.succeed }?.value
+    val updatedFiles = mutableSetOf<PsiFile>()
+
+    // in case there is nothing - we force adding plugin to root project plugins block
+    result?.changedFiles?.let { updatedFiles.addAll(it) } ?: updatedFiles.addAll(
+        addPlugin(pluginId, version, apply = false, projectBuildModel, projectBuildModel)
+    )
+
+
+
+    updatedFiles.addAll(addPluginToModule(pluginId, version, buildModel))
+
+    return updatedFiles
+  }
+
+  // Files may be already in proper state, so we need additional flag `succeed` to make sure
+  // all changes already there
+  private data class TryAddResult(val changedFiles: Set<PsiFile>, val succeed: Boolean) {
+    companion object {
+      fun failed() = TryAddResult(setOf(), false)
+    }
+  }
+
+  private fun tryAddToBuildscriptDependencies(
+    classpathDependency: String,
+    buildModel: GradleBuildModel,
+    classpathMatcher: DependencyMatcher
+  ): TryAddResult {
+    buildModel.buildscript().dependencies().takeIf { it.psiElement != null }
+      ?.let {
+        val changedFiles = addClasspathDependency(classpathDependency, listOf(), classpathMatcher)
+        return TryAddResult(changedFiles, true)
+      }
+    return TryAddResult.failed()
+  }
+
+  private fun tryAddToPluginsBlock(
+    pluginId: String,
+    version: String,
+    buildModel: GradleBuildModel,
+    matcher: PluginMatcher
+  ): TryAddResult {
+    buildModel.plugins().takeIf { buildModel.pluginsPsiElement != null }
+      ?.let { plugins ->
+        val updatedFiles = mutableSetOf<PsiFile>()
+        val existing = plugins.firstOrNull { matcher.match(it) }
+        if (existing == null) {
+          updatedFiles.addAll(
+            addPlugin(pluginId, version, apply = false, buildModel, buildModel)
+          )
+        }
+        return TryAddResult(updatedFiles, true)
+      }
+    return TryAddResult.failed()
+  }
+
+  private fun tryAddToPluginsManagementBlock(
+    pluginId: String,
+    version: String,
+    buildModel: GradleBuildModel,
+    matcher: PluginMatcher
+  ): TryAddResult {
+    projectModel.projectSettingsModel?.pluginManagement()?.plugins()?.takeIf { it.psiElement != null }
+      ?.let { plugins ->
+        val existing = plugins.plugins().firstOrNull { matcher.match(it) }
+        val updatedFiles = mutableSetOf<PsiFile>()
+        if (existing == null) {
+          updatedFiles.addAll(
+            DependenciesHelper.withModel(projectModel).addPlugin(
+              pluginId,
+              version,
+              apply = null,
+              plugins,
+              buildModel)
+          )
+        }
+        return TryAddResult(updatedFiles, true)
+      }
+    return TryAddResult.failed()
+  }
+
   @JvmOverloads
   open fun addClasspathDependency(dependency: String,
-                             excludes: List<ArtifactDependencySpec> = listOf(),
-                             matcher: DependencyMatcher = ExactDependencyMatcher(CLASSPATH_CONFIGURATION_NAME, dependency)): Set<PsiFile> {
+                                  excludes: List<ArtifactDependencySpec> = listOf(),
+                                  matcher: DependencyMatcher = ExactDependencyMatcher(CLASSPATH_CONFIGURATION_NAME,
+                                                                                      dependency)): Set<PsiFile> {
     val updatedFiles = mutableSetOf<PsiFile>()
     val buildModel = projectModel.projectBuildModel ?: return updatedFiles
     val buildscriptDependencies = buildModel.buildscript().dependencies()
@@ -66,11 +170,11 @@
    * It does not change root project build file as plugin information is going to settings plugin block
    */
   open fun addPlugin(pluginId: String,
-                version: String,
-                apply: Boolean?,
-                settingsPlugins: PluginsBlockModel,
-                buildModel: GradleBuildModel,
-                matcher: PluginMatcher = IdPluginMatcher(pluginId)): Set<PsiFile> {
+                     version: String,
+                     apply: Boolean?,
+                     settingsPlugins: PluginsBlockModel,
+                     buildModel: GradleBuildModel,
+                     matcher: PluginMatcher = IdPluginMatcher(pluginId)): Set<PsiFile> {
     val changedFiles = mutableSetOf<PsiFile>()
 
     // buildModel may be root project of multimodule project or module project itself
@@ -90,11 +194,11 @@
    * and then to specific project defined by buildModel
    */
   open fun addPlugin(pluginId: String,
-                version: String,
-                apply: Boolean?,
-                projectPlugins: GradleBuildModel,
-                buildModel: GradleBuildModel,
-                matcher: PluginMatcher = IdPluginMatcher(pluginId)): Set<PsiFile> {
+                     version: String,
+                     apply: Boolean?,
+                     projectPlugins: GradleBuildModel,
+                     buildModel: GradleBuildModel,
+                     matcher: PluginMatcher = IdPluginMatcher(pluginId)): Set<PsiFile> {
     val changedFiles = mutableSetOf<PsiFile>()
 
     // Inserting project level plugins in case
@@ -121,19 +225,19 @@
    * Project build file/settings stay intact
    */
   open fun addPluginToModule(pluginId: String,
-                        version: String,
-                        buildModel: GradleBuildModel,
-                        matcher: PluginMatcher = IdPluginMatcher(pluginId)): Set<PsiFile> {
+                             version: String,
+                             buildModel: GradleBuildModel,
+                             matcher: PluginMatcher = IdPluginMatcher(pluginId)): Set<PsiFile> {
     val changedFiles = mutableSetOf<PsiFile>()
     addPlugin(pluginId, buildModel, matcher)?.also { changedFiles.add(it) }
     return changedFiles
   }
 
   open fun addDependency(configuration: String,
-                    dependency: String,
-                    excludes: List<ArtifactDependencySpec>,
-                    parsedModel: GradleBuildModel,
-                    matcher: DependencyMatcher): Set<PsiFile> {
+                         dependency: String,
+                         excludes: List<ArtifactDependencySpec>,
+                         parsedModel: GradleBuildModel,
+                         matcher: DependencyMatcher): Set<PsiFile> {
     val updateFiles = mutableSetOf<PsiFile>()
     val dependenciesModel = parsedModel.dependencies()
     if (!dependenciesModel.hasArtifact(matcher)) {
@@ -146,10 +250,10 @@
 
   @JvmOverloads
   open fun addClasspathDependencyWithVersionVariable(dependency: String,
-                                                variableName: String,
-                                                excludes: List<ArtifactDependencySpec> = listOf(),
-                                                matcher: DependencyMatcher = ExactDependencyMatcher(CLASSPATH_CONFIGURATION_NAME,
-                                                                                                      dependency)): Set<PsiFile> {
+                                                     variableName: String,
+                                                     excludes: List<ArtifactDependencySpec> = listOf(),
+                                                     matcher: DependencyMatcher = ExactDependencyMatcher(CLASSPATH_CONFIGURATION_NAME,
+                                                                                                         dependency)): Set<PsiFile> {
     val updatedFiles = mutableSetOf<PsiFile>()
     val buildModel = projectModel.projectBuildModel ?: return updatedFiles
     val buildscriptDependencies = buildModel.buildscript().dependencies()
diff --git a/project-system-gradle/src/com/android/tools/idea/gradle/project/AndroidGradleProjectStartupActivity.kt b/project-system-gradle/src/com/android/tools/idea/gradle/project/AndroidGradleProjectStartupActivity.kt
index 6ba5419..fa99eea 100644
--- a/project-system-gradle/src/com/android/tools/idea/gradle/project/AndroidGradleProjectStartupActivity.kt
+++ b/project-system-gradle/src/com/android/tools/idea/gradle/project/AndroidGradleProjectStartupActivity.kt
@@ -89,8 +89,6 @@
 import org.jetbrains.plugins.gradle.settings.GradleSettings
 import org.jetbrains.plugins.gradle.settings.GradleSettingsListener
 import org.jetbrains.plugins.gradle.util.GradleConstants
-import com.intellij.openapi.util.ThrowableComputable
-import com.intellij.util.SlowOperations
 
 /**
  * Syncs Android Gradle project with the persisted project data on startup.
@@ -395,10 +393,7 @@
 
   additionalProjectSetup(project)
 
-  // TODO b/320711808
-  SlowOperations.allowSlowOperations(ThrowableComputable {
-    GradleSyncStateHolder.getInstance(project).syncSkipped(null)
-  })
+  GradleSyncStateHolder.getInstance(project).syncSkipped(null)
 }
 
 private fun <T> getModelFromDataNode(moduleDataNode: DataNode<*>, dataKey: Key<T>) =
diff --git a/project-system-gradle/src/com/android/tools/idea/gradle/project/GradleVersionCatalogDetector.kt b/project-system-gradle/src/com/android/tools/idea/gradle/project/GradleVersionCatalogDetector.kt
index 8e9361a..fc20209 100644
--- a/project-system-gradle/src/com/android/tools/idea/gradle/project/GradleVersionCatalogDetector.kt
+++ b/project-system-gradle/src/com/android/tools/idea/gradle/project/GradleVersionCatalogDetector.kt
@@ -18,6 +18,7 @@
 import com.android.SdkConstants.FN_GRADLE_WRAPPER_PROPERTIES
 import com.android.SdkConstants.FN_SETTINGS_GRADLE
 import com.android.SdkConstants.FN_SETTINGS_GRADLE_KTS
+import com.android.annotations.concurrency.Slow
 import com.android.tools.analytics.UsageTracker
 import com.android.tools.idea.concurrency.executeOnPooledThread
 import com.android.tools.idea.gradle.project.GradleVersionCatalogDetector.DetectorResult.EXPLICIT_CALL
@@ -25,6 +26,7 @@
 import com.android.tools.idea.gradle.project.GradleVersionCatalogDetector.DetectorResult.NOT_ENABLED
 import com.android.tools.idea.gradle.project.GradleVersionCatalogDetector.DetectorResult.NOT_USED
 import com.android.tools.idea.gradle.project.GradleVersionCatalogDetector.DetectorResult.OLD_GRADLE
+import com.android.tools.idea.gradle.project.GradleVersionCatalogDetector.DetectorResult.UNAVAILABLE
 import com.android.tools.idea.gradle.util.GradleProjectSystemUtil.findGradleSettingsFile
 import com.android.tools.idea.gradle.util.GradleWrapper
 import com.google.wireless.android.sdk.stats.AndroidStudioEvent
@@ -34,6 +36,7 @@
 import com.google.wireless.android.sdk.stats.GradleVersionCatalogDetectorEvent.State.EXPLICIT
 import com.google.wireless.android.sdk.stats.GradleVersionCatalogDetectorEvent.State.IMPLICIT
 import com.google.wireless.android.sdk.stats.GradleVersionCatalogDetectorEvent.State.NONE
+import com.google.wireless.android.sdk.stats.GradleVersionCatalogDetectorEvent.State.UNKNOWN_GRADLE_VERSION_CATALOG_DETECTOR_STATE
 import com.google.wireless.android.sdk.stats.GradleVersionCatalogDetectorEvent.State.UNSUPPORTED
 import com.intellij.notification.Notification
 import com.intellij.notification.NotificationType
@@ -155,22 +158,31 @@
       }
     }
 
-  val versionCatalogDetectorResult: DetectorResult
-    get() {
-      val gradleVersion = gradleVersion
-      if (gradleVersion < PREVIEW_GRADLE_VERSION) return OLD_GRADLE
-      val settingsVisitorResults = settingsVisitorResults
-      val needEnableFeaturePreview = gradleVersion < STABLE_GRADLE_VERSION
-      if (needEnableFeaturePreview && !settingsVisitorResults.enableFeaturePreview) return NOT_ENABLED
-      if (settingsVisitorResults.versionCatalogsCall) return EXPLICIT_CALL
-      return when(project.baseDir?.findChild("gradle")?.findChild("libs.versions.toml")) {
-        null -> NOT_USED
-        else -> IMPLICIT_LIBS_VERSIONS
-      }
+  private inline fun GradleVersionCatalogDetector.computeDetectorResult(
+    gradleVersionGetter: GradleVersionCatalogDetector.() -> GradleVersion?,
+    settingsVisitorResultsGetter: GradleVersionCatalogDetector.() -> SettingsVisitorResults?
+  ): DetectorResult {
+    val gradleVersion = gradleVersionGetter() ?: return UNAVAILABLE
+    if (gradleVersion < PREVIEW_GRADLE_VERSION) return OLD_GRADLE
+    val settingsVisitorResults = settingsVisitorResultsGetter() ?: return UNAVAILABLE
+    val needEnableFeaturePreview = gradleVersion < STABLE_GRADLE_VERSION
+    if (needEnableFeaturePreview && !settingsVisitorResults.enableFeaturePreview) return NOT_ENABLED
+    if (settingsVisitorResults.versionCatalogsCall) return EXPLICIT_CALL
+    return when(project.baseDir?.findChild("gradle")?.findChild("libs.versions.toml")) {
+      null -> NOT_USED
+      else -> IMPLICIT_LIBS_VERSIONS
     }
+  }
+
+  @get:Slow
+  val versionCatalogDetectorResult: DetectorResult
+    get() = computeDetectorResult({ gradleVersion }, { settingsVisitorResults })
+  val versionCatalogDetectorResultIfAvailable: DetectorResult
+    get() = computeDetectorResult({ _gradleVersion }, { _settingsVisitorResults })
 
   private var shouldSendTrackerEvent = true
 
+  @get:Slow
   val isVersionCatalogProject: Boolean
     get() = versionCatalogDetectorResult.run {
       if (shouldSendTrackerEvent) {
@@ -197,6 +209,7 @@
     val catalogEntry: Boolean
   }
 
+  @get:Slow
   @get:VisibleForTesting
   val isSettingsCatalogEntry: Boolean
     get() = isVersionCatalogProject && settingsVisitorResults.catalogEntry
@@ -212,9 +225,15 @@
   fun maybeSuggestToml(project: Project) {
     val notificationsManager = NotificationsManager.getNotificationsManager()
     val existing = notificationsManager.getNotificationsOfType(VersionCatalogTomlSuggestion::class.java, project)
-    if (isSettingsCatalogEntry) {
-      if (existing.isEmpty()) {
-        VersionCatalogTomlSuggestion().notify(project)
+    if (existing.isEmpty()) {
+      executeOnPooledThread {
+        if (isSettingsCatalogEntry) {
+          // re-check because we might be executing this arbitrarily later than the initial check.  (The NotificationsManager
+          // checks for project disposal, though there's still presumably a small TOCTTOU window there.)
+          if (notificationsManager.getNotificationsOfType(VersionCatalogTomlSuggestion::class.java, project).isEmpty()) {
+            VersionCatalogTomlSuggestion().notify(project)
+          }
+        }
       }
     }
     else {
@@ -228,6 +247,7 @@
     EXPLICIT_CALL(true, EXPLICIT), // Found an explicit call to versionCatalogs in settings.
     IMPLICIT_LIBS_VERSIONS(true, IMPLICIT), // No explicit call, but implicit use through libs.versions.toml.
     NOT_USED(false, NONE), // No use of Version Catalogs found in this project.
+    UNAVAILABLE(false, UNKNOWN_GRADLE_VERSION_CATALOG_DETECTOR_STATE), // Not computed and not computable at this time.
   }
 
   private fun visitGroovySettings(settingsPsiFile: GroovyFile): SettingsVisitorResults {
diff --git a/android/src/com/android/tools/idea/gradle/project/build/invoker/TestCompileType.kt b/project-system-gradle/src/com/android/tools/idea/gradle/project/build/invoker/TestCompileType.kt
similarity index 100%
rename from android/src/com/android/tools/idea/gradle/project/build/invoker/TestCompileType.kt
rename to project-system-gradle/src/com/android/tools/idea/gradle/project/build/invoker/TestCompileType.kt
diff --git a/project-system-gradle/src/com/android/tools/idea/gradle/project/model/GradleAndroidModelData.kt b/project-system-gradle/src/com/android/tools/idea/gradle/project/model/GradleAndroidModelData.kt
index 56eb01d..5545b5b 100644
--- a/project-system-gradle/src/com/android/tools/idea/gradle/project/model/GradleAndroidModelData.kt
+++ b/project-system-gradle/src/com/android/tools/idea/gradle/project/model/GradleAndroidModelData.kt
@@ -38,7 +38,7 @@
 /**
  * Suffix for the cached sync files version to allow for changes between development versions that have the same version
  */
-private const val ourAndroidSyncVersionSuffix = "2023-10-17/7"
+private const val ourAndroidSyncVersionSuffix = "2024-01-16/1"
 
 /**
  * Version of the cached sync files, used to ensure caches were written by this version of Studio to avoid untested behavior.
diff --git a/project-system-gradle/src/com/android/tools/idea/gradle/project/sync/GradleSyncEventLogger.kt b/project-system-gradle/src/com/android/tools/idea/gradle/project/sync/GradleSyncEventLogger.kt
index eaf6a52..bbc39bf 100644
--- a/project-system-gradle/src/com/android/tools/idea/gradle/project/sync/GradleSyncEventLogger.kt
+++ b/project-system-gradle/src/com/android/tools/idea/gradle/project/sync/GradleSyncEventLogger.kt
@@ -110,7 +110,7 @@
     syncStats.syncType = syncType ?: GradleSyncStats.GradleSyncType.GRADLE_SYNC_TYPE_UNKNOWN
     syncStats.usesBuildGradle = buildFileTypes.contains(SdkConstants.DOT_GRADLE)
     syncStats.usesBuildGradleKts = buildFileTypes.contains(SdkConstants.DOT_KTS)
-    syncStats.versionCatalogDetectorState = GradleVersionCatalogDetector.getInstance(project).versionCatalogDetectorResult.state
+    syncStats.versionCatalogDetectorState = GradleVersionCatalogDetector.getInstance(project).versionCatalogDetectorResultIfAvailable.state
     if (rootProjectPath != null) {
       syncStats.updateUserRequestedParallelSyncMode(project, rootProjectPath)
     }
diff --git a/project-system-gradle/src/com/android/tools/idea/gradle/project/sync/internal/IdeModelDumper.kt b/project-system-gradle/src/com/android/tools/idea/gradle/project/sync/internal/IdeModelDumper.kt
index 3ae50be..48e2d11 100644
--- a/project-system-gradle/src/com/android/tools/idea/gradle/project/sync/internal/IdeModelDumper.kt
+++ b/project-system-gradle/src/com/android/tools/idea/gradle/project/sync/internal/IdeModelDumper.kt
@@ -642,6 +642,7 @@
         dump(ideBuildTypeContainer.buildType as IdeBaseConfig)
         prop("IsDebuggable") { ideBuildTypeContainer.buildType.isDebuggable.toString() }
         prop("IsJniDebuggable") { ideBuildTypeContainer.buildType.isJniDebuggable.toString() }
+        prop("IsPseudoLocalesEnabled") { ideBuildTypeContainer.buildType.isPseudoLocalesEnabled.toString() }
         prop("IsRenderscriptDebuggable") { ideBuildTypeContainer.buildType.isRenderscriptDebuggable.toString() }
         prop("RenderscriptOptimLevel") { ideBuildTypeContainer.buildType.renderscriptOptimLevel.toString() }
         prop("IsMinifyEnabled") { ideBuildTypeContainer.buildType.isMinifyEnabled.toString() }
@@ -753,6 +754,7 @@
         prop("UseAndroidX") { agpFlags.useAndroidX.toString() }
         prop("UsesCompose") { agpFlags.usesCompose.toString() }
         prop("MlModelBindingEnabled") { agpFlags.mlModelBindingEnabled.toString() }
+        prop("AndroidResourcesEnabled") { agpFlags.androidResourcesEnabled.toString() }
       }
     }
 
diff --git a/project-system-gradle/src/com/android/tools/idea/gradle/run/MakeBeforeRunTaskProvider.kt b/project-system-gradle/src/com/android/tools/idea/gradle/run/MakeBeforeRunTaskProvider.kt
index 7e94593..2921b44 100644
--- a/project-system-gradle/src/com/android/tools/idea/gradle/run/MakeBeforeRunTaskProvider.kt
+++ b/project-system-gradle/src/com/android/tools/idea/gradle/run/MakeBeforeRunTaskProvider.kt
@@ -485,16 +485,15 @@
 
     return doBuild(tasks, BuildMode.DEFAULT_BUILD_MODE)
   }
-  val testCompileType = configuration?.testCompileType ?: TestCompileType.NONE
+  val testCompileType = if (configuration?.isTestConfiguration == true) TestCompileType.ANDROID_TESTS else TestCompileType.NONE
   return when {
-    testCompileType === TestCompileType.UNIT_TESTS ->
-      doBuild(gradleTasksFinder.findTasksToExecute(modules, BuildMode.COMPILE_JAVA, TestCompileType.UNIT_TESTS).asMap(), BuildMode.COMPILE_JAVA)
     // Use the "select apks from bundle" task if using a "AndroidRunConfigurationBase".
     // Note: This is very ad-hoc, and it would be nice to have a better abstraction for this special case.
 
     // NOTE: MakeBeforeRunTask is configured on unit-test and AndroidrunConfigurationBase run configurations only. Therefore,
     //       since testCompileType != TestCompileType.UNIT_TESTS it is safe to assume that configuration is
     //       AndroidRunConfigurationBase.
+    // Um, except that AndroidWearConfiguration now exists.
     useSelectApksFromBundleBuilder(modules, configuration, targetDeviceVersion) ->
       doBuild(gradleTasksFinder.findTasksToExecute(modules, BuildMode.APK_FROM_BUNDLE, testCompileType).asMap(), BuildMode.APK_FROM_BUNDLE)
     else ->
diff --git a/project-system-gradle/src/com/android/tools/idea/projectsystem/gradle/GradleModuleSystem.kt b/project-system-gradle/src/com/android/tools/idea/projectsystem/gradle/GradleModuleSystem.kt
index fdbbeb7..93d4f8d 100644
--- a/project-system-gradle/src/com/android/tools/idea/projectsystem/gradle/GradleModuleSystem.kt
+++ b/project-system-gradle/src/com/android/tools/idea/projectsystem/gradle/GradleModuleSystem.kt
@@ -535,6 +535,9 @@
       null -> null
     }
 
+  override val supportsAndroidResources: Boolean
+    get() = readFromAgpFlags { it.androidResourcesEnabled } ?: true
+
   override val isRClassTransitive: Boolean get() = readFromAgpFlags { it.transitiveRClasses } ?: true
 
   override fun getTestLibrariesInUse(): TestLibraries? {
diff --git a/project-system-gradle/src/com/android/tools/idea/projectsystem/gradle/RunConfigurationGradleContext.kt b/project-system-gradle/src/com/android/tools/idea/projectsystem/gradle/RunConfigurationGradleContext.kt
index 5620cc6..77b5b33 100644
--- a/project-system-gradle/src/com/android/tools/idea/projectsystem/gradle/RunConfigurationGradleContext.kt
+++ b/project-system-gradle/src/com/android/tools/idea/projectsystem/gradle/RunConfigurationGradleContext.kt
@@ -15,10 +15,8 @@
  */
 package com.android.tools.idea.projectsystem.gradle
 
-import com.android.tools.idea.gradle.project.build.invoker.TestCompileType
 import com.android.tools.idea.run.AndroidRunConfiguration
 import com.android.tools.idea.run.AndroidRunConfigurationBase
-import com.android.tools.idea.run.PreferGradleMake
 import com.android.tools.idea.run.configuration.AndroidWearConfiguration
 import com.android.tools.idea.util.androidFacet
 import com.intellij.execution.configurations.ModuleBasedConfiguration
@@ -29,7 +27,6 @@
 data class RunConfigurationGradleContext(
   val androidFacet: AndroidFacet,
   val isTestConfiguration: Boolean,
-  val testCompileType: TestCompileType,
   val isAdvancedProfilingEnabled: Boolean,
   val profilerProperties: Properties?,
   val alwaysDeployApkFromBundle: Boolean,
@@ -43,12 +40,9 @@
     this !is AndroidWearConfiguration
   ) return null
 
-  val preferGradleMake: PreferGradleMake = this as PreferGradleMake
-
   return RunConfigurationGradleContext(
     androidFacet = (this as? ModuleBasedConfiguration<*, *>)?.configurationModule?.module?.androidFacet ?: return null,
     isTestConfiguration = if (this is AndroidRunConfigurationBase) isTestConfiguration else false,
-    testCompileType = preferGradleMake.testCompileMode,
     isAdvancedProfilingEnabled = (this as? AndroidRunConfigurationBase)?.profilerState?.ADVANCED_PROFILING_ENABLED == true,
     profilerProperties = (this as? AndroidRunConfigurationBase)?.profilerState?.toProperties(),
     alwaysDeployApkFromBundle = (this as? AndroidRunConfiguration)?.DEPLOY_APK_FROM_BUNDLE ?: false,
diff --git a/project-system-gradle/src/com/android/tools/idea/run/configuration/AndroidBaselineProfileConfigurationExecutor.kt b/project-system-gradle/src/com/android/tools/idea/run/configuration/AndroidBaselineProfileConfigurationExecutor.kt
index 1c3da19..a005d25 100644
--- a/project-system-gradle/src/com/android/tools/idea/run/configuration/AndroidBaselineProfileConfigurationExecutor.kt
+++ b/project-system-gradle/src/com/android/tools/idea/run/configuration/AndroidBaselineProfileConfigurationExecutor.kt
@@ -17,6 +17,7 @@
 
 import com.android.ddmlib.IDevice
 import com.android.tools.idea.execution.common.AndroidConfigurationExecutor
+import com.android.tools.idea.execution.common.AndroidSessionInfo
 import com.android.tools.idea.execution.common.getProcessHandlersForDevices
 import com.android.tools.idea.execution.common.stats.RunStats
 import com.android.tools.idea.execution.common.stats.track
@@ -184,6 +185,7 @@
                        }, AppExecutorUtil.getAppExecutorService())
       }
 
+    AndroidSessionInfo.create(handler, devices, "Baseline Profile Task: ${externalTaskId.id}")
     return createRunContentDescriptor(handler, console, env)
   }
 
diff --git a/project-system-gradle/src/com/android/tools/idea/run/configuration/AndroidBaselineProfileRunConfiguration.kt b/project-system-gradle/src/com/android/tools/idea/run/configuration/AndroidBaselineProfileRunConfiguration.kt
index 0931003..cc5de1f 100644
--- a/project-system-gradle/src/com/android/tools/idea/run/configuration/AndroidBaselineProfileRunConfiguration.kt
+++ b/project-system-gradle/src/com/android/tools/idea/run/configuration/AndroidBaselineProfileRunConfiguration.kt
@@ -11,7 +11,6 @@
 import com.android.tools.idea.run.AndroidRunConfigurationBase
 import com.android.tools.idea.run.AndroidRunConfigurationFactoryBase
 import com.android.tools.idea.run.DeviceFutures
-import com.android.tools.idea.run.PreferGradleMake
 import com.android.tools.idea.run.ValidationError
 import com.android.tools.idea.run.configuration.BaselineProfileRunLineMarkerContributor.Companion.anyTopLevelJavaRule
 import com.android.tools.idea.run.configuration.BaselineProfileRunLineMarkerContributor.Companion.anyTopLevelKtRule
@@ -28,10 +27,8 @@
 import com.intellij.execution.configurations.ConfigurationType
 import com.intellij.execution.configurations.ConfigurationTypeUtil
 import com.intellij.execution.configurations.RunConfiguration
-import com.intellij.execution.configurations.RunConfigurationWithSuppressedDefaultDebugAction
 import com.intellij.execution.configurations.WithoutOwnBeforeRunSteps
 import com.intellij.execution.runners.ExecutionEnvironment
-import com.intellij.execution.runners.RunConfigurationWithSuppressedDefaultRunAction
 import com.intellij.lang.java.JavaLanguage
 import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil
 import com.intellij.openapi.options.SettingsEditor
@@ -125,7 +122,7 @@
 }
 
 class AndroidBaselineProfileRunConfiguration(project: Project, factory: ConfigurationFactory, name: String? = factory.name) :
-  AndroidRunConfigurationBase(project, factory, name, true), RunConfigurationWithSuppressedDefaultRunAction, RunConfigurationWithSuppressedDefaultDebugAction, PreferGradleMake, WithoutOwnBeforeRunSteps {
+  AndroidRunConfigurationBase(project, factory, name, true), WithoutOwnBeforeRunSteps {
 
   @JvmField
   var generateAllVariants: Boolean = false
diff --git a/project-system-gradle/src/org/jetbrains/kotlin/android/models/KotlinModelConverter.kt b/project-system-gradle/src/org/jetbrains/kotlin/android/models/KotlinModelConverter.kt
index e8e9dff..804ad69 100644
--- a/project-system-gradle/src/org/jetbrains/kotlin/android/models/KotlinModelConverter.kt
+++ b/project-system-gradle/src/org/jetbrains/kotlin/android/models/KotlinModelConverter.kt
@@ -184,6 +184,9 @@
     mlModelBindingEnabled = booleanFlagValuesList.first {
       it.flag == AndroidGradlePluginProjectFlags.BooleanFlag.ML_MODEL_BINDING
     }.value,
+    androidResourcesEnabled = booleanFlagValuesList.first {
+      it.flag == AndroidGradlePluginProjectFlags.BooleanFlag.BUILD_FEATURE_ANDROID_RESOURCES
+    }.value,
     unifiedTestPlatformEnabled = booleanFlagValuesList.first {
       it.flag == AndroidGradlePluginProjectFlags.BooleanFlag.UNIFIED_TEST_PLATFORM
     }.value,
diff --git a/project-system-gradle/testSrc/com/android/tools/idea/gradle/dependencies/DependenciesHelperTest.kt b/project-system-gradle/testSrc/com/android/tools/idea/gradle/dependencies/DependenciesHelperTest.kt
index 104dcb6..4814feb 100644
--- a/project-system-gradle/testSrc/com/android/tools/idea/gradle/dependencies/DependenciesHelperTest.kt
+++ b/project-system-gradle/testSrc/com/android/tools/idea/gradle/dependencies/DependenciesHelperTest.kt
@@ -20,7 +20,8 @@
 import com.android.tools.idea.gradle.dsl.model.dependencies.ArtifactDependencySpecImpl
 import com.android.tools.idea.testing.AndroidGradleTestCase
 import com.android.tools.idea.testing.BuildEnvironment
-import com.android.tools.idea.testing.TestProjectPaths
+import com.android.tools.idea.testing.TestProjectPaths.MIGRATE_BUILD_CONFIG
+import com.android.tools.idea.testing.TestProjectPaths.MINIMAL_CATALOG_APPLICATION
 import com.android.tools.idea.testing.TestProjectPaths.SIMPLE_APPLICATION
 import com.android.tools.idea.testing.TestProjectPaths.SIMPLE_APPLICATION_PLUGINS_DSL
 import com.android.tools.idea.testing.TestProjectPaths.SIMPLE_APPLICATION_VERSION_CATALOG
@@ -28,13 +29,16 @@
 import com.android.tools.idea.testing.getTextForFile
 import com.google.common.truth.Truth.assertThat
 import com.intellij.openapi.command.WriteCommandAction
+import com.intellij.openapi.project.Project
 import com.intellij.openapi.util.io.FileUtil
+import com.intellij.openapi.vfs.VfsUtil
+import com.intellij.openapi.vfs.VfsUtil.findFileByIoFile
 import org.apache.commons.lang3.StringUtils.countMatches
-import org.jetbrains.kotlin.idea.configuration.ChangedConfiguratorFiles
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
 import java.io.File
+import java.nio.file.Paths
 
 @RunWith(JUnit4::class)
 class DependenciesHelperTest: AndroidGradleTestCase() {
@@ -454,8 +458,6 @@
            { projectBuildModel, moduleModel, helper ->
              val projectModel = projectBuildModel.projectBuildModel
              assertThat(projectModel).isNotNull()
-             val tracker = ChangedConfiguratorFiles()
-
              val changed = helper.addPlugin("com.android.application",
                               version,
                               false,
@@ -477,6 +479,149 @@
            })
   }
 
+  @Test
+  fun testSmartAddPluginNoCatalog() {
+
+    doTest(SIMPLE_APPLICATION,
+           { projectBuildModel, moduleModel, helper ->
+             val projectModel = projectBuildModel.projectBuildModel
+             assertThat(projectModel).isNotNull()
+
+             val changed = helper.addPlugin("com.google.gms.google-services",
+                                            "com.google.gms:google-services:4.3.14",
+                                            moduleModel)
+             assertThat(changed.size).isEqualTo(2)
+           },
+           {
+             val projectBuildContent = project.getTextForFile("build.gradle")
+             val regex = "\\R\\s*classpath 'com.google.gms:google-services:4.3.14'".toRegex()
+             assertThat(regex.findAll(projectBuildContent).toList().size).isEqualTo(1)
+
+             assertThat(project.doesFileExists("gradle/libs.versions.toml")).isFalse()
+             assertThat(projectBuildContent).doesNotContain("plugins")
+             assertThat(project.getTextForFile("settings.gradle")).doesNotContain("plugins")
+
+             val buildFileContent = project.getTextForFile("app/build.gradle")
+
+             assertThat(countMatches(buildFileContent, "apply plugin: 'com.google.gms.google-services'")).isEqualTo(1)
+           })
+  }
+
+  @Test
+  fun testSmartAddPluginToPluginManagement() {
+    doTest(SIMPLE_APPLICATION,
+           {
+             val file = File(project.basePath, "settings.gradle")
+             val text = file.readText()
+             FileUtil.writeToFile(
+               file,
+               """
+                pluginManagement {
+                  plugins {
+                  }
+                }
+                """.trimIndent() + "\n" + text)
+           },
+           { projectBuildModel, moduleModel, helper ->
+             val projectModel = projectBuildModel.projectBuildModel
+             assertThat(projectModel).isNotNull()
+
+             val changed = helper.addPlugin("com.google.gms.google-services",
+                                            "com.google.gms:google-services:4.3.14",
+                                            moduleModel)
+             assertThat(changed.size).isEqualTo(2)
+           },
+           {
+             val settingsContent = project.getTextForFile("settings.gradle")
+             val regex = "plugins \\{\\n\\s*id 'com.google.gms.google-services'".toRegex()
+             assertThat(regex.findAll(settingsContent).toList().size).isEqualTo(1)
+
+             assertThat(project.doesFileExists("gradle/libs.versions.toml")).isFalse()
+             val projectBuildContent = project.getTextForFile("build.gradle")
+             assertThat(projectBuildContent).doesNotContain("plugins")
+             assertThat(projectBuildContent).doesNotContain("classpath 'com.google.gms:google-services:4.3.14'")
+
+             val buildFileContent = project.getTextForFile("app/build.gradle")
+
+             assertThat(countMatches(buildFileContent,"apply plugin: 'com.google.gms.google-services'")).isEqualTo(1)
+           })
+  }
+
+  @Test
+  fun testSmartAddPluginNoCatalogPluginsBlock() {
+    doTest(MIGRATE_BUILD_CONFIG,
+           { _, moduleModel, helper ->
+             val changed = helper.addPlugin("com.google.gms.google-services",
+                                            "com.google.gms:google-services:4.3.14",
+                                            moduleModel)
+             assertThat(changed.size).isEqualTo(2)
+           },
+           {
+             val projectBuildContent = project.getTextForFile("build.gradle")
+             val regex = "id 'com.google.gms.google-services' version '4.3.14' apply false".toRegex()
+             assertThat(regex.findAll(projectBuildContent).toList().size).isEqualTo(1)
+
+             assertThat(project.doesFileExists("gradle/libs.versions.toml")).isFalse()
+             assertThat(projectBuildContent).doesNotContain("classpath")
+
+             // root project plugins block
+             val moduleBuildContent = project.getTextForFile("app/build.gradle")
+             val regex2 = "id 'com.google.gms.google-services'".toRegex()
+             assertThat(regex2.findAll(moduleBuildContent).toList().size).isEqualTo(1)
+           })
+  }
+
+  @Test
+  fun testSmartAddPluginWithCatalog() {
+    doTest(SIMPLE_APPLICATION_VERSION_CATALOG,
+           { _, moduleModel, helper ->
+             val changed = helper.addPlugin("com.google.gms.google-services",
+                                            "com.google.gms:google-services:4.3.14",
+                                            moduleModel)
+             assertThat(changed.size).isEqualTo(3)
+           },
+           {
+             assertThat(project.getTextForFile("gradle/libs.versions.toml"))
+               .contains("google-gms-google-services = { id = \"com.google.gms.google-services\", version.ref = \"")
+             assertThat(project.getTextForFile("app/build.gradle"))
+               .contains("alias(libs.plugins.google.gms.google.services)")
+
+             val projectBuildContent = project.getTextForFile("build.gradle")
+
+             assertThat(projectBuildContent)
+               .contains("alias(libs.plugins.google.gms.google.services) apply false")
+
+             assertThat(project.getTextForFile("settings.gradle")).doesNotContain("plugins")
+             assertThat(projectBuildContent).doesNotContain("dependencies")
+           })
+  }
+
+
+  @Test
+  fun testSmartAddPluginToNewProject() {
+    doTest(MINIMAL_CATALOG_APPLICATION,
+           { _, moduleModel, helper ->
+             val changed = helper.addPlugin("com.google.gms.google-services",
+                                            "com.google.gms:google-services:4.3.14",
+                                            moduleModel)
+             assertThat(changed.size).isEqualTo(3)
+           },
+           {
+             assertThat(project.getTextForFile("gradle/libs.versions.toml"))
+               .contains("google-gms-google-services = { id = \"com.google.gms.google-services\", version.ref = \"")
+             assertThat(project.getTextForFile("app/build.gradle"))
+               .contains("alias(libs.plugins.google.gms.google.services)")
+
+             val projectBuildContent = project.getTextForFile("build.gradle")
+
+             assertThat(projectBuildContent)
+               .contains("alias(libs.plugins.google.gms.google.services) apply false")
+
+             assertThat(project.getTextForFile("settings.gradle")).doesNotContain("plugins")
+             assertThat(projectBuildContent).doesNotContain("dependencies") // no classpath
+           })
+  }
+
   private fun doTest(projectPath: String,
                      change: (projectBuildModel: ProjectBuildModel, model: GradleBuildModel, helper: DependenciesInserter) -> Unit,
                      assert: () -> Unit) {
@@ -489,6 +634,7 @@
                      assert: () -> Unit) {
     prepareProjectForImport(projectPath)
     updateFiles()
+    VfsUtil.markDirtyAndRefresh(false, true, true, findFileByIoFile(projectFolderPath, true));
     importProject()
     prepareProjectForTest(project, null)
     myFixture.allowTreeAccessForAllFiles()
@@ -505,4 +651,7 @@
     assert.invoke()
   }
 
+  private fun Project.doesFileExists(relativePath:String) =
+    VfsUtil.findFile(Paths.get(basePath, relativePath), false)?.exists() ?: false
+
 }
\ No newline at end of file
diff --git a/project-system-gradle/testSrc/com/android/tools/idea/gradle/project/sync/snapshots/GradleSyncLoggedEventsTestDef.kt b/project-system-gradle/testSrc/com/android/tools/idea/gradle/project/sync/snapshots/GradleSyncLoggedEventsTestDef.kt
index ddc7316..46811e6 100644
--- a/project-system-gradle/testSrc/com/android/tools/idea/gradle/project/sync/snapshots/GradleSyncLoggedEventsTestDef.kt
+++ b/project-system-gradle/testSrc/com/android/tools/idea/gradle/project/sync/snapshots/GradleSyncLoggedEventsTestDef.kt
@@ -20,6 +20,7 @@
 import com.android.tools.analytics.LoggedUsage
 import com.android.tools.analytics.TestUsageTracker
 import com.android.tools.analytics.UsageTracker
+import com.android.tools.idea.gradle.project.sync.internal.KOTLIN_VERSION_FOR_TESTS
 import com.android.tools.idea.testing.AgpVersionSoftwareEnvironmentDescriptor
 import com.android.tools.idea.testing.AgpVersionSoftwareEnvironmentDescriptor.AGP_70
 import com.android.tools.idea.testing.ModelVersion
@@ -161,6 +162,23 @@
           """.trimMargin()
         )
       },
+      GradleSyncLoggedEventsTestDef(
+        namePrefix = "kotlin_versions",
+        testProject = TestProject.KOTLIN_KAPT
+      ) { events ->
+        assertThat(events.dumpKotlinVersions(agpVersion.kotlinVersion)).isEqualTo(
+          """
+            |kotlin version: KOTLIN_VERSION_FOR_TESTS
+            |core-ktx version: 1.0.1
+          """.trimMargin()
+        )
+      },
+      GradleSyncLoggedEventsTestDef(
+        namePrefix = "kotlin_versions",
+        testProject = TestProject.SIMPLE_APPLICATION_VERSION_CATALOG
+      ) { events ->
+        assertThat(events.dumpKotlinVersions(agpVersion.kotlinVersion)).isEqualTo("")
+      }
     )
 
     private fun List<LoggedUsage>.dumpSyncEvents(): String {
@@ -204,6 +222,25 @@
           }.trim()
         }
     }
+
+    private fun List<LoggedUsage>.dumpKotlinVersions(expectedKotlinVersion: String?): String {
+      val expectedKotlinVersion = expectedKotlinVersion ?: KOTLIN_VERSION_FOR_TESTS
+      return map { it.studioEvent }
+        .filter { it.hasGradleSyncStats() }
+        .map { it.kotlinSupport }
+        .last()
+        .let {
+          buildString {
+            if (it.hasKotlinSupportVersion()) {
+              val versionForPrint = it.kotlinSupportVersion.takeIf { it != expectedKotlinVersion } ?: "KOTLIN_VERSION_FOR_TESTS"
+              appendLine("kotlin version: $versionForPrint")
+            }
+            if (it.hasAndroidKtxVersion()) {
+              appendLine("core-ktx version: ${it.androidKtxVersion}")
+            }
+          }.trim()
+        }
+    }
   }
 }
 
diff --git a/project-system-gradle/testSrc/com/android/tools/idea/gradle/project/sync/snapshots/TestProject.kt b/project-system-gradle/testSrc/com/android/tools/idea/gradle/project/sync/snapshots/TestProject.kt
index a80e6ac..d0e9301 100644
--- a/project-system-gradle/testSrc/com/android/tools/idea/gradle/project/sync/snapshots/TestProject.kt
+++ b/project-system-gradle/testSrc/com/android/tools/idea/gradle/project/sync/snapshots/TestProject.kt
@@ -338,7 +338,10 @@
   API_DEPENDENCY(TestProjectToSnapshotPaths.API_DEPENDENCY),
   NAVIGATOR_PACKAGEVIEW_COMMONROOTS(TestProjectToSnapshotPaths.NAVIGATOR_PACKAGEVIEW_COMMONROOTS),
   NAVIGATOR_PACKAGEVIEW_SIMPLE(TestProjectToSnapshotPaths.NAVIGATOR_PACKAGEVIEW_SIMPLE),
-  SIMPLE_APPLICATION_VERSION_CATALOG(TestProjectToSnapshotPaths.SIMPLE_APPLICATION_VERSION_CATALOG),
+  SIMPLE_APPLICATION_VERSION_CATALOG(
+    TestProjectToSnapshotPaths.SIMPLE_APPLICATION_VERSION_CATALOG,
+    isCompatibleWith = { it >= AgpVersionSoftwareEnvironmentDescriptor.AGP_CURRENT }
+  ),
   CUSTOM_SOURCE_TYPE(TestProjectToSnapshotPaths.CUSTOM_SOURCE_TYPE),
   LIGHT_SYNC_REFERENCE(TestProjectToSnapshotPaths.LIGHT_SYNC_REFERENCE),
   NON_TRANSITIVE_R_CLASS_SYMBOL(TestProjectToSnapshotPaths.NON_TRANSITIVE_R_CLASS_SYMBOL),
diff --git a/project-system-gradle/testSrc/com/android/tools/idea/gradle/run/MakeBeforeRunTaskProviderTest.kt b/project-system-gradle/testSrc/com/android/tools/idea/gradle/run/MakeBeforeRunTaskProviderTest.kt
index 1c01a40..db15f96 100644
--- a/project-system-gradle/testSrc/com/android/tools/idea/gradle/run/MakeBeforeRunTaskProviderTest.kt
+++ b/project-system-gradle/testSrc/com/android/tools/idea/gradle/run/MakeBeforeRunTaskProviderTest.kt
@@ -26,7 +26,6 @@
 import com.android.tools.idea.gradle.model.impl.ndk.v1.IdeNativeVariantAbiImpl
 import com.android.tools.idea.gradle.model.impl.ndk.v1.IdeNativeVariantInfoImpl
 import com.android.tools.idea.gradle.project.ProjectStructure
-import com.android.tools.idea.gradle.project.build.invoker.TestCompileType
 import com.android.tools.idea.gradle.project.model.V1NdkModel
 import com.android.tools.idea.gradle.project.sync.GradleSyncState
 import com.android.tools.idea.gradle.run.MakeBeforeRunTaskProvider.SyncNeeded
@@ -102,7 +101,6 @@
     myRunConfiguration = RunConfigurationGradleContext(
       androidFacet = project.gradleModule(modules.first().first)?.androidFacet!!,
       isTestConfiguration = false,
-      testCompileType = TestCompileType.NONE,
       isAdvancedProfilingEnabled = false,
       profilerProperties = null,
       alwaysDeployApkFromBundle = false,
diff --git a/project-system-gradle/testSrc/org/jetbrains/android/refactoring/GradleUsageTypeProviderTest.kt b/project-system-gradle/testSrc/org/jetbrains/android/refactoring/GradleUsageTypeProviderTest.kt
index 1291777..b49a7a9 100644
--- a/project-system-gradle/testSrc/org/jetbrains/android/refactoring/GradleUsageTypeProviderTest.kt
+++ b/project-system-gradle/testSrc/org/jetbrains/android/refactoring/GradleUsageTypeProviderTest.kt
@@ -15,8 +15,10 @@
  */
 package org.jetbrains.android.refactoring
 
+import com.android.tools.idea.concurrency.executeOnPooledThread
 import com.android.tools.idea.testing.caret
 import com.google.common.truth.Truth
+import com.intellij.openapi.application.runReadAction
 import com.intellij.openapi.editor.ex.EditorEx
 import com.intellij.psi.PsiElement
 import com.intellij.usages.UsageTargetUtil
@@ -69,15 +71,19 @@
   }
 
   private fun getUsageType(element: PsiElement) : UsageType? {
-    for (provider in UsageTypeProvider.EP_NAME.extensionList) {
-      return if (provider is UsageTypeProviderEx) {
-        val targets = UsageTargetUtil.findUsageTargets { dataId -> (myFixture.editor as EditorEx).dataContext.getData(dataId) } ?: emptyArray()
-        provider.getUsageType(element, targets) ?: continue
+    return executeOnPooledThread {
+      runReadAction {
+        UsageTypeProvider.EP_NAME.extensionList.firstNotNullOfOrNull {
+          when (it) {
+            is UsageTypeProviderEx ->
+              it.getUsageType(
+                element,
+                UsageTargetUtil.findUsageTargets { dataId -> (myFixture.editor as EditorEx).dataContext.getData(dataId) } ?: emptyArray()
+              )
+            else -> it.getUsageType(element)
+          }
+        }
       }
-      else {
-        provider.getUsageType(element) ?: continue
-      }
-    }
-    return null
+    }.get()
   }
 }
\ No newline at end of file
diff --git a/project-system/src/com/android/tools/idea/projectsystem/AndroidModuleSystem.kt b/project-system/src/com/android/tools/idea/projectsystem/AndroidModuleSystem.kt
index c9abe9a..c2413b7 100644
--- a/project-system/src/com/android/tools/idea/projectsystem/AndroidModuleSystem.kt
+++ b/project-system/src/com/android/tools/idea/projectsystem/AndroidModuleSystem.kt
@@ -305,6 +305,8 @@
   /** Shrinker type in selected variant or null if minification is disabled or shrinker cannot be determined.**/
   val codeShrinker: CodeShrinker? get() = null
 
+  val supportsAndroidResources: Boolean get() = true
+
   /**
    * Whether the R class generated for this module is transitive.
    *
diff --git a/render-resources/src/com/android/tools/configurations/DefaultThemeProvider.kt b/render-resources/src/com/android/tools/configurations/DefaultThemeProvider.kt
index e112a69..7d48766 100644
--- a/render-resources/src/com/android/tools/configurations/DefaultThemeProvider.kt
+++ b/render-resources/src/com/android/tools/configurations/DefaultThemeProvider.kt
@@ -19,7 +19,7 @@
 import com.android.ide.common.rendering.api.ResourceNamespace
 import com.android.ide.common.rendering.api.ResourceReference
 import com.android.resources.ResourceUrl
-import com.intellij.openapi.diagnostic.Logger
+import com.android.tools.environment.Logger
 
 /** [ResourceReference] to the postSplashScreenTheme. */
 private val postSplashAttrReference = ResourceReference.attr(
diff --git a/render-resources/src/com/android/tools/configurations/ResourceResolverCache.java b/render-resources/src/com/android/tools/configurations/ResourceResolverCache.java
index 0b1c3e2..3254b61 100644
--- a/render-resources/src/com/android/tools/configurations/ResourceResolverCache.java
+++ b/render-resources/src/com/android/tools/configurations/ResourceResolverCache.java
@@ -40,6 +40,7 @@
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Table;
+import com.intellij.openapi.application.ReadAction;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
@@ -143,7 +144,7 @@
       Table<ResourceNamespace, ResourceType, ResourceValueMap> configuredAppRes = getCachedAppResources(qualifierString);
       if (configuredAppRes == null) {
         // Get the project resource values based on the current config.
-        configuredAppRes = ResourceRepositoryUtil.getConfiguredResources(resources, fullConfiguration);
+        configuredAppRes = ReadAction.compute(() -> ResourceRepositoryUtil.getConfiguredResources(resources, fullConfiguration));
         cacheAppResources(qualifierString, configuredAppRes);
       }
 
@@ -157,7 +158,7 @@
       ResourceReference theme = null;
       ResourceUrl themeUrl = ResourceUrl.parse(themeStyle);
       if (themeUrl != null) {
-        ResourceNamespace contextNamespace = repositoryManager.getNamespace();
+        ResourceNamespace contextNamespace = ReadAction.compute(repositoryManager::getNamespace);
         theme = themeUrl.resolve(contextNamespace, ResourceNamespace.Resolver.EMPTY_RESOLVER);
       }
 
diff --git a/render-resources/src/com/android/tools/dom/attrs/AttributeDefinition.java b/render-resources/src/com/android/tools/dom/attrs/AttributeDefinition.java
index cd544f3..3cc7121 100644
--- a/render-resources/src/com/android/tools/dom/attrs/AttributeDefinition.java
+++ b/render-resources/src/com/android/tools/dom/attrs/AttributeDefinition.java
@@ -18,7 +18,7 @@
 import com.android.ide.common.rendering.api.AttributeFormat;
 import com.android.ide.common.rendering.api.ResourceNamespace;
 import com.android.ide.common.rendering.api.ResourceReference;
-import com.intellij.openapi.diagnostic.Logger;
+import com.android.tools.environment.Logger;
 import kotlin.text.StringsKt;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
diff --git a/render-resources/src/com/android/tools/dom/attrs/AttributeDefinitionsImpl.java b/render-resources/src/com/android/tools/dom/attrs/AttributeDefinitionsImpl.java
index cb4302b..157e951 100644
--- a/render-resources/src/com/android/tools/dom/attrs/AttributeDefinitionsImpl.java
+++ b/render-resources/src/com/android/tools/dom/attrs/AttributeDefinitionsImpl.java
@@ -36,9 +36,9 @@
 import com.android.ide.common.resources.ResourceRepository;
 import com.android.resources.ResourceType;
 import com.android.resources.base.CommentTrackingXmlPullParser;
+import com.android.tools.environment.Logger;
 import com.google.common.base.Splitter;
 import com.google.common.collect.Maps;
-import com.intellij.openapi.diagnostic.Logger;
 import java.io.BufferedInputStream;
 import java.io.File;
 import java.io.FileInputStream;
diff --git a/render-resources/src/com/android/tools/fonts/DownloadableFontCacheServiceImpl.java b/render-resources/src/com/android/tools/fonts/DownloadableFontCacheServiceImpl.java
index 804080b..b5067d8 100644
--- a/render-resources/src/com/android/tools/fonts/DownloadableFontCacheServiceImpl.java
+++ b/render-resources/src/com/android/tools/fonts/DownloadableFontCacheServiceImpl.java
@@ -25,7 +25,7 @@
 import com.android.ide.common.fonts.FontLoader;
 import com.android.ide.common.fonts.FontProvider;
 import com.android.ide.common.fonts.SdkFontsFolderProvider;
-import com.intellij.openapi.diagnostic.Logger;
+import com.android.tools.environment.Logger;
 import java.awt.Font;
 import java.awt.FontFormatException;
 import java.io.File;
diff --git a/render-resources/src/com/android/tools/fonts/FontFamilyParser.java b/render-resources/src/com/android/tools/fonts/FontFamilyParser.java
index 828302d..73a5641 100644
--- a/render-resources/src/com/android/tools/fonts/FontFamilyParser.java
+++ b/render-resources/src/com/android/tools/fonts/FontFamilyParser.java
@@ -17,7 +17,7 @@
 
 import com.android.ide.common.fonts.MutableFontDetail;
 import com.android.ide.common.fonts.QueryParser;
-import com.intellij.openapi.diagnostic.Logger;
+import com.android.tools.environment.Logger;
 import java.io.InputStream;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
diff --git a/render-resources/src/com/android/tools/res/MultiResourceRepository.java b/render-resources/src/com/android/tools/res/MultiResourceRepository.java
index f273b7a..a513829 100644
--- a/render-resources/src/com/android/tools/res/MultiResourceRepository.java
+++ b/render-resources/src/com/android/tools/res/MultiResourceRepository.java
@@ -25,6 +25,7 @@
 import com.android.ide.common.resources.configuration.FolderConfiguration;
 import com.android.resources.ResourceType;
 import com.android.resources.aar.AarResourceRepository;
+import com.android.tools.environment.Logger;
 import com.google.common.base.Stopwatch;
 import com.google.common.collect.ArrayListMultimap;
 import com.google.common.collect.ImmutableList;
@@ -37,7 +38,6 @@
 import com.google.common.collect.Table;
 import com.google.common.collect.Tables;
 import com.google.common.util.concurrent.MoreExecutors;
-import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.util.SmartList;
 import it.unimi.dsi.fastutil.objects.Object2IntMap;
 import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
diff --git a/render-resources/src/com/android/tools/res/ids/ResourceClassGenerator.java b/render-resources/src/com/android/tools/res/ids/ResourceClassGenerator.java
index ae9cd7d..4862a34 100644
--- a/render-resources/src/com/android/tools/res/ids/ResourceClassGenerator.java
+++ b/render-resources/src/com/android/tools/res/ids/ResourceClassGenerator.java
@@ -23,9 +23,9 @@
 import com.android.ide.common.resources.ResourceRepository;
 import com.android.resources.RClassNaming;
 import com.android.resources.ResourceType;
+import com.android.tools.environment.Logger;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
-import com.intellij.openapi.diagnostic.Logger;
 import it.unimi.dsi.fastutil.ints.IntArrayList;
 import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
 import org.jetbrains.annotations.NotNull;
diff --git a/render-resources/src/com/android/tools/sdk/AndroidTargetData.java b/render-resources/src/com/android/tools/sdk/AndroidTargetData.java
index 6ad18e5..96e8ca7 100644
--- a/render-resources/src/com/android/tools/sdk/AndroidTargetData.java
+++ b/render-resources/src/com/android/tools/sdk/AndroidTargetData.java
@@ -28,6 +28,7 @@
 import com.android.resources.ResourceType;
 import com.android.resources.ResourceVisibility;
 import com.android.sdklib.IAndroidTarget;
+import com.android.tools.environment.Logger;
 import com.android.tools.idea.layoutlib.LayoutLibrary;
 import com.android.tools.idea.layoutlib.LayoutLibraryLoader;
 import com.android.tools.idea.layoutlib.RenderingException;
@@ -35,7 +36,6 @@
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Maps;
-import com.intellij.openapi.diagnostic.Logger;
 import java.lang.ref.SoftReference;
 import java.io.BufferedReader;
 import java.io.File;
diff --git a/render-resources/src/com/android/tools/sdk/LoggerProgressIndicator.kt b/render-resources/src/com/android/tools/sdk/LoggerProgressIndicator.kt
index 7d12010..486bc34 100644
--- a/render-resources/src/com/android/tools/sdk/LoggerProgressIndicator.kt
+++ b/render-resources/src/com/android/tools/sdk/LoggerProgressIndicator.kt
@@ -16,7 +16,7 @@
 package com.android.tools.sdk
 
 import com.android.repository.api.ProgressIndicatorAdapter
-import com.intellij.openapi.diagnostic.Logger
+import com.android.tools.environment.Logger
 
 /** Copy of [StudioLoggerProgressIndicator]. */
 internal class LoggerProgressIndicator(c: Class<*>) : ProgressIndicatorAdapter() {
diff --git a/rendering/src/com/android/tools/rendering/ActionBarHandler.java b/rendering/src/com/android/tools/rendering/ActionBarHandler.java
index 7de53ec..65793c2 100644
--- a/rendering/src/com/android/tools/rendering/ActionBarHandler.java
+++ b/rendering/src/com/android/tools/rendering/ActionBarHandler.java
@@ -23,9 +23,9 @@
 import com.android.resources.ResourceFolderType;
 import com.android.tools.dom.ActivityAttributesSnapshot;
 import com.android.tools.rendering.api.RenderModelManifest;
+import com.android.tools.rendering.api.RenderModelModule;
 import com.android.tools.rendering.parsers.RenderXmlFile;
 import com.android.tools.rendering.security.RenderSecurityManager;
-import com.android.tools.res.ResourceRepositoryManager;
 import com.google.common.base.Splitter;
 import com.google.common.collect.ImmutableList;
 import com.intellij.openapi.application.ModalityState;
@@ -60,7 +60,6 @@
   @Nullable private final Object myCredential;
   @NotNull private final RenderTask myRenderTask;
 
-  @NotNull private final ResourceRepositoryManager myResourceRepositoryManager;
   @Nullable private ImmutableList<ResourceReference> myMenus;
 
   ActionBarHandler(
@@ -68,7 +67,6 @@
     @Nullable Object credential) {
     myRenderTask = renderTask;
     myCredential = credential;
-    myResourceRepositoryManager = renderTask.getContext().getModule().getResourceRepositoryManager();
   }
 
   @Override
@@ -141,7 +139,11 @@
 
     boolean token = RenderSecurityManager.enterSafeRegion(myCredential);
     try {
-      ResourceNamespace namespace = myResourceRepositoryManager.getNamespace();
+      RenderModelModule renderModule = myRenderTask.getContext().getModule();
+      if (renderModule.isDisposed()) {
+        return Collections.emptyList();
+      }
+      ResourceNamespace namespace = renderModule.getResourceRepositoryManager().getNamespace();
       RenderXmlFile xmlFile = myRenderTask.getXmlFile();
       String commaSeparatedMenus = xmlFile == null ? null : xmlFile.getRootTagAttribute(ATTR_MENU, TOOLS_URI);
       if (commaSeparatedMenus != null) {
diff --git a/safemode/src/com/intellij/android/safemode/SafeMode.java b/safemode/src/com/intellij/android/safemode/SafeMode.java
index 4c878c1..40936cc 100644
--- a/safemode/src/com/intellij/android/safemode/SafeMode.java
+++ b/safemode/src/com/intellij/android/safemode/SafeMode.java
@@ -18,6 +18,7 @@
 import com.intellij.ide.AppLifecycleListener;
 import com.intellij.ide.ApplicationLoadListener;
 import com.intellij.openapi.application.Application;
+import com.intellij.openapi.application.ApplicationInfo;
 import com.intellij.openapi.application.ApplicationManager;
 import com.intellij.openapi.application.PathManager;
 import com.intellij.openapi.diagnostic.Logger;
@@ -30,7 +31,6 @@
 
 public class SafeMode implements ApplicationLoadListener {
   private static final Logger LOG = Logger.getInstance(SafeMode.class);
-  private static final String CRASH_DETECTION_FILE = "android.studio.safe.mode.sentinel";
 
   @Override
   public void beforeApplicationLoaded(@NotNull Application application, @NotNull Path path) {
@@ -42,7 +42,7 @@
       return;
     }
 
-    File[] studioCrashFiles = getFiles(System.getProperty("java.io.tmpdir"), CRASH_DETECTION_FILE);
+    File[] studioCrashFiles = getFiles(System.getProperty("java.io.tmpdir"), getCrashDetectionFile());
 
     if (System.getProperty("studio.safe.mode") != null) {
       // If we entered safe mode, register a cleanup handler and return.
@@ -56,7 +56,7 @@
       // Create crash files to detect if we've crashed for next time.
       try {
         //noinspection ResultOfMethodCallIgnored
-        File.createTempFile(CRASH_DETECTION_FILE, "");
+        File.createTempFile(getCrashDetectionFile(), "");
       } catch (Exception e) {
         LOG.error("Unexpected error while creating safe mode crash detection file ", e);
       }
@@ -116,10 +116,17 @@
     return files == null ? new File[0] : files;
   }
 
+  private static String getCrashDetectionFile() {
+    return "android.studio.safe.mode." + ApplicationInfo.getInstance().getBuild() + ".sentinel";
+  }
+
   private static boolean safeModeDisabled() {
     if (System.getProperty("disable.safe.mode") != null) {
       return true;
     }
+    if (System.getenv("DISABLE_SAFE_MODE") != null) {
+      return true;
+    }
     File[] files = getFiles(PathManager.getBinPath(), "disable_safe_mode");
     return files.length > 0;
   }
@@ -129,7 +136,7 @@
       @Override
       public void appWillBeClosed(boolean isRestart) {
         //  SafeMode crash detection clean up
-        File[] studioCrashFiles = getFiles(System.getProperty("java.io.tmpdir"), CRASH_DETECTION_FILE);
+        File[] studioCrashFiles = getFiles(System.getProperty("java.io.tmpdir"), getCrashDetectionFile());
 
         for (File f : studioCrashFiles) {
           //noinspection ResultOfMethodCallIgnored
diff --git a/safemode/tests/test_safe_mode.py b/safemode/tests/test_safe_mode.py
index e431673..ae3980a 100644
--- a/safemode/tests/test_safe_mode.py
+++ b/safemode/tests/test_safe_mode.py
@@ -112,13 +112,21 @@
             continue
           mac_jvm_args.add(arg)
 
-    self.assertEqual(mac_jvm_args, mac_safe_jvm_args)
-    self.assertEqual(lin_jvm_args, lin_safe_jvm_args)
-    self.assertEqual(win_jvm_args, win_safe_jvm_args)
-    self.assertEqual(mac_jars, mac_safe_jars)
-    self.assertEqual(linux_jars, linux_safe_jars)
-    self.assertEqual(win_jars, win_safe_jars)
+    try:
+      self.assertEqual(mac_jvm_args, mac_safe_jvm_args)
+      self.assertEqual(lin_jvm_args, lin_safe_jvm_args)
+      self.assertEqual(win_jvm_args, win_safe_jvm_args)
+      self.assertEqual(mac_jars, mac_safe_jars)
+      self.assertEqual(linux_jars, linux_safe_jars)
+      self.assertEqual(win_jars, win_safe_jars)
+    except AssertionError as e:
+      print("""
+        There is a mismatch in the safe mode scripts. To regenerate the content of the scripts,
+        run the following script manually:
 
+        //tools/adt/idea/safemode/script-generation/generate_safe_mode_scripts.py
+      """)
+      raise e
 
 if __name__ == "__main__":
   unittest.main()
\ No newline at end of file
diff --git a/searchable-options/studio-bot/sml.jar/search/sml.jar.searchableOptions.xml b/searchable-options/studio-bot/sml.jar/search/sml.jar.searchableOptions.xml
index 64e19f8..9143e88 100644
--- a/searchable-options/studio-bot/sml.jar/search/sml.jar.searchableOptions.xml
+++ b/searchable-options/studio-bot/sml.jar/search/sml.jar.searchableOptions.xml
@@ -1,9 +1,6 @@
 <options>
   <configurable id="preferences.keymap" configurable_name="Keymap">
     <option name="" path="ActionManager" hit="" />
-    <option name="ask" path="ActionManager" hit="Ask Studio Bot" />
-    <option name="bot" path="ActionManager" hit="Ask Studio Bot" />
-    <option name="studio" path="ActionManager" hit="Ask Studio Bot" />
     <option name="code" path="ActionManager" hit="Comment Code" />
     <option name="comment" path="ActionManager" hit="Comment Code" />
     <option name="code" path="ActionManager" hit="Document Code" />
@@ -12,6 +9,9 @@
     <option name="explain" path="ActionManager" hit="Explain Code" />
     <option name="code" path="ActionManager" hit="Simplify Code" />
     <option name="simplify" path="ActionManager" hit="Simplify Code" />
+    <option name="bot" path="ActionManager" hit="Studio Bot" />
+    <option name="studio" path="ActionManager" hit="Studio Bot" />
+    <option name="transform" path="ActionManager" hit="Transform..." />
   </configurable>
   <configurable id="com.android.studio.ml.bot.mainConfigurable" configurable_name="Studio Bot">
     <option name="" hit=" Augment responses with information from your codebase" />
diff --git a/streaming/screen-sharing-agent/app/src/main/cpp/audio_streamer.h b/streaming/screen-sharing-agent/app/src/main/cpp/audio_streamer.h
index 315dfca..3190117 100644
--- a/streaming/screen-sharing-agent/app/src/main/cpp/audio_streamer.h
+++ b/streaming/screen-sharing-agent/app/src/main/cpp/audio_streamer.h
@@ -59,7 +59,7 @@
   int64_t last_presentation_timestamp_us_ = 0;
   int32_t num_frames_in_last_sample_ = 0;
 
-  std::mutex mutex_;
+  std::recursive_mutex mutex_;
   AMediaCodec* codec_ = nullptr;  // GUARDED_BY(mutex_)
   AMediaCodec* running_codec_ = nullptr;  // GUARDED_BY(mutex_)
   bool codec_stop_pending_ = false;  // GUARDED_BY(mutex_)
diff --git a/streaming/screen-sharing-agent/app/src/main/cpp/display_streamer.h b/streaming/screen-sharing-agent/app/src/main/cpp/display_streamer.h
index 5a54e8e..2fbefdb 100644
--- a/streaming/screen-sharing-agent/app/src/main/cpp/display_streamer.h
+++ b/streaming/screen-sharing-agent/app/src/main/cpp/display_streamer.h
@@ -112,7 +112,7 @@
   int32_t consequent_deque_error_count_ = 0;
   std::atomic_bool streamer_stopped_ = true;
 
-  std::mutex mutex_;
+  std::recursive_mutex mutex_;
   DisplayInfo display_info_;  // GUARDED_BY(mutex_)
   Size max_video_resolution_;  // GUARDED_BY(mutex_)
   int32_t video_orientation_;  // GUARDED_BY(mutex_)
diff --git a/streaming/src/com/android/tools/idea/streaming/device/actions/DeviceBackButtonAction.kt b/streaming/src/com/android/tools/idea/streaming/device/actions/DeviceBackButtonAction.kt
index 1034b36..9988828 100644
--- a/streaming/src/com/android/tools/idea/streaming/device/actions/DeviceBackButtonAction.kt
+++ b/streaming/src/com/android/tools/idea/streaming/device/actions/DeviceBackButtonAction.kt
@@ -20,4 +20,4 @@
 /**
  * Simulates pressing the Back button on an Android device.
  */
-internal class DeviceBackButtonAction : DevicePushButtonAction(AKEYCODE_BACK)
+internal class DeviceBackButtonAction : DevicePushButtonAction(AKEYCODE_BACK, configFilter = { !it.isAutomotive })
diff --git a/streaming/src/com/android/tools/idea/streaming/device/actions/DeviceOverviewButtonAction.kt b/streaming/src/com/android/tools/idea/streaming/device/actions/DeviceOverviewButtonAction.kt
index 87b2454..693e4a3 100644
--- a/streaming/src/com/android/tools/idea/streaming/device/actions/DeviceOverviewButtonAction.kt
+++ b/streaming/src/com/android/tools/idea/streaming/device/actions/DeviceOverviewButtonAction.kt
@@ -20,4 +20,4 @@
 /**
  * Simulates pressing the Overview button on an Android device.
  */
-internal class DeviceOverviewButtonAction : DevicePushButtonAction(AKEYCODE_APP_SWITCH, configFilter = { !it.isWatch })
+internal class DeviceOverviewButtonAction : DevicePushButtonAction(AKEYCODE_APP_SWITCH, configFilter = { !it.isWatch && !it.isAutomotive })
diff --git a/streaming/src/com/android/tools/idea/streaming/device/screenshot/DeviceScreenshotPostprocessor.kt b/streaming/src/com/android/tools/idea/streaming/device/screenshot/DeviceScreenshotDecorator.kt
similarity index 93%
rename from streaming/src/com/android/tools/idea/streaming/device/screenshot/DeviceScreenshotPostprocessor.kt
rename to streaming/src/com/android/tools/idea/streaming/device/screenshot/DeviceScreenshotDecorator.kt
index a946d88..b00999e 100644
--- a/streaming/src/com/android/tools/idea/streaming/device/screenshot/DeviceScreenshotPostprocessor.kt
+++ b/streaming/src/com/android/tools/idea/streaming/device/screenshot/DeviceScreenshotDecorator.kt
@@ -22,8 +22,8 @@
 import com.android.tools.adtui.device.DeviceArtPainter
 import com.android.tools.idea.streaming.emulator.SkinDefinitionCache
 import com.android.tools.idea.ui.screenshot.FramingOption
+import com.android.tools.idea.ui.screenshot.ScreenshotDecorator
 import com.android.tools.idea.ui.screenshot.ScreenshotImage
-import com.android.tools.idea.ui.screenshot.ScreenshotPostprocessor
 import java.awt.Color
 import java.awt.Rectangle
 import java.awt.image.BufferedImage
@@ -32,9 +32,9 @@
 /**
  * Screenshot framer accepting a [DeviceFramingOption].
  */
-internal class DeviceScreenshotPostprocessor : ScreenshotPostprocessor {
+internal class DeviceScreenshotDecorator : ScreenshotDecorator {
   @Slow
-  override fun addFrame(screenshotImage: ScreenshotImage, framingOption: FramingOption?, backgroundColor: Color?): BufferedImage {
+  override fun decorate(screenshotImage: ScreenshotImage, framingOption: FramingOption?, backgroundColor: Color?): BufferedImage {
     if (framingOption == null) {
       return if (screenshotImage.isRoundDisplay) ellipticalClip(screenshotImage.image, backgroundColor) else screenshotImage.image
     }
diff --git a/streaming/src/com/android/tools/idea/streaming/device/screenshot/DeviceScreenshotOptions.kt b/streaming/src/com/android/tools/idea/streaming/device/screenshot/DeviceScreenshotOptions.kt
index 083b3c7..0c37c90 100644
--- a/streaming/src/com/android/tools/idea/streaming/device/screenshot/DeviceScreenshotOptions.kt
+++ b/streaming/src/com/android/tools/idea/streaming/device/screenshot/DeviceScreenshotOptions.kt
@@ -18,6 +18,7 @@
 import com.android.prefs.AndroidLocationsSingleton
 import com.android.resources.ScreenOrientation
 import com.android.resources.ScreenRound
+import com.android.sdklib.deviceprovisioner.DeviceType
 import com.android.sdklib.devices.Device
 import com.android.sdklib.devices.DeviceManager.DeviceFilter
 import com.android.sdklib.devices.Screen
@@ -27,11 +28,10 @@
 import com.android.tools.idea.avdmanager.SkinUtils
 import com.android.tools.idea.streaming.device.DeviceConfiguration
 import com.android.tools.idea.streaming.device.DeviceView
-import com.android.tools.idea.ui.screenshot.DeviceType
 import com.android.tools.idea.ui.screenshot.FramingOption
 import com.android.tools.idea.ui.screenshot.ScreenshotAction
+import com.android.tools.idea.ui.screenshot.ScreenshotDecorator
 import com.android.tools.idea.ui.screenshot.ScreenshotImage
-import com.android.tools.idea.ui.screenshot.ScreenshotPostprocessor
 import com.android.tools.idea.ui.screenshot.ScreenshotViewer
 import com.android.tools.sdk.DeviceManagers
 import java.awt.image.BufferedImage
@@ -57,7 +57,7 @@
 
   override val screenshotViewerOptions: EnumSet<ScreenshotViewer.Option> = EnumSet.noneOf(ScreenshotViewer.Option::class.java)
 
-  override val screenshotPostprocessor: ScreenshotPostprocessor = DeviceScreenshotPostprocessor()
+  override val screenshotDecorator: ScreenshotDecorator = DeviceScreenshotDecorator()
   private val deviceModel: String? = deviceConfiguration.deviceModel
   private val isWatch: Boolean = deviceConfiguration.isWatch
   private val isAutomotive: Boolean = deviceConfiguration.isAutomotive
diff --git a/streaming/src/com/android/tools/idea/streaming/emulator/EmulatorConfiguration.kt b/streaming/src/com/android/tools/idea/streaming/emulator/EmulatorConfiguration.kt
index 703c50e..cafe085 100644
--- a/streaming/src/com/android/tools/idea/streaming/emulator/EmulatorConfiguration.kt
+++ b/streaming/src/com/android/tools/idea/streaming/emulator/EmulatorConfiguration.kt
@@ -19,6 +19,7 @@
 import com.android.emulator.control.DisplayModeValue
 import com.android.emulator.control.Posture.PostureValue
 import com.android.emulator.control.Rotation.SkinRotation
+import com.android.sdklib.deviceprovisioner.DeviceType
 import com.android.tools.idea.flags.StudioFlags
 import com.android.tools.idea.streaming.core.FOLDING_STATE_ICONS
 import com.google.common.base.Splitter
@@ -37,7 +38,7 @@
   val displaySize: Dimension,
   val density: Int,
   val skinFolder: Path?,
-  val isWearOs: Boolean,
+  val deviceType: DeviceType,
   val hasOrientationSensors: Boolean,
   val hasAudioOutput: Boolean,
   val initialOrientation: SkinRotation,
@@ -82,7 +83,13 @@
         else -> SkinRotation.PORTRAIT
       }
       val skinPath = getSkinPath(configIni, androidSdkRoot)
-      val isWearOs = configIni["tag.id"]?.equals("android-wear", ignoreCase = true) ?: false
+      val tagId = configIni["tag.id"]
+      val deviceType = when {
+        tagId?.startsWith("android-automotive") == true -> DeviceType.AUTOMOTIVE
+        tagId == "google-tv" -> DeviceType.TV
+        tagId == "android-wear" -> DeviceType.WEAR
+        else -> DeviceType.HANDHELD
+      }
       val hasOrientationSensors = configIni["hw.sensors.orientation"]?.equals("yes", ignoreCase = true) ?: true
       val postureMode = if (StudioFlags.EMBEDDED_EMULATOR_RESIZABLE_FOLDING.get())
           parseInt(hardwareIni["hw.sensor.hinge.resizable.config"], -1) else -1
@@ -137,7 +144,7 @@
                                    displaySize = Dimension(displayWidth, displayHeight),
                                    density = density,
                                    skinFolder = skinPath,
-                                   isWearOs = isWearOs,
+                                   deviceType = deviceType,
                                    hasOrientationSensors = hasOrientationSensors,
                                    hasAudioOutput = hasAudioOutput,
                                    initialOrientation = initialOrientation,
diff --git a/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorBackButtonAction.kt b/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorBackButtonAction.kt
index 91b53fb..d98f3e4 100644
--- a/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorBackButtonAction.kt
+++ b/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorBackButtonAction.kt
@@ -15,8 +15,9 @@
  */
 package com.android.tools.idea.streaming.emulator.actions
 
+import com.android.sdklib.deviceprovisioner.DeviceType
+
 /**
  * Simulates pressing the Back button on an Android virtual device.
  */
-class EmulatorBackButtonAction : EmulatorPushButtonAction("GoBack") {
-}
\ No newline at end of file
+class EmulatorBackButtonAction : EmulatorPushButtonAction("GoBack", configFilter = { it.deviceType != DeviceType.AUTOMOTIVE })
\ No newline at end of file
diff --git a/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorHomeButtonAction.kt b/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorHomeButtonAction.kt
index f210899..f0dd81c 100644
--- a/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorHomeButtonAction.kt
+++ b/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorHomeButtonAction.kt
@@ -15,7 +15,9 @@
  */
 package com.android.tools.idea.streaming.emulator.actions
 
+import com.android.sdklib.deviceprovisioner.DeviceType
+
 /**
  * Simulates pressing the Home button on an Android virtual device.
  */
-class EmulatorHomeButtonAction : EmulatorPushButtonAction("GoHome", configFilter = { !it.isWearOs || it.api < 28 })
\ No newline at end of file
+class EmulatorHomeButtonAction : EmulatorPushButtonAction("GoHome", configFilter = { it.deviceType != DeviceType.WEAR || it.api < 28 })
\ No newline at end of file
diff --git a/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorOverviewButtonAction.kt b/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorOverviewButtonAction.kt
index e5743f7..c196835 100644
--- a/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorOverviewButtonAction.kt
+++ b/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorOverviewButtonAction.kt
@@ -15,7 +15,11 @@
  */
 package com.android.tools.idea.streaming.emulator.actions
 
+import com.android.sdklib.deviceprovisioner.DeviceType
+
 /**
  * Simulates pressing the Overview button on an Android virtual device.
  */
-class EmulatorOverviewButtonAction : EmulatorPushButtonAction("AppSwitch", configFilter = { !it.isWearOs || it.api < 28 })
\ No newline at end of file
+class EmulatorOverviewButtonAction :
+    EmulatorPushButtonAction("AppSwitch",
+                             configFilter = { it.deviceType != DeviceType.AUTOMOTIVE && (it.deviceType != DeviceType.WEAR || it.api < 28) })
\ No newline at end of file
diff --git a/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorPalmAction.kt b/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorPalmAction.kt
index ecb6e89..d4ecfde 100644
--- a/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorPalmAction.kt
+++ b/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorPalmAction.kt
@@ -15,7 +15,9 @@
  */
 package com.android.tools.idea.streaming.emulator.actions
 
+import com.android.sdklib.deviceprovisioner.DeviceType
+
 /**
  * Simulates the Palm gesture on an Android Wear virtual device.
  */
-internal class EmulatorPalmAction : EmulatorKeypressAction("Standby", configFilter = { it.isWearOs && it.api >= 28 })
\ No newline at end of file
+internal class EmulatorPalmAction : EmulatorKeypressAction("Standby", configFilter = { it.deviceType == DeviceType.WEAR && it.api >= 28 })
\ No newline at end of file
diff --git a/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorPowerAndVolumeUpButtonAction.kt b/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorPowerAndVolumeUpButtonAction.kt
index ef06b6d..ef960b7 100644
--- a/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorPowerAndVolumeUpButtonAction.kt
+++ b/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorPowerAndVolumeUpButtonAction.kt
@@ -15,9 +15,11 @@
  */
 package com.android.tools.idea.streaming.emulator.actions
 
+import com.android.sdklib.deviceprovisioner.DeviceType
+
 /**
  * Simulates pressing the Power and the Volume Up buttons together on an Android virtual device.
  * This button combination invokes Android Power Menu on devices with API >= 31.
  */
 internal class EmulatorPowerAndVolumeUpButtonAction :
-  EmulatorPushButtonAction("Power", modifierKeyName = "VolumeUp", configFilter = { !it.isWearOs && it.api >= 31 })
\ No newline at end of file
+  EmulatorPushButtonAction("Power", modifierKeyName = "VolumeUp", configFilter = { it.deviceType != DeviceType.WEAR && it.api >= 31 })
\ No newline at end of file
diff --git a/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorPowerButtonAction.kt b/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorPowerButtonAction.kt
index 588431e..6186771 100644
--- a/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorPowerButtonAction.kt
+++ b/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorPowerButtonAction.kt
@@ -15,7 +15,9 @@
  */
 package com.android.tools.idea.streaming.emulator.actions
 
+import com.android.sdklib.deviceprovisioner.DeviceType
+
 /**
  * Simulates pressing the Power button on an Android virtual device.
  */
-class EmulatorPowerButtonAction : EmulatorPushButtonAction("Power", configFilter = { !it.isWearOs || it.api < 28 })
\ No newline at end of file
+class EmulatorPowerButtonAction : EmulatorPushButtonAction("Power", configFilter = { it.deviceType != DeviceType.WEAR || it.api < 28 })
\ No newline at end of file
diff --git a/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorRotateAction.kt b/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorRotateAction.kt
index 5ebad74..49f1da8 100644
--- a/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorRotateAction.kt
+++ b/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorRotateAction.kt
@@ -17,6 +17,7 @@
 
 import com.android.emulator.control.ParameterValue
 import com.android.emulator.control.PhysicalModelValue
+import com.android.sdklib.deviceprovisioner.DeviceType
 import com.android.tools.idea.protobuf.Empty
 import com.android.tools.idea.streaming.emulator.EmptyStreamObserver
 import com.intellij.openapi.actionSystem.ActionUpdateThread
@@ -28,7 +29,7 @@
  */
 sealed class EmulatorRotateAction(
   private val rotationQuadrants: Int,
-) : AbstractEmulatorAction(configFilter = { it.hasOrientationSensors && !it.isWearOs }) {
+) : AbstractEmulatorAction(configFilter = { it.hasOrientationSensors && it.deviceType != DeviceType.WEAR }) {
 
   override fun actionPerformed(event: AnActionEvent) {
     val emulatorController = getEmulatorController(event) ?: return
diff --git a/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorScreenshotAction.kt b/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorScreenshotAction.kt
index 3f7dcb2..982455d 100644
--- a/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorScreenshotAction.kt
+++ b/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorScreenshotAction.kt
@@ -18,15 +18,15 @@
 import com.android.SdkConstants
 import com.android.emulator.control.Image
 import com.android.emulator.control.ImageFormat
+import com.android.io.writeImage
 import com.android.tools.idea.concurrency.executeOnPooledThread
 import com.android.tools.idea.streaming.emulator.EmptyStreamObserver
 import com.android.tools.idea.streaming.emulator.EmulatorController
 import com.android.tools.idea.streaming.emulator.EmulatorView
 import com.android.tools.idea.streaming.emulator.FutureStreamObserver
-import com.android.tools.idea.ui.screenshot.DeviceType
 import com.android.tools.idea.ui.screenshot.FramingOption
+import com.android.tools.idea.ui.screenshot.ScreenshotDecorator
 import com.android.tools.idea.ui.screenshot.ScreenshotImage
-import com.android.tools.idea.ui.screenshot.ScreenshotPostprocessor
 import com.android.tools.idea.ui.screenshot.ScreenshotSupplier
 import com.android.tools.idea.ui.screenshot.ScreenshotViewer
 import com.google.common.base.Throwables
@@ -39,15 +39,15 @@
 import com.intellij.openapi.fileEditor.FileEditorManager
 import com.intellij.openapi.progress.ProcessCanceledException
 import com.intellij.openapi.project.Project
+import com.intellij.openapi.util.Disposer
 import com.intellij.openapi.util.io.FileUtil
 import com.intellij.openapi.vfs.LocalFileSystem
+import com.intellij.openapi.vfs.VirtualFile
 import java.awt.AlphaComposite
 import java.awt.Color
 import java.awt.Rectangle
 import java.awt.image.BufferedImage
 import java.io.IOException
-import java.nio.file.Files
-import java.nio.file.Path
 import java.util.EnumSet
 import java.util.concurrent.ExecutionException
 import javax.imageio.IIOException
@@ -79,33 +79,33 @@
         val imageBytes = screenshot.image
         val image = ImageIO.read(imageBytes.newInput()) ?: throw IIOException("Corrupted screenshot image")
 
-        val backingFile = FileUtil.createTempFile("screenshot", SdkConstants.DOT_PNG).toPath()
-        Files.newOutputStream(backingFile).use {
-          imageBytes.writeTo(it)
-        }
-
+        val screenshotDecorator = MyScreenshotDecorator(emulatorView)
         val emulatorController = emulatorView.emulator
-        val screenshotImage = ScreenshotImage(image, screenshot.format.rotation.rotationValue, deviceType(emulatorController))
-        val screenshotSupplier = MyScreenshotSupplier(emulatorController)
-        val screenshotFramer = MyScreenshotPostprocessor(emulatorView)
         val framingOptions = if (emulatorController.getSkin() == null) listOf() else listOf(avdFrame)
+        val screenshotImage = ScreenshotImage(image, screenshot.format.rotation.rotationValue, emulatorController.emulatorConfig.deviceType)
+        val decoration = ScreenshotViewer.getDefaultDecoration(screenshotImage, screenshotDecorator, framingOptions.firstOrNull(), project)
+        val processedImage = screenshotDecorator.decorate(screenshotImage, decoration)
+        val file = FileUtil.createTempFile("screenshot", SdkConstants.DOT_PNG).toPath()
+        processedImage.writeImage("PNG", file)
+        val backingFile = LocalFileSystem.getInstance().refreshAndFindFileByNioFile(file) ?: throw IOException("Unable to save screenshot")
+        val screenshotSupplier = MyScreenshotSupplier(emulatorController)
 
         ApplicationManager.getApplication().invokeLater {
-          showScreenshotViewer(project, screenshotImage, backingFile, screenshotSupplier, screenshotFramer, framingOptions)
+          showScreenshotViewer(project, screenshotImage, backingFile, screenshotSupplier, screenshotDecorator, framingOptions)
         }
       }
       catch (e: Exception) {
-        thisLogger().error("Error while displaying screenshot viewer: ", e)
+        thisLogger().error("Error while displaying screenshot viewer", e)
       }
     }
 
     private fun showScreenshotViewer(project: Project,
                                      screenshotImage: ScreenshotImage,
-                                     backingFile: Path,
+                                     backingFile: VirtualFile,
                                      screenshotSupplier: ScreenshotSupplier,
-                                     screenshotPostprocessor: ScreenshotPostprocessor,
+                                     screenshotDecorator: ScreenshotDecorator,
                                      framingOptions: List<FramingOption>) {
-      val viewer = object : ScreenshotViewer(project, screenshotImage, backingFile, screenshotSupplier, screenshotPostprocessor,
+      val viewer = object : ScreenshotViewer(project, screenshotImage, backingFile, screenshotSupplier, screenshotDecorator,
                                              framingOptions, 0, EnumSet.noneOf(Option::class.java)) {
         override fun doOKAction() {
           super.doOKAction()
@@ -124,6 +124,10 @@
 
   private class MyScreenshotSupplier(val emulatorController: EmulatorController) : ScreenshotSupplier {
 
+    init {
+      Disposer.register(emulatorController, this)
+    }
+
     override fun captureScreenshot(): ScreenshotImage {
       val receiver = FutureStreamObserver<Image>()
       emulatorController.getScreenshot(pngFormat(), receiver)
@@ -131,7 +135,7 @@
       try {
         val screenshot = receiver.futureResult.get()
         val image = ImageIO.read(screenshot.image.newInput()) ?: throw RuntimeException("Corrupted screenshot image")
-        return ScreenshotImage(image, screenshot.format.rotation.rotationValue, deviceType(emulatorController))
+        return ScreenshotImage(image, screenshot.format.rotation.rotationValue, emulatorController.emulatorConfig.deviceType)
       }
       catch (e: InterruptedException) {
         throw ProcessCanceledException()
@@ -148,11 +152,14 @@
         throw e
       }
     }
+
+    override fun dispose() {
+    }
   }
 
-  private class MyScreenshotPostprocessor(val emulatorView: EmulatorView) : ScreenshotPostprocessor {
+  private class MyScreenshotDecorator(val emulatorView: EmulatorView) : ScreenshotDecorator {
 
-    override fun addFrame(screenshotImage: ScreenshotImage, framingOption: FramingOption?, backgroundColor: Color?): BufferedImage {
+    override fun decorate(screenshotImage: ScreenshotImage, framingOption: FramingOption?, backgroundColor: Color?): BufferedImage {
       val image = screenshotImage.image
       val w = image.width
       val h = image.height
@@ -196,9 +203,3 @@
 }
 
 private fun pngFormat() = ImageFormat.newBuilder().setFormat(ImageFormat.ImgFormat.PNG).build()
-
-private fun deviceType(emulatorController: EmulatorController): DeviceType =
-  when {
-    emulatorController.emulatorConfig.isWearOs -> DeviceType.WEAR
-    else -> DeviceType.PHONE
-  }
diff --git a/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorTiltAction.kt b/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorTiltAction.kt
index 33adb58..64ca5e5 100644
--- a/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorTiltAction.kt
+++ b/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorTiltAction.kt
@@ -18,13 +18,14 @@
 import com.android.emulator.control.ParameterValue
 import com.android.emulator.control.PhysicalModelValue
 import com.android.emulator.control.PhysicalModelValue.PhysicalType.WRIST_TILT
+import com.android.sdklib.deviceprovisioner.DeviceType
 import com.intellij.openapi.actionSystem.ActionUpdateThread
 import com.intellij.openapi.actionSystem.AnActionEvent
 
 /**
  * Triggers the tilt sensor on an Android Wear virtual device.
  */
-internal class EmulatorTiltAction : AbstractEmulatorAction(configFilter = { it.isWearOs && it.api >= 28 }) {
+internal class EmulatorTiltAction : AbstractEmulatorAction(configFilter = { it.deviceType == DeviceType.WEAR && it.api >= 28 }) {
 
   override fun actionPerformed(event: AnActionEvent) {
     val emulatorController = getEmulatorController(event) ?: return
diff --git a/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorVolumeDownButtonAction.kt b/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorVolumeDownButtonAction.kt
index 085f132..03848df 100644
--- a/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorVolumeDownButtonAction.kt
+++ b/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorVolumeDownButtonAction.kt
@@ -15,7 +15,9 @@
  */
 package com.android.tools.idea.streaming.emulator.actions
 
+import com.android.sdklib.deviceprovisioner.DeviceType
+
 /**
  * Simulates pressing the Volume Down button on an Android virtual device.
  */
-class EmulatorVolumeDownButtonAction : EmulatorPushButtonAction("AudioVolumeDown", configFilter = { !it.isWearOs })
\ No newline at end of file
+class EmulatorVolumeDownButtonAction : EmulatorPushButtonAction("AudioVolumeDown", configFilter = { it.deviceType != DeviceType.WEAR })
\ No newline at end of file
diff --git a/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorVolumeUpButtonAction.kt b/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorVolumeUpButtonAction.kt
index 38360ae..112b73c 100644
--- a/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorVolumeUpButtonAction.kt
+++ b/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorVolumeUpButtonAction.kt
@@ -15,7 +15,9 @@
  */
 package com.android.tools.idea.streaming.emulator.actions
 
+import com.android.sdklib.deviceprovisioner.DeviceType
+
 /**
  * Simulates pressing the Volume Up button on an Android virtual device.
  */
-class EmulatorVolumeUpButtonAction : EmulatorPushButtonAction("AudioVolumeUp", configFilter = { !it.isWearOs })
\ No newline at end of file
+class EmulatorVolumeUpButtonAction : EmulatorPushButtonAction("AudioVolumeUp", configFilter = { it.deviceType != DeviceType.WEAR })
\ No newline at end of file
diff --git a/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorWear1ButtonAction.kt b/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorWear1ButtonAction.kt
index 59c0e67..c07b079 100644
--- a/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorWear1ButtonAction.kt
+++ b/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorWear1ButtonAction.kt
@@ -15,7 +15,10 @@
  */
 package com.android.tools.idea.streaming.emulator.actions
 
+import com.android.sdklib.deviceprovisioner.DeviceType
+
 /**
  * Simulates pressing the first button on an Android Wear virtual device.
  */
-internal class EmulatorWear1ButtonAction : EmulatorPushButtonAction("GoHome", configFilter = { it.isWearOs && it.api >= 28 })
\ No newline at end of file
+internal class EmulatorWear1ButtonAction :
+    EmulatorPushButtonAction("GoHome", configFilter = { it.deviceType == DeviceType.WEAR && it.api >= 28 })
\ No newline at end of file
diff --git a/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorWear2ButtonAction.kt b/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorWear2ButtonAction.kt
index 8f017da..672d053 100644
--- a/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorWear2ButtonAction.kt
+++ b/streaming/src/com/android/tools/idea/streaming/emulator/actions/EmulatorWear2ButtonAction.kt
@@ -15,7 +15,10 @@
  */
 package com.android.tools.idea.streaming.emulator.actions
 
+import com.android.sdklib.deviceprovisioner.DeviceType
+
 /**
  * Simulates pressing the second button on an Android Wear virtual device.
  */
-internal class EmulatorWear2ButtonAction : EmulatorPushButtonAction("Power", configFilter = { it.isWearOs && it.api >= 30 })
\ No newline at end of file
+internal class EmulatorWear2ButtonAction :
+    EmulatorPushButtonAction("Power", configFilter = { it.deviceType == DeviceType.WEAR && it.api >= 30 })
\ No newline at end of file
diff --git a/streaming/testData/EmulatorToolWindowPanelTest/golden/AutomotiveToolbarActions1.png b/streaming/testData/EmulatorToolWindowPanelTest/golden/AutomotiveToolbarActions1.png
new file mode 100644
index 0000000..36f7264
--- /dev/null
+++ b/streaming/testData/EmulatorToolWindowPanelTest/golden/AutomotiveToolbarActions1.png
Binary files differ
diff --git a/streaming/testSrc/com/android/tools/idea/streaming/device/screenshot/DeviceScreenshotOptionsTest.kt b/streaming/testSrc/com/android/tools/idea/streaming/device/screenshot/DeviceScreenshotOptionsTest.kt
index d510352..159fac7 100644
--- a/streaming/testSrc/com/android/tools/idea/streaming/device/screenshot/DeviceScreenshotOptionsTest.kt
+++ b/streaming/testSrc/com/android/tools/idea/streaming/device/screenshot/DeviceScreenshotOptionsTest.kt
@@ -16,6 +16,7 @@
 package com.android.tools.idea.streaming.device.screenshot
 
 import com.android.adblib.DevicePropertyNames
+import com.android.sdklib.deviceprovisioner.DeviceType
 import com.android.testutils.MockitoKt.mock
 import com.android.testutils.MockitoKt.whenever
 import com.android.tools.adtui.device.DeviceArtDescriptor
@@ -23,7 +24,6 @@
 import com.android.tools.idea.streaming.device.DeviceView
 import com.android.tools.idea.streaming.device.createDeviceConfiguration
 import com.android.tools.idea.streaming.device.emptyDeviceConfiguration
-import com.android.tools.idea.ui.screenshot.DeviceType
 import com.android.tools.idea.ui.screenshot.FramingOption
 import com.google.common.truth.Truth.assertThat
 import org.junit.Before
@@ -54,8 +54,8 @@
 
   @Test
   fun testScreenshotPostprocessorProperty() {
-    assertThat(DeviceScreenshotOptions(serialNumber, emptyDeviceConfiguration, deviceView).screenshotPostprocessor)
-        .isInstanceOf(DeviceScreenshotPostprocessor::class.java)
+    assertThat(DeviceScreenshotOptions(serialNumber, emptyDeviceConfiguration, deviceView).screenshotDecorator)
+        .isInstanceOf(DeviceScreenshotDecorator::class.java)
   }
 
   @Test
@@ -65,7 +65,7 @@
     val screenshotOptions = DeviceScreenshotOptions(serialNumber, emptyDeviceConfiguration, deviceView)
     val image = createImage(1080, 2400, Color.WHITE)
     val displayInfo = "DisplayDeviceInfo{..., 1080 x 2400, ..., density 560, ...}"
-    val screenshotImage = screenshotOptions.createScreenshotImage(image, displayInfo, DeviceType.PHONE)
+    val screenshotImage = screenshotOptions.createScreenshotImage(image, displayInfo, DeviceType.HANDHELD)
     assertThat(screenshotImage.image.width).isEqualTo(2400)
     assertThat(screenshotImage.image.height).isEqualTo(1080)
     assertThat(screenshotImage.displaySize).isEqualTo(Dimension(1080, 2400))
@@ -80,7 +80,7 @@
     val screenshotOptions = DeviceScreenshotOptions(serialNumber, deviceConfiguration, deviceView)
     val image = createImage(1440, 3040, Color.WHITE)
     val displayInfo = "DisplayDeviceInfo{..., 1440 x 3040, ..., density 560, ...}"
-    val screenshotImage = screenshotOptions.createScreenshotImage(image, displayInfo, DeviceType.PHONE)
+    val screenshotImage = screenshotOptions.createScreenshotImage(image, displayInfo, DeviceType.HANDHELD)
     val framingOptions = screenshotOptions.getFramingOptions(screenshotImage)
     assertThat(framingOptions).containsExactly(DeviceFramingOption("Pixel 4 XL", SKIN_FOLDER.resolve("pixel_4_xl")))
     assertThat(screenshotOptions.getDefaultFramingOption(framingOptions, screenshotImage)).isEqualTo(0)
@@ -92,7 +92,7 @@
     val screenshotOptions = DeviceScreenshotOptions(serialNumber, deviceConfiguration, deviceView)
     val image = createImage(1080, 2340, Color.WHITE)
     val displayInfo = "DisplayDeviceInfo{..., 1080 x 2340, ..., density 420, ...}"
-    val screenshotImage = screenshotOptions.createScreenshotImage(image, displayInfo, DeviceType.PHONE)
+    val screenshotImage = screenshotOptions.createScreenshotImage(image, displayInfo, DeviceType.HANDHELD)
     val framingOptions = screenshotOptions.getFramingOptions(screenshotImage)
     assertThat(framingOptions.map(FramingOption::displayName)).containsExactly("Generic Phone")
     assertThat(screenshotOptions.getDefaultFramingOption(framingOptions, screenshotImage)).isEqualTo(0)
@@ -104,7 +104,7 @@
     val screenshotOptions = DeviceScreenshotOptions(serialNumber, deviceConfiguration, deviceView)
     val image = createImage(1600, 2560, Color.WHITE)
     val displayInfo = "DisplayDeviceInfo{..., 1600 x 2560, ..., density 280, ...}"
-    val screenshotImage = screenshotOptions.createScreenshotImage(image, displayInfo, DeviceType.PHONE)
+    val screenshotImage = screenshotOptions.createScreenshotImage(image, displayInfo, DeviceType.HANDHELD)
     val framingOptions = screenshotOptions.getFramingOptions(screenshotImage)
     assertThat(framingOptions.map(FramingOption::displayName)).containsExactly("Generic Tablet")
     assertThat(screenshotOptions.getDefaultFramingOption(framingOptions, screenshotImage)).isEqualTo(0)
@@ -116,7 +116,7 @@
     val screenshotOptions = DeviceScreenshotOptions(serialNumber, deviceConfiguration, deviceView)
     val image = createImage(1280, 960, Color.WHITE)
     val displayInfo = "DisplayDeviceInfo{..., 1280 x 960, ..., density 180, ...}"
-    val screenshotImage = screenshotOptions.createScreenshotImage(image, displayInfo, DeviceType.PHONE)
+    val screenshotImage = screenshotOptions.createScreenshotImage(image, displayInfo, DeviceType.HANDHELD)
     val framingOptions = screenshotOptions.getFramingOptions(screenshotImage)
     assertThat(framingOptions.map(FramingOption::displayName)).containsExactly("Automotive", "Generic Tablet")
     assertThat(screenshotOptions.getDefaultFramingOption(framingOptions, screenshotImage)).isEqualTo(0)
@@ -128,7 +128,7 @@
     val screenshotOptions = DeviceScreenshotOptions(serialNumber, deviceConfiguration, deviceView)
     val image = createImage(1280, 768, Color.WHITE)
     val displayInfo = "DisplayDeviceInfo{..., 1280 x 768, ..., density 180, ...}"
-    val screenshotImage = screenshotOptions.createScreenshotImage(image, displayInfo, DeviceType.PHONE)
+    val screenshotImage = screenshotOptions.createScreenshotImage(image, displayInfo, DeviceType.HANDHELD)
     val framingOptions = screenshotOptions.getFramingOptions(screenshotImage)
     assertThat(framingOptions.map(FramingOption::displayName)).containsExactly("Generic Tablet")
     assertThat(screenshotOptions.getDefaultFramingOption(framingOptions, screenshotImage)).isEqualTo(0)
diff --git a/streaming/testSrc/com/android/tools/idea/streaming/device/screenshot/DeviceScreenshotPostprocessorTest.kt b/streaming/testSrc/com/android/tools/idea/streaming/device/screenshot/DeviceScreenshotPostprocessorTest.kt
index 85f9b66e..8efe4e6 100644
--- a/streaming/testSrc/com/android/tools/idea/streaming/device/screenshot/DeviceScreenshotPostprocessorTest.kt
+++ b/streaming/testSrc/com/android/tools/idea/streaming/device/screenshot/DeviceScreenshotPostprocessorTest.kt
@@ -15,12 +15,12 @@
  */
 package com.android.tools.idea.streaming.device.screenshot
 
+import com.android.sdklib.deviceprovisioner.DeviceType
 import com.android.testutils.ImageDiffUtil
 import com.android.testutils.TestUtils
 import com.android.tools.adtui.ImageUtils
 import com.android.tools.adtui.device.DeviceArtDescriptor
 import com.android.tools.adtui.webp.WebpMetadata
-import com.android.tools.idea.ui.screenshot.DeviceType
 import com.android.tools.idea.ui.screenshot.ScreenshotImage
 import org.junit.Before
 import org.junit.Test
@@ -30,7 +30,7 @@
 import java.nio.file.Path
 
 /**
- * Tests for [DeviceScreenshotPostprocessor].
+ * Tests for [DeviceScreenshotDecorator].
  */
 class DeviceScreenshotPostprocessorTest {
 
@@ -39,28 +39,28 @@
     WebpMetadata.ensureWebpRegistered()
   }
 
-  private val postprocessor = DeviceScreenshotPostprocessor()
+  private val postprocessor = DeviceScreenshotDecorator()
 
   @Test
   fun testSkinFrame() {
-    val screenshotImage = ScreenshotImage(createImage(1080, 2400, Color.WHITE), 0, DeviceType.PHONE, "")
+    val screenshotImage = ScreenshotImage(createImage(1080, 2400, Color.WHITE), 0, DeviceType.HANDHELD, "")
     val skinFolder = DeviceArtDescriptor.getBundledDescriptorsFolder()!!.toPath().resolve("pixel_6")
-    val framedImage = postprocessor.addFrame(screenshotImage, DeviceFramingOption("Pixel 6", skinFolder), null)
+    val framedImage = postprocessor.decorate(screenshotImage, DeviceFramingOption("Pixel 6", skinFolder), null)
     assertImageSimilar("SkinFrame", framedImage)
   }
 
   @Test
   fun testDeviceArtFrame() {
-    val screenshotImage = ScreenshotImage(createImage(1080, 2400, Color.WHITE), 0, DeviceType.PHONE, "")
+    val screenshotImage = ScreenshotImage(createImage(1080, 2400, Color.WHITE), 0, DeviceType.HANDHELD, "")
     val artDescriptor = DeviceArtDescriptor.getDescriptors(null).find { it.id == "phone" }!!
-    val framedImage = postprocessor.addFrame(screenshotImage, DeviceFramingOption(artDescriptor), null)
+    val framedImage = postprocessor.decorate(screenshotImage, DeviceFramingOption(artDescriptor), null)
     assertImageSimilar("DeviceArtFrame", framedImage)
   }
 
   @Test
   fun testCircularClip() {
     val screenshotImage = ScreenshotImage(createImage(400, 400, Color.CYAN), 0, DeviceType.WEAR, "DisplayDeviceInfo{..., FLAG_ROUND}")
-    val framedImage = postprocessor.addFrame(screenshotImage, null, null)
+    val framedImage = postprocessor.decorate(screenshotImage, null, null)
     assertImageSimilar("CircularClip", framedImage)
   }
 
diff --git a/streaming/testSrc/com/android/tools/idea/streaming/emulator/EmulatorConfigurationTest.kt b/streaming/testSrc/com/android/tools/idea/streaming/emulator/EmulatorConfigurationTest.kt
index 248c958..5057e24 100644
--- a/streaming/testSrc/com/android/tools/idea/streaming/emulator/EmulatorConfigurationTest.kt
+++ b/streaming/testSrc/com/android/tools/idea/streaming/emulator/EmulatorConfigurationTest.kt
@@ -18,6 +18,7 @@
 import com.android.emulator.control.DisplayModeValue
 import com.android.emulator.control.Posture.PostureValue
 import com.android.emulator.control.Rotation.SkinRotation
+import com.android.sdklib.deviceprovisioner.DeviceType
 import com.android.tools.idea.streaming.emulator.EmulatorConfiguration.DisplayMode
 import com.android.tools.idea.streaming.emulator.EmulatorConfiguration.PostureDescriptor
 import com.google.common.jimfs.Jimfs
@@ -53,7 +54,7 @@
     assertThat(config?.skinFolder?.toString()?.replace('\\', '/'))
         .endsWith("tools/adt/idea/artwork/resources/device-art-resources/pixel_3_xl")
     assertThat(config?.hasAudioOutput).isTrue()
-    assertThat(config?.isWearOs).isFalse()
+    assertThat(config?.deviceType).isEqualTo(DeviceType.HANDHELD)
     assertThat(config?.hasOrientationSensors).isTrue()
     assertThat(config?.initialOrientation).isEqualTo(SkinRotation.PORTRAIT)
     assertThat(config?.displayModes).isEmpty()
@@ -78,7 +79,7 @@
     assertThat(config?.density).isEqualTo(320)
     assertThat(config?.skinFolder?.toString()?.replace('\\', '/')).isEqualTo("${baseDir}/Android/Sdk/skins/nexus_10")
     assertThat(config?.hasAudioOutput).isTrue()
-    assertThat(config?.isWearOs).isFalse()
+    assertThat(config?.deviceType).isEqualTo(DeviceType.HANDHELD)
     assertThat(config?.hasOrientationSensors).isTrue()
     assertThat(config?.initialOrientation).isEqualTo(SkinRotation.LANDSCAPE)
     assertThat(config?.displayModes).isEmpty()
@@ -103,7 +104,7 @@
     assertThat(config?.density).isEqualTo(240)
     assertThat(config?.skinFolder?.toString()).isEqualTo(FakeEmulator.getSkinFolder("wearos_small_round").toString())
     assertThat(config?.hasAudioOutput).isTrue()
-    assertThat(config?.isWearOs).isTrue()
+    assertThat(config?.deviceType).isEqualTo(DeviceType.WEAR)
     assertThat(config?.hasOrientationSensors).isTrue()
     assertThat(config?.initialOrientation).isEqualTo(SkinRotation.PORTRAIT)
     assertThat(config?.displayModes).isEmpty()
@@ -128,7 +129,7 @@
     assertThat(config?.density).isEqualTo(420)
     assertThat(config?.skinFolder?.toString()).isEqualTo(FakeEmulator.getSkinFolder("pixel_fold").toString())
     assertThat(config?.hasAudioOutput).isTrue()
-    assertThat(config?.isWearOs).isFalse()
+    assertThat(config?.deviceType).isEqualTo(DeviceType.HANDHELD)
     assertThat(config?.hasOrientationSensors).isTrue()
     assertThat(config?.initialOrientation).isEqualTo(SkinRotation.PORTRAIT)
     assertThat(config?.displayModes).isEmpty()
@@ -156,7 +157,7 @@
     assertThat(config?.density).isEqualTo(420)
     assertThat(config?.skinFolder).isNull()
     assertThat(config?.hasAudioOutput).isTrue()
-    assertThat(config?.isWearOs).isFalse()
+    assertThat(config?.deviceType).isEqualTo(DeviceType.HANDHELD)
     assertThat(config?.hasOrientationSensors).isTrue()
     assertThat(config?.initialOrientation).isEqualTo(SkinRotation.PORTRAIT)
     assertThat(config?.displayModes).isEmpty()
@@ -184,7 +185,7 @@
     assertThat(config?.density).isEqualTo(420)
     assertThat(config?.skinFolder).isNull()
     assertThat(config?.hasAudioOutput).isTrue()
-    assertThat(config?.isWearOs).isFalse()
+    assertThat(config?.deviceType).isEqualTo(DeviceType.HANDHELD)
     assertThat(config?.hasOrientationSensors).isTrue()
     assertThat(config?.initialOrientation).isEqualTo(SkinRotation.PORTRAIT)
     assertThat(config?.displayModes).containsExactly(
diff --git a/streaming/testSrc/com/android/tools/idea/streaming/emulator/EmulatorToolWindowPanelTest.kt b/streaming/testSrc/com/android/tools/idea/streaming/emulator/EmulatorToolWindowPanelTest.kt
index 1ac2ad4..3cc655c 100644
--- a/streaming/testSrc/com/android/tools/idea/streaming/emulator/EmulatorToolWindowPanelTest.kt
+++ b/streaming/testSrc/com/android/tools/idea/streaming/emulator/EmulatorToolWindowPanelTest.kt
@@ -321,7 +321,6 @@
     assertThat(panel.primaryEmulatorView).isNull()
     streamScreenshotCall.waitForCancellation(2.seconds)
   }
-
   @Test
   fun testWearToolbarActionsApi28() {
     val avdFolder = FakeEmulator.createWatchAvd(emulatorRule.avdRoot, api = 28)
@@ -391,6 +390,42 @@
   }
 
   @Test
+  fun testAutomotiveToolbarActions() {
+    val avdFolder = FakeEmulator.createAutomotiveAvd(emulatorRule.avdRoot, api = 32)
+    val panel = createWindowPanel(avdFolder)
+    val ui = FakeUi(panel, createFakeWindow = true, parentDisposable = testRootDisposable)
+
+    assertThat(panel.primaryEmulatorView).isNull()
+
+    panel.createContent(true)
+    val emulatorView = panel.primaryEmulatorView ?: throw AssertionError()
+    assertThat((panel.icon as LayeredIcon).getIcon(0)).isEqualTo(StudioIcons.DeviceExplorer.VIRTUAL_DEVICE_CAR)
+
+    // Check appearance.
+    var frameNumber = emulatorView.frameNumber
+    assertThat(frameNumber).isEqualTo(0u)
+    panel.size = Dimension(400, 300)
+    ui.layoutAndDispatchEvents()
+    val streamScreenshotCall = getStreamScreenshotCallAndWaitForFrame(ui, panel, ++frameNumber)
+    assertThat(shortDebugString(streamScreenshotCall.request)).isEqualTo("format: RGB888 width: 400 height: 271")
+    assertAppearance(ui, "AutomotiveToolbarActions1", maxPercentDifferentMac = 0.04, maxPercentDifferentWindows = 0.15)
+
+    // Check that the buttons not applicable to Automotive devices are hidden.
+    assertThat(ui.findComponent<ActionButton> { it.action.templateText == "Power" }).isNotNull()
+    assertThat(ui.findComponent<ActionButton> { it.action.templateText == "Volume Up" }).isNotNull()
+    assertThat(ui.findComponent<ActionButton> { it.action.templateText == "Volume Down" }).isNotNull()
+    assertThat(ui.findComponent<ActionButton> { it.action.templateText == "Rotate Left" }).isNull()
+    assertThat(ui.findComponent<ActionButton> { it.action.templateText == "Rotate Right" }).isNull()
+    assertThat(ui.findComponent<ActionButton> { it.action.templateText == "Back" }).isNull()
+    assertThat(ui.findComponent<ActionButton> { it.action.templateText == "Home" }).isNotNull()
+    assertThat(ui.findComponent<ActionButton> { it.action.templateText == "Overview" }).isNull()
+
+    panel.destroyContent()
+    assertThat(panel.primaryEmulatorView).isNull()
+    streamScreenshotCall.waitForCancellation(2.seconds)
+  }
+
+  @Test
   fun testDisplayModes() {
     val avdFolder = FakeEmulator.createResizableAvd(emulatorRule.avdRoot)
     val panel = createWindowPanel(avdFolder)
diff --git a/streaming/testUtil/com/android/tools/idea/streaming/emulator/FakeEmulator.kt b/streaming/testUtil/com/android/tools/idea/streaming/emulator/FakeEmulator.kt
index f140484..b414e42 100644
--- a/streaming/testUtil/com/android/tools/idea/streaming/emulator/FakeEmulator.kt
+++ b/streaming/testUtil/com/android/tools/idea/streaming/emulator/FakeEmulator.kt
@@ -1544,6 +1544,99 @@
       return createAvd(avdId, avdFolder, configIni, hardwareIni)
     }
 
+    /**
+     * Creates a fake Automotive AVD.
+     */
+    @JvmStatic
+    fun createAutomotiveAvd(parentFolder: Path, sdkFolder: Path = getSdkFolder(parentFolder), api: Int = 32): Path {
+      val avdId = "Automotive_1024p_landscape_API_$api"
+      val avdFolder = parentFolder.resolve("${avdId}.avd")
+      val avdName = avdId.replace('_', ' ')
+      val systemImage = "system-images/android-$api/android-automotive-playstore/x86_64/"
+      val systemImageFolder = sdkFolder.resolve(systemImage)
+
+      val configIni = """
+          AvdId=${avdId}
+          PlayStore.enabled=false
+          abi.type=x86_64
+          avd.ini.displayname=${avdName}
+          avd.ini.encoding=UTF-8
+          disk.dataPartition.size=6442450944
+          hw.accelerometer=no
+          hw.arc=false
+          hw.audioInput=yes
+          hw.battery=no
+          hw.camera.back=None
+          hw.camera.front=None
+          hw.cpu.arch=x86_64
+          hw.cpu.ncore=4
+          hw.dPad=no
+          hw.device.manufacturer = Google
+          hw.device.name=automotive_1024p_landscape
+          hw.gps=yes
+          hw.gpu.enabled=yes
+          hw.gpu.mode=auto
+          hw.initialOrientation=landscape
+          hw.keyboard=yes
+          hw.lcd.density = 160
+          hw.lcd.height = 768
+          hw.lcd.width = 1024
+          hw.mainKeys=no
+          hw.ramSize=2048
+          hw.sdCard=yes
+          hw.sensors.orientation=no
+          hw.sensors.proximity=no
+          hw.trackBall=no
+          image.sysdir.1=$systemImage
+          runtime.network.latency=none
+          runtime.network.speed=full
+          sdcard.path=${avdFolder}/sdcard.img
+          showDeviceFrame=no
+          skin.dynamic=yes
+          skin.path=_no_skin
+          tag.display = Automotive with Play Store
+          tag.id = android-automotive-playstore
+          """.trimIndent()
+
+      val hardwareIni = """
+          hw.cpu.arch = x86_64
+          hw.cpu.model = qemu32
+          hw.cpu.ncore = 4
+          hw.lcd.density = 160
+          hw.lcd.width = 1024
+          hw.lcd.height = 768
+          hw.ramSize = 2048
+          hw.multi_display_window = false
+          hw.hotplug_multi_display = false
+          hw.screen = multi-touch
+          hw.dPad = false
+          hw.rotaryInput = false
+          hw.gsmModem = true
+          hw.gps = true
+          hw.battery = false
+          hw.accelerometer = false
+          hw.sensors.gyroscope_uncalibrated = true
+          hw.audioInput = true
+          hw.audioOutput = true
+          hw.sdCard = false
+          android.sdk.root = $sdkFolder
+          """.trimIndent()
+
+      val sourceProperties = """
+          Pkg.Desc=System Image x86_64 with Google Play Store.
+          AndroidVersion.ApiLevel=$api
+          SystemImage.Abi=x86_64
+          SystemImage.TagId=android-automotive-playstore
+          SystemImage.TagDisplay=Automotive with Play Store
+          SystemImage.GpuSupport=true
+          Addon.VendorId=google
+          Addon.VendorDisplay=Google Inc.
+          """.trimIndent()
+
+      createSystemImage(systemImageFolder, api, sourceProperties)
+      return createAvd(avdId, avdFolder, configIni, hardwareIni)
+    }
+
     private fun createSystemImage(systemImageFolder: Path, api: Int, sourceProperties: String) {
       if (Files.exists(systemImageFolder.resolve(SystemImageManager.SYS_IMG_NAME))) {
         return
diff --git a/studio/BUILD b/studio/BUILD
index 8b6e66a..315770e 100644
--- a/studio/BUILD
+++ b/studio/BUILD
@@ -212,6 +212,7 @@
             "//tools/adt/idea/nav/safeargs/common:intellij.android.nav.safeargs.common",
             "//tools/adt/idea/nav/safeargs/common/gradle:intellij.android.nav.safeargs.common.gradle",
             "//tools/adt/idea/nav/safeargs/k1:intellij.android.nav.safeargs.k1",
+            "//tools/adt/idea/nav/safeargs/k2:intellij.android.nav.safeargs.k2",
             "//tools/adt/idea/android-npw:intellij.android.newProjectWizard",
             "//tools/adt/idea/android-material:intellij.android.android-material",
             "//tools/adt/idea/observable-ui:intellij.android.observable.ui",
diff --git a/studio/tests/expected_linux.txt b/studio/tests/expected_linux.txt
index 8d618bf..3833238 100644
--- a/studio/tests/expected_linux.txt
+++ b/studio/tests/expected_linux.txt
@@ -441,7 +441,7 @@
 android-studio/lib/ant/src.zip
 android-studio/lib/app.jar
 android-studio/lib/bouncy-castle.jar
-android-studio/lib/build-marker-AI-233.13135.103.2331.__BUILD_NUMBER__
+android-studio/lib/build-marker-AI-233.14015.106.2331.__BUILD_NUMBER__
 android-studio/lib/byte-buddy-agent.jar
 android-studio/lib/cds/classesLogAgent.jar
 android-studio/lib/error-prone-annotations.jar
@@ -542,6 +542,7 @@
 android-studio/plugins/Kotlin/kotlinc/lib/js.engines.jar
 android-studio/plugins/Kotlin/kotlinc/lib/jvm-abi-gen.jar
 android-studio/plugins/Kotlin/kotlinc/lib/kotlin-annotation-processing-cli.jar
+android-studio/plugins/Kotlin/kotlinc/lib/kotlin-annotation-processing-compiler.jar
 android-studio/plugins/Kotlin/kotlinc/lib/kotlin-annotation-processing-runtime.jar
 android-studio/plugins/Kotlin/kotlinc/lib/kotlin-annotation-processing.jar
 android-studio/plugins/Kotlin/kotlinc/lib/kotlin-annotations-jvm-sources.jar
@@ -569,6 +570,7 @@
 android-studio/plugins/Kotlin/kotlinc/lib/kotlin-stdlib-jdk8.jar
 android-studio/plugins/Kotlin/kotlinc/lib/kotlin-stdlib-js-sources.jar
 android-studio/plugins/Kotlin/kotlinc/lib/kotlin-stdlib-js.jar
+android-studio/plugins/Kotlin/kotlinc/lib/kotlin-stdlib-js.klib
 android-studio/plugins/Kotlin/kotlinc/lib/kotlin-stdlib-sources.jar
 android-studio/plugins/Kotlin/kotlinc/lib/kotlin-stdlib.jar
 android-studio/plugins/Kotlin/kotlinc/lib/kotlin-test-js-sources.jar
@@ -589,6 +591,7 @@
 android-studio/plugins/Kotlin/kotlinc/lib/parcelize-compiler.jar
 android-studio/plugins/Kotlin/kotlinc/lib/parcelize-runtime.jar
 android-studio/plugins/Kotlin/kotlinc/lib/sam-with-receiver-compiler-plugin.jar
+android-studio/plugins/Kotlin/kotlinc/lib/scripting-compiler.jar
 android-studio/plugins/Kotlin/kotlinc/lib/trove4j.jar
 android-studio/plugins/Kotlin/kotlinc/license/COPYRIGHT.txt
 android-studio/plugins/Kotlin/kotlinc/license/COPYRIGHT_HEADER.txt
diff --git a/studio/tests/expected_mac.txt b/studio/tests/expected_mac.txt
index 098f351..df875ca 100644
--- a/studio/tests/expected_mac.txt
+++ b/studio/tests/expected_mac.txt
@@ -550,6 +550,7 @@
 Android Studio Preview.app/Contents/plugins/Kotlin/kotlinc/lib/js.engines.jar
 Android Studio Preview.app/Contents/plugins/Kotlin/kotlinc/lib/jvm-abi-gen.jar
 Android Studio Preview.app/Contents/plugins/Kotlin/kotlinc/lib/kotlin-annotation-processing-cli.jar
+Android Studio Preview.app/Contents/plugins/Kotlin/kotlinc/lib/kotlin-annotation-processing-compiler.jar
 Android Studio Preview.app/Contents/plugins/Kotlin/kotlinc/lib/kotlin-annotation-processing-runtime.jar
 Android Studio Preview.app/Contents/plugins/Kotlin/kotlinc/lib/kotlin-annotation-processing.jar
 Android Studio Preview.app/Contents/plugins/Kotlin/kotlinc/lib/kotlin-annotations-jvm-sources.jar
@@ -577,6 +578,7 @@
 Android Studio Preview.app/Contents/plugins/Kotlin/kotlinc/lib/kotlin-stdlib-jdk8.jar
 Android Studio Preview.app/Contents/plugins/Kotlin/kotlinc/lib/kotlin-stdlib-js-sources.jar
 Android Studio Preview.app/Contents/plugins/Kotlin/kotlinc/lib/kotlin-stdlib-js.jar
+Android Studio Preview.app/Contents/plugins/Kotlin/kotlinc/lib/kotlin-stdlib-js.klib
 Android Studio Preview.app/Contents/plugins/Kotlin/kotlinc/lib/kotlin-stdlib-sources.jar
 Android Studio Preview.app/Contents/plugins/Kotlin/kotlinc/lib/kotlin-stdlib.jar
 Android Studio Preview.app/Contents/plugins/Kotlin/kotlinc/lib/kotlin-test-js-sources.jar
@@ -597,6 +599,7 @@
 Android Studio Preview.app/Contents/plugins/Kotlin/kotlinc/lib/parcelize-compiler.jar
 Android Studio Preview.app/Contents/plugins/Kotlin/kotlinc/lib/parcelize-runtime.jar
 Android Studio Preview.app/Contents/plugins/Kotlin/kotlinc/lib/sam-with-receiver-compiler-plugin.jar
+Android Studio Preview.app/Contents/plugins/Kotlin/kotlinc/lib/scripting-compiler.jar
 Android Studio Preview.app/Contents/plugins/Kotlin/kotlinc/lib/trove4j.jar
 Android Studio Preview.app/Contents/plugins/Kotlin/kotlinc/license/COPYRIGHT.txt
 Android Studio Preview.app/Contents/plugins/Kotlin/kotlinc/license/COPYRIGHT_HEADER.txt
diff --git a/studio/tests/expected_mac_arm.txt b/studio/tests/expected_mac_arm.txt
index e10bfa3..3c735c5 100644
--- a/studio/tests/expected_mac_arm.txt
+++ b/studio/tests/expected_mac_arm.txt
@@ -544,6 +544,7 @@
 Android Studio Preview.app/Contents/plugins/Kotlin/kotlinc/lib/js.engines.jar
 Android Studio Preview.app/Contents/plugins/Kotlin/kotlinc/lib/jvm-abi-gen.jar
 Android Studio Preview.app/Contents/plugins/Kotlin/kotlinc/lib/kotlin-annotation-processing-cli.jar
+Android Studio Preview.app/Contents/plugins/Kotlin/kotlinc/lib/kotlin-annotation-processing-compiler.jar
 Android Studio Preview.app/Contents/plugins/Kotlin/kotlinc/lib/kotlin-annotation-processing-runtime.jar
 Android Studio Preview.app/Contents/plugins/Kotlin/kotlinc/lib/kotlin-annotation-processing.jar
 Android Studio Preview.app/Contents/plugins/Kotlin/kotlinc/lib/kotlin-annotations-jvm-sources.jar
@@ -571,6 +572,7 @@
 Android Studio Preview.app/Contents/plugins/Kotlin/kotlinc/lib/kotlin-stdlib-jdk8.jar
 Android Studio Preview.app/Contents/plugins/Kotlin/kotlinc/lib/kotlin-stdlib-js-sources.jar
 Android Studio Preview.app/Contents/plugins/Kotlin/kotlinc/lib/kotlin-stdlib-js.jar
+Android Studio Preview.app/Contents/plugins/Kotlin/kotlinc/lib/kotlin-stdlib-js.klib
 Android Studio Preview.app/Contents/plugins/Kotlin/kotlinc/lib/kotlin-stdlib-sources.jar
 Android Studio Preview.app/Contents/plugins/Kotlin/kotlinc/lib/kotlin-stdlib.jar
 Android Studio Preview.app/Contents/plugins/Kotlin/kotlinc/lib/kotlin-test-js-sources.jar
@@ -591,6 +593,7 @@
 Android Studio Preview.app/Contents/plugins/Kotlin/kotlinc/lib/parcelize-compiler.jar
 Android Studio Preview.app/Contents/plugins/Kotlin/kotlinc/lib/parcelize-runtime.jar
 Android Studio Preview.app/Contents/plugins/Kotlin/kotlinc/lib/sam-with-receiver-compiler-plugin.jar
+Android Studio Preview.app/Contents/plugins/Kotlin/kotlinc/lib/scripting-compiler.jar
 Android Studio Preview.app/Contents/plugins/Kotlin/kotlinc/lib/trove4j.jar
 Android Studio Preview.app/Contents/plugins/Kotlin/kotlinc/license/COPYRIGHT.txt
 Android Studio Preview.app/Contents/plugins/Kotlin/kotlinc/license/COPYRIGHT_HEADER.txt
diff --git a/studio/tests/expected_win.txt b/studio/tests/expected_win.txt
index d3f68c2..b749dfc 100644
--- a/studio/tests/expected_win.txt
+++ b/studio/tests/expected_win.txt
@@ -611,6 +611,7 @@
 android-studio/plugins/Kotlin/kotlinc/lib/js.engines.jar
 android-studio/plugins/Kotlin/kotlinc/lib/jvm-abi-gen.jar
 android-studio/plugins/Kotlin/kotlinc/lib/kotlin-annotation-processing-cli.jar
+android-studio/plugins/Kotlin/kotlinc/lib/kotlin-annotation-processing-compiler.jar
 android-studio/plugins/Kotlin/kotlinc/lib/kotlin-annotation-processing-runtime.jar
 android-studio/plugins/Kotlin/kotlinc/lib/kotlin-annotation-processing.jar
 android-studio/plugins/Kotlin/kotlinc/lib/kotlin-annotations-jvm-sources.jar
@@ -638,6 +639,7 @@
 android-studio/plugins/Kotlin/kotlinc/lib/kotlin-stdlib-jdk8.jar
 android-studio/plugins/Kotlin/kotlinc/lib/kotlin-stdlib-js-sources.jar
 android-studio/plugins/Kotlin/kotlinc/lib/kotlin-stdlib-js.jar
+android-studio/plugins/Kotlin/kotlinc/lib/kotlin-stdlib-js.klib
 android-studio/plugins/Kotlin/kotlinc/lib/kotlin-stdlib-sources.jar
 android-studio/plugins/Kotlin/kotlinc/lib/kotlin-stdlib.jar
 android-studio/plugins/Kotlin/kotlinc/lib/kotlin-test-js-sources.jar
@@ -658,6 +660,7 @@
 android-studio/plugins/Kotlin/kotlinc/lib/parcelize-compiler.jar
 android-studio/plugins/Kotlin/kotlinc/lib/parcelize-runtime.jar
 android-studio/plugins/Kotlin/kotlinc/lib/sam-with-receiver-compiler-plugin.jar
+android-studio/plugins/Kotlin/kotlinc/lib/scripting-compiler.jar
 android-studio/plugins/Kotlin/kotlinc/lib/trove4j.jar
 android-studio/plugins/Kotlin/kotlinc/license/COPYRIGHT.txt
 android-studio/plugins/Kotlin/kotlinc/license/COPYRIGHT_HEADER.txt
diff --git a/studio/version.bzl b/studio/version.bzl
index 5df9208..551bc64 100644
--- a/studio/version.bzl
+++ b/studio/version.bzl
@@ -3,5 +3,5 @@
 
 STUDIO_CODENAME = "Jellyfish"
 STUDIO_VERSION = "Canary"
-STUDIO_MICRO_PATCH = "1.7"
-STUDIO_RELEASE_NUMBER = 7
+STUDIO_MICRO_PATCH = "1.8"
+STUDIO_RELEASE_NUMBER = 8
diff --git a/sync-memory-tests/testSrc/com/android/tools/idea/gradle/project/sync/cpu/MeasureSyncExecutionTimeRule.kt b/sync-memory-tests/testSrc/com/android/tools/idea/gradle/project/sync/cpu/MeasureSyncExecutionTimeRule.kt
index 250cdf8..286cf15 100644
--- a/sync-memory-tests/testSrc/com/android/tools/idea/gradle/project/sync/cpu/MeasureSyncExecutionTimeRule.kt
+++ b/sync-memory-tests/testSrc/com/android/tools/idea/gradle/project/sync/cpu/MeasureSyncExecutionTimeRule.kt
@@ -58,7 +58,7 @@
 
 private typealias TimestampedMeasurement = Pair<Instant, Duration>
 
-private data class Durations (
+private data class Durations(
   val gradleConfiguration : Duration,
   val gradleBeforeAndroidExecution: Duration,
   val gradleAndroidExecution: Duration,
@@ -67,7 +67,17 @@
   val finishTimestamp: Instant,
   val gradle: Duration = gradleConfiguration + gradleBeforeAndroidExecution + gradleAndroidExecution + gradleAfterAndroidExecution,
   val total: Duration = gradle + ide
-)
+) {
+  override fun toString() = """
+total: ${total.inWholeSeconds}s
+  -   ide: ${ide.inWholeSeconds}s
+  -gradle: ${gradle.inWholeSeconds}s
+    -configuration: ${gradleConfiguration.inWholeSeconds}s
+    -beforeAndroid: ${gradleBeforeAndroidExecution.inWholeSeconds}s
+    -      android: ${gradleAndroidExecution.inWholeSeconds}s
+    - afterAndroid: ${gradleAfterAndroidExecution.inWholeSeconds}s
+  """.trimIndent()
+}
 
 class MeasureSyncExecutionTimeRule(val syncCount: Int) : ExternalResource() {
   private val results = mutableListOf<Durations>()
@@ -81,7 +91,6 @@
 
   val listener = object : GradleSyncListenerWithRoot {
     override fun syncStarted(project: Project, rootProjectPath: @SystemIndependent String) {
-      println("Project import started: attempt #${results.size + 1}")
       syncStartTimestamp = Clock.System.now()
     }
 
@@ -100,8 +109,8 @@
         ide = ideFinishedTimestamp - gradleSyncFinishedTimestamp,
         finishTimestamp =  ideFinishedTimestamp
       )
-      println("Result: $result")
       results.add(result)
+      println("Project import #${results.size} result: $result")
     }
   }
 
@@ -126,7 +135,9 @@
       }.groupBy { (type, _,) -> type }
       .mapValues { groupEntry -> groupEntry.value.map {it.second} }.entries // unpack group values
       .forEach { (type, values: List<TimestampedMeasurement>) ->
-      println("Recording ${projectName}_$type -> $values")
+      values.forEach { value ->
+        println("Recording ${projectName}_$type -> ${value.second.inWholeMilliseconds} ms (${value.second.inWholeSeconds} seconds)")
+      }
       recordCpuMeasurement("${projectName}_$type", values, enableAnalyzers = !type.startsWith(droppedPrefix) )
     }
   }
diff --git a/sync-memory-tests/testSrc/com/android/tools/idea/gradle/project/sync/memory/CaptureSyncMemoryFromHistogramRule.kt b/sync-memory-tests/testSrc/com/android/tools/idea/gradle/project/sync/memory/CaptureSyncMemoryFromHistogramRule.kt
index 644ee46..b6c7b1b 100644
--- a/sync-memory-tests/testSrc/com/android/tools/idea/gradle/project/sync/memory/CaptureSyncMemoryFromHistogramRule.kt
+++ b/sync-memory-tests/testSrc/com/android/tools/idea/gradle/project/sync/memory/CaptureSyncMemoryFromHistogramRule.kt
@@ -69,17 +69,21 @@
 
   private fun recordHistogramValues(projectName: String) {
     for (metricFilePath in File(OUTPUT_DIRECTORY).walk().filter { !it.isDirectory && it.extension == "histogram" }.asIterable()) {
-        val lines = metricFilePath.readLines()
-        // Files less than three lines are likely not heap snapshots
-        if (lines.size < 3) continue
-        val bytes = lines
-          .last()
-          .trim()
-          .split("\\s+".toRegex())[2]
-          .toLong()
-        recordMemoryMeasurement("${projectName}_${metricFilePath.toMetricName()}", TimestampedMeasurement(
-          metricFilePath.toTimestamp(),
-          bytes
+      val lines = metricFilePath.readLines()
+      // Files less than three lines are likely not heap snapshots
+      if (lines.size < 3) continue
+      val totalBytes = lines
+        .last()
+        .trim()
+        .split("\\s+".toRegex())[2]
+        .toLong()
+      val totalMegabytes = totalBytes shr 20
+      val metricName = metricFilePath.toMetricName()
+      val timestamp = metricFilePath.toTimestamp()
+      println("Recording ${projectName}_$metricName -> $totalBytes bytes ($totalMegabytes MBs)")
+      recordMemoryMeasurement("${projectName}_$metricName", TimestampedMeasurement(
+        timestamp,
+        totalBytes
         ))
         Files.move(metricFilePath.toPath(), TestUtils.getTestOutputDir().resolve(metricFilePath.name))
     }
@@ -88,7 +92,7 @@
     }
   }
 
-  internal fun recordMemoryMeasurement(
+  private fun recordMemoryMeasurement(
     metricName: String,
     measurement: TimestampedMeasurement,
     enableAnalyzer: Boolean = true) {
diff --git a/sync-memory-tests/testSrc/com/android/tools/idea/gradle/project/sync/memory/MemoryConstrainedTestRule.kt b/sync-memory-tests/testSrc/com/android/tools/idea/gradle/project/sync/memory/MemoryConstrainedTestRule.kt
index 6c8631f..e857c00 100644
--- a/sync-memory-tests/testSrc/com/android/tools/idea/gradle/project/sync/memory/MemoryConstrainedTestRule.kt
+++ b/sync-memory-tests/testSrc/com/android/tools/idea/gradle/project/sync/memory/MemoryConstrainedTestRule.kt
@@ -70,7 +70,6 @@
     mutateGradleProperties {
       setJvmArgs(jvmArgs.orEmpty().replace("-Xmx60g", "-Xmx${maxHeapMB}m"))
     }
-    startMemoryPolling()
     recordMeasurement("${projectName}_Max_Heap",
                       listOf(Clock.System.now() to (maxHeapMB.toLong() shl 20)))
   }
@@ -118,33 +117,17 @@
         1, 2 -> droppedPrefix
         else -> ""
       }
-      "${prefix}GC_Collection_Time" to (value.first to value.second.inWholeMilliseconds)
+      "${prefix}GC_Collection_Time" to (value.first to value.second)
     }.groupBy { (type, _,) -> type }
       .mapValues { groupEntry -> groupEntry.value.map {it.second} }.entries // unpack group values
-      .forEach { (type, values: List<Pair<Instant, Long>>) ->
-        println("Recording ${projectName}_$type -> ${values.map { it.second.milliseconds }}")
-        recordMeasurement("${projectName}_$type", values, analyzer = GC_COLLECTION_TIME_ANALYZER)
-      }
-  }
-
-  private fun startMemoryPolling() {
-    // This is used just for logging and diagnosing issues in the test
-    CoroutineScope(Dispatchers.IO).launch {
-      while (true) {
-        File("/proc/meminfo").readLines().filter { it.startsWith("Mem") }.forEach {
-          // This will have MemAvailable, MemFree, MemTotal lines
-          println("${getTimestamp()} - $it")
+      .forEach { (type, values) ->
+        values.forEach { value ->
+          println("Recording ${projectName}_$type -> ${value.second.inWholeMilliseconds} ms (${value.second.inWholeSeconds} seconds)")
         }
-        delay(15.seconds.toJavaDuration())
+        recordMeasurement("${projectName}_$type", values.map { it.first to it.second.inWholeMilliseconds}, analyzer = GC_COLLECTION_TIME_ANALYZER)
       }
-    }
   }
 
-  private fun getTimestamp() = DateTimeFormatter
-    .ofPattern("yyyy-MM dd-HH:mm:ss.SSS")
-    .withZone(ZoneOffset.UTC)
-    .format(Clock.System.now().toJavaInstant())
-
   private fun recordMeasurement(metricName: String, values: List<Pair<Instant, Long>>, analyzer: List<WindowDeviationAnalyzer>? = null) {
     val benchmarks = listOf(MEMORY_BENCHMARK, CPU_BENCHMARK)
     Metric(metricName).apply {
diff --git a/uitest-framework/testSrc/com/android/tools/idea/tests/gui/framework/fixture/IdeSettingsDialogFixture.java b/uitest-framework/testSrc/com/android/tools/idea/tests/gui/framework/fixture/IdeSettingsDialogFixture.java
index 83e52d5..2723d05 100644
--- a/uitest-framework/testSrc/com/android/tools/idea/tests/gui/framework/fixture/IdeSettingsDialogFixture.java
+++ b/uitest-framework/testSrc/com/android/tools/idea/tests/gui/framework/fixture/IdeSettingsDialogFixture.java
@@ -22,6 +22,7 @@
 import com.intellij.openapi.options.ConfigurableGroup;
 import com.intellij.openapi.options.newEditor.SettingsDialog;
 import com.intellij.openapi.options.newEditor.SettingsTreeView;
+import com.intellij.openapi.util.SystemInfo;
 import com.intellij.ui.TabbedPaneWrapper;
 import com.intellij.ui.components.JBTextField;
 import com.intellij.ui.tabs.impl.TabLabel;
@@ -61,12 +62,22 @@
 
   @NotNull
   public static IdeSettingsDialogFixture find(@NotNull Robot robot) {
-    return new IdeSettingsDialogFixture(robot, find(robot, SettingsDialog.class, new GenericTypeMatcher<JDialog>(JDialog.class) {
-      @Override
-      protected boolean isMatching(@NotNull JDialog component) {
-        return component.getTitle().matches("Settings.*");
-      }
-    }));
+    if (SystemInfo.isMac) {
+      return new IdeSettingsDialogFixture(robot, find(robot, SettingsDialog.class, new GenericTypeMatcher<JDialog>(JDialog.class) {
+        @Override
+        protected boolean isMatching(@NotNull JDialog component) {
+          return component.getTitle().matches("Preferences.*");
+        }
+      }));
+
+    } else {
+      return new IdeSettingsDialogFixture(robot, find(robot, SettingsDialog.class, new GenericTypeMatcher<JDialog>(JDialog.class) {
+        @Override
+        protected boolean isMatching(@NotNull JDialog component) {
+          return component.getTitle().matches("Settings.*");
+        }
+      }));
+    }
   }
 
   private IdeSettingsDialogFixture(@NotNull Robot robot, @NotNull DialogAndWrapper<SettingsDialog> dialogAndWrapper) {
diff --git a/wear-designer/BUILD b/wear-designer/BUILD
index 8128def..fe170eb 100644
--- a/wear-designer/BUILD
+++ b/wear-designer/BUILD
@@ -44,5 +44,7 @@
         "//tools/adt/idea/android:intellij.android.core[module, test]",
         "//tools/adt/idea/.idea/libraries:truth[test]",
         "//tools/adt/idea/preview-elements:intellij.android.preview-elements[module, test]",
+        "//tools/adt/idea/adt-ui:intellij.android.adt.ui[module, test]",
+        "//tools/adt/idea/.idea/libraries:mockito[test]",
     ],
 )
diff --git a/wear-designer/intellij.android.wear-designer.tests.iml b/wear-designer/intellij.android.wear-designer.tests.iml
index 385750c..19b684d 100644
--- a/wear-designer/intellij.android.wear-designer.tests.iml
+++ b/wear-designer/intellij.android.wear-designer.tests.iml
@@ -17,6 +17,8 @@
     <orderEntry type="module" module-name="intellij.android.core" scope="TEST" />
     <orderEntry type="library" name="truth" level="project" scope="TEST"/>
     <orderEntry type="module" module-name="intellij.android.preview-elements" scope="TEST" />
+    <orderEntry type="module" module-name="intellij.android.adt.ui" scope="TEST" />
+    <orderEntry type="library" name="mockito" level="project" scope="TEST"/>
   </component>
   <component name="TestModuleProperties" production-module="intellij.android.wear-designer" />
 </module>
\ No newline at end of file
diff --git a/wear-designer/src/com/android/tools/idea/wear/preview/WearTilePreviewElementModelAdapter.kt b/wear-designer/src/com/android/tools/idea/wear/preview/WearTilePreviewElementModelAdapter.kt
index bf1dc98..2199495 100644
--- a/wear-designer/src/com/android/tools/idea/wear/preview/WearTilePreviewElementModelAdapter.kt
+++ b/wear-designer/src/com/android/tools/idea/wear/preview/WearTilePreviewElementModelAdapter.kt
@@ -21,6 +21,7 @@
 import com.android.tools.idea.common.model.DataContextHolder
 import com.android.tools.idea.preview.MethodPreviewElementModelAdapter
 import com.android.tools.preview.PreviewXmlBuilder
+import com.android.tools.preview.config.findOrParseFromDefinition
 import com.intellij.openapi.actionSystem.DataKey
 import com.intellij.openapi.vfs.VirtualFile
 import com.intellij.testFramework.LightVirtualFile
@@ -59,7 +60,7 @@
     configuration.apply {
       startBulkEditing()
       target = configuration.settings.highestApiTarget
-      val device = settings.devices.findById(previewElement.configuration.device)
+      val device = settings.devices.findOrParseFromDefinition(previewElement.configuration.device)
       device?.let {
         setEffectiveDevice(null, null)
         setDevice(device, false)
diff --git a/wear-designer/src/com/android/tools/idea/wear/preview/WearTilePreviewRepresentationProvider.kt b/wear-designer/src/com/android/tools/idea/wear/preview/WearTilePreviewRepresentationProvider.kt
index 3eb82c1..b2e3580 100644
--- a/wear-designer/src/com/android/tools/idea/wear/preview/WearTilePreviewRepresentationProvider.kt
+++ b/wear-designer/src/com/android/tools/idea/wear/preview/WearTilePreviewRepresentationProvider.kt
@@ -25,11 +25,15 @@
 import com.android.tools.idea.preview.actions.StopAnimationInspectorAction
 import com.android.tools.idea.preview.actions.StopInteractivePreviewAction
 import com.android.tools.idea.preview.actions.isPreviewRefreshing
+import com.android.tools.idea.preview.actions.visibleOnlyInStaticPreview
+import com.android.tools.idea.preview.modes.GRID_LAYOUT_MANAGER_OPTIONS
+import com.android.tools.idea.preview.modes.LIST_LAYOUT_MANAGER_OPTION
 import com.android.tools.idea.preview.representation.CommonRepresentationEditorFileType
 import com.android.tools.idea.preview.representation.InMemoryLayoutVirtualFile
 import com.android.tools.idea.uibuilder.editor.multirepresentation.PreviewRepresentation
 import com.android.tools.idea.uibuilder.editor.multirepresentation.PreviewRepresentationProvider
 import com.android.tools.idea.wear.preview.WearPreviewBundle.message
+import com.android.tools.idea.wear.preview.actions.WearTileViewControlAction
 import com.google.wireless.android.sdk.stats.LayoutEditorState
 import com.intellij.openapi.actionSystem.ActionGroup
 import com.intellij.openapi.actionSystem.DefaultActionGroup
@@ -50,6 +54,12 @@
     return DefaultActionGroup(
       StopInteractivePreviewAction(isDisabled = { isPreviewRefreshing(it.dataContext) }),
       StopAnimationInspectorAction(isDisabled = { isPreviewRefreshing(it.dataContext) }),
+      WearTileViewControlAction(
+        layoutOptions = listOf(LIST_LAYOUT_MANAGER_OPTION, GRID_LAYOUT_MANAGER_OPTIONS),
+        updateMode = { selectedOption, manager ->
+          manager.setMode(manager.mode.value.deriveWithLayout(selectedOption))
+        }
+      ).visibleOnlyInStaticPreview(),
     )
   }
 
diff --git a/wear-designer/src/com/android/tools/idea/wear/preview/actions/WearTileViewControlAction.kt b/wear-designer/src/com/android/tools/idea/wear/preview/actions/WearTileViewControlAction.kt
new file mode 100644
index 0000000..d656f12
--- /dev/null
+++ b/wear-designer/src/com/android/tools/idea/wear/preview/actions/WearTileViewControlAction.kt
@@ -0,0 +1,52 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.tools.idea.wear.preview.actions
+
+import com.android.tools.idea.modes.essentials.EssentialsMode
+import com.android.tools.idea.preview.actions.SwitchSurfaceLayoutManagerAction
+import com.android.tools.idea.preview.actions.ViewControlAction
+import com.android.tools.idea.preview.actions.isPreviewRefreshing
+import com.android.tools.idea.preview.analytics.PreviewCanvasTracker
+import com.android.tools.idea.preview.modes.PreviewModeManager
+import com.android.tools.idea.preview.modes.SurfaceLayoutManagerOption
+
+class WearTileViewControlAction(
+  layoutOptions: List<SurfaceLayoutManagerOption>,
+  updateMode: (SurfaceLayoutManagerOption, PreviewModeManager) -> Unit,
+) : ViewControlAction(
+  isEnabled = { !isPreviewRefreshing(it.dataContext) },
+  isEssentialsModeEnabled = EssentialsMode::isEnabled
+) {
+
+  init {
+    add(
+      SwitchSurfaceLayoutManagerAction(layoutOptions, isActionEnabled = {
+        !isPreviewRefreshing(it.dataContext) &&
+        // If Essentials Mode is enabled, it should not be possible to switch layout.
+        !EssentialsMode.isEnabled()
+      }) {
+        selectedOption,
+        previewManager ->
+        PreviewCanvasTracker.getInstance().logSwitchLayout(selectedOption.layoutManager)
+        updateMode(selectedOption, previewManager)
+      }
+        .apply {
+          isPopup = false
+          templatePresentation.isMultiChoice = false
+        }
+    )
+  }
+}
\ No newline at end of file
diff --git a/wear-designer/testSrc/com/android/tools/idea/wear/preview/actions/WearTileViewControlActionTest.kt b/wear-designer/testSrc/com/android/tools/idea/wear/preview/actions/WearTileViewControlActionTest.kt
new file mode 100644
index 0000000..f2ff240
--- /dev/null
+++ b/wear-designer/testSrc/com/android/tools/idea/wear/preview/actions/WearTileViewControlActionTest.kt
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2024 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package com.android.tools.idea.wear.preview.actions
+
+import com.android.testutils.MockitoKt.mock
+import com.android.testutils.MockitoKt.whenever
+import com.android.tools.adtui.actions.prettyPrintActions
+import com.android.tools.idea.actions.DESIGN_SURFACE
+import com.android.tools.idea.common.surface.layout.EmptySurfaceLayoutManager
+import com.android.tools.idea.preview.modes.SurfaceLayoutManagerOption
+import com.android.tools.idea.preview.mvvm.PREVIEW_VIEW_MODEL_STATUS
+import com.android.tools.idea.preview.mvvm.PreviewViewModelStatus
+import com.android.tools.idea.testing.AndroidProjectRule
+import com.android.tools.idea.testing.onEdt
+import com.android.tools.idea.uibuilder.surface.NlDesignSurface
+import com.android.tools.idea.uibuilder.surface.ScreenViewProvider
+import com.android.tools.idea.uibuilder.surface.layout.SurfaceLayoutManager
+import com.android.tools.idea.uibuilder.visual.colorblindmode.ColorBlindMode
+import com.intellij.openapi.actionSystem.DataContext
+import com.intellij.psi.PsiFile
+import com.intellij.testFramework.TestActionEvent
+import org.junit.Assert
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertTrue
+import org.junit.Rule
+import org.junit.Test
+
+class WearTileViewControlActionTest {
+
+  @JvmField @Rule
+  val rule = AndroidProjectRule.inMemory().onEdt()
+
+  private val viewModelStatus =
+    object : PreviewViewModelStatus {
+      override var isRefreshing: Boolean = true
+      override var hasErrorsAndNeedsBuild: Boolean = true
+      override var hasSyntaxErrors: Boolean = true
+      override var isOutOfDate: Boolean = true
+      override var previewedFile: PsiFile? = null
+    }
+
+  private val dataContext = DataContext {
+    when (it) {
+      PREVIEW_VIEW_MODEL_STATUS.name -> viewModelStatus
+      else -> null
+    }
+  }
+
+  @Test
+  fun testLayoutOptions() {
+    val options =
+      listOf(
+        createOption("Layout A", EmptySurfaceLayoutManager()),
+        createOption("Layout B", EmptySurfaceLayoutManager()),
+        createOption("Layout C", EmptySurfaceLayoutManager()),
+      )
+
+    val viewControlAction =
+      WearTileViewControlAction(
+        options,
+        updateMode = { _, _ -> },
+      )
+
+    val expected =
+      """View Control
+    Switch Layout
+    Layout A
+    Layout B
+    Layout C
+"""
+
+    val screenViewProviderMock = mock<ScreenViewProvider>()
+
+    val designSurfaceMock = mock<NlDesignSurface>()
+    whenever(designSurfaceMock.screenViewProvider).thenReturn(screenViewProviderMock)
+    val dataContext = DataContext { if (DESIGN_SURFACE.`is`(it)) designSurfaceMock else null }
+
+    val actionContent = prettyPrintActions(viewControlAction, dataContext = dataContext)
+    assertEquals(expected, actionContent)
+  }
+
+  @Test
+  fun testNotEnabledWhenRefreshing() {
+    val event = TestActionEvent.createTestEvent(dataContext)
+    val viewControlAction =
+      WearTileViewControlAction(
+        listOf(createOption("Layout A", EmptySurfaceLayoutManager())),
+        updateMode = { _, _ -> },
+      )
+
+    viewModelStatus.isRefreshing = false
+    viewControlAction.update(event)
+    assertTrue(event.presentation.isEnabled)
+
+    viewModelStatus.isRefreshing = true
+    viewControlAction.update(event)
+    Assert.assertFalse(event.presentation.isEnabled)
+
+    viewModelStatus.isRefreshing = false
+    viewControlAction.update(event)
+    assertTrue(event.presentation.isEnabled)
+  }
+}
+
+private fun createOption(
+  displayText: String,
+  layoutManager: SurfaceLayoutManager,
+): SurfaceLayoutManagerOption {
+  return SurfaceLayoutManagerOption(displayText, layoutManager)
+}
\ No newline at end of file
diff --git a/wear-whs/BUILD b/wear-whs/BUILD
index 1366749..0bdd39e 100644
--- a/wear-whs/BUILD
+++ b/wear-whs/BUILD
@@ -31,5 +31,6 @@
         "//tools/adt/idea/android:intellij.android.core[module]",
         "//tools/adt/idea/.idea/libraries:studio-analytics-proto",
         "//tools/analytics-library/tracker:analytics-tracker[module]",
+        "//tools/adt/idea/.idea/libraries:mockito[test]",
     ],
 )
diff --git a/wear-whs/intellij.android.wear-whs.iml b/wear-whs/intellij.android.wear-whs.iml
index 7941688..1a6f6bf 100644
--- a/wear-whs/intellij.android.wear-whs.iml
+++ b/wear-whs/intellij.android.wear-whs.iml
@@ -28,5 +28,6 @@
     <orderEntry type="module" module-name="intellij.android.core" />
     <orderEntry type="library" name="studio-analytics-proto" level="project" />
     <orderEntry type="module" module-name="analytics-tracker" />
+    <orderEntry type="library" scope="TEST" name="mockito" level="project" />
   </component>
 </module>
diff --git a/wear-whs/resources/messages/WearWhsBundle.properties b/wear-whs/resources/messages/WearWhsBundle.properties
index 073f439..3b2c527 100644
--- a/wear-whs/resources/messages/WearWhsBundle.properties
+++ b/wear-whs/resources/messages/WearWhsBundle.properties
@@ -29,7 +29,6 @@
 wear.whs.panel.press.apply.for.overrides=Press "Apply" to update the sensor override values
 wear.whs.panel.sensor=Capability
 wear.whs.panel.override=Override
-wear.whs.panel.unit=Unit
 wear.whs.panel.reset=Reset
 wear.whs.panel.apply=Apply
 wear.whs.capability.heart.rate.label=Heart rate
@@ -45,7 +44,7 @@
 wear.whs.capability.elevation.gain.unit=m
 wear.whs.capability.elevation.loss.label=Elevation Loss
 wear.whs.capability.elevation.loss.unit=m
-wear.whs.capability.total.calories.label=Total calories
+wear.whs.capability.total.calories.label=Calories
 wear.whs.capability.total.calories.unit=kcal
 wear.whs.capability.absolute.elevation.label=Absolute Elevation
 wear.whs.capability.absolute.elevation.unit=m
@@ -62,3 +61,8 @@
 wear.whs.event.trigger.sleep.group=Trigger sleep events
 wear.whs.event.trigger.asleep=Trigger user asleep
 wear.whs.event.trigger.awake=Trigger user awake
+wear.whs.event.trigger.golf.shots.group=Trigger golf shots
+wear.whs.event.trigger.golf.shot.unclassified=Trigger unclassified golf shot
+wear.whs.event.trigger.golf.shot.putt=Trigger golf shot with putt swing
+wear.whs.event.trigger.golf.shot.partial=Trigger golf shot with partial swing
+wear.whs.event.trigger.golf.shot.full=Trigger golf shot with full swing
diff --git a/wear-whs/src/com/android/tools/idea/wearwhs/EventTrigger.kt b/wear-whs/src/com/android/tools/idea/wearwhs/EventTrigger.kt
index 0dca2c1..f1d5e8f 100644
--- a/wear-whs/src/com/android/tools/idea/wearwhs/EventTrigger.kt
+++ b/wear-whs/src/com/android/tools/idea/wearwhs/EventTrigger.kt
@@ -17,6 +17,11 @@
 
 import com.android.tools.idea.wearwhs.WearWhsBundle.message
 
+private val METADATA_SHOT_SWING_TYPE_KEY = "golf_shot_swing_type"
+private val METADATA_SHOT_SWING_TYPE_VALUE_PUTT = "putt"
+private val METADATA_SHOT_SWING_TYPE_VALUE_PARTIAL = "partial"
+private val METADATA_SHOT_SWING_TYPE_VALUE_FULL = "full"
+
 /**
  * Data class representing WHS event triggers such as User Asleep or exercise paused. [eventKey] is the
  * key for this data type in WHS, [eventLabel] is the user displayed label of the trigger.
@@ -24,6 +29,7 @@
 data class EventTrigger(
   val eventKey: String,
   val eventLabel: String,
+  val eventMetadata: Map<String, String> = emptyMap()
 )
 
 /**
@@ -63,5 +69,31 @@
         eventLabel = message("wear.whs.event.trigger.awake")
       ),
     )
+  ),
+  EventTriggerGroup(
+    eventGroupLabel = message("wear.whs.event.trigger.golf.shots.group"),
+    eventTriggers = listOf(
+      EventTrigger(
+        eventKey = "whs.GOLF_SHOT",
+        eventLabel = message("wear.whs.event.trigger.golf.shot.putt"),
+        eventMetadata = mapOf(
+          METADATA_SHOT_SWING_TYPE_KEY to METADATA_SHOT_SWING_TYPE_VALUE_PUTT
+        )
+      ),
+      EventTrigger(
+        eventKey = "whs.GOLF_SHOT",
+        eventLabel = message("wear.whs.event.trigger.golf.shot.partial"),
+        eventMetadata = mapOf(
+          METADATA_SHOT_SWING_TYPE_KEY to METADATA_SHOT_SWING_TYPE_VALUE_PARTIAL
+        )
+      ),
+      EventTrigger(
+        eventKey = "whs.GOLF_SHOT",
+        eventLabel = message("wear.whs.event.trigger.golf.shot.full"),
+        eventMetadata = mapOf(
+          METADATA_SHOT_SWING_TYPE_KEY to METADATA_SHOT_SWING_TYPE_VALUE_FULL
+        )
+      ),
+    )
   )
 )
\ No newline at end of file
diff --git a/wear-whs/src/com/android/tools/idea/wearwhs/WhsCapability.kt b/wear-whs/src/com/android/tools/idea/wearwhs/WhsCapability.kt
index 7dd8b57..9d1c3a7 100644
--- a/wear-whs/src/com/android/tools/idea/wearwhs/WhsCapability.kt
+++ b/wear-whs/src/com/android/tools/idea/wearwhs/WhsCapability.kt
@@ -21,7 +21,7 @@
   DATA_TYPE_UNKNOWN,
   STEPS,
   DISTANCE,
-  TOTAL_CALORIES,
+  CALORIES,
   FLOORS,
   ELEVATION_GAIN,
   ELEVATION_LOSS,
@@ -99,7 +99,7 @@
     isStandardCapability = false,
   ),
   WhsCapability(
-    WhsDataType.TOTAL_CALORIES,
+    WhsDataType.CALORIES,
     "wear.whs.capability.total.calories.label",
     "wear.whs.capability.total.calories.unit",
     isOverrideable = true,
diff --git a/wear-whs/src/com/android/tools/idea/wearwhs/communication/ContentProviderDeviceManager.kt b/wear-whs/src/com/android/tools/idea/wearwhs/communication/ContentProviderDeviceManager.kt
index a236817..89986f8 100644
--- a/wear-whs/src/com/android/tools/idea/wearwhs/communication/ContentProviderDeviceManager.kt
+++ b/wear-whs/src/com/android/tools/idea/wearwhs/communication/ContentProviderDeviceManager.kt
@@ -25,10 +25,12 @@
 import com.intellij.openapi.diagnostic.Logger
 
 const val whsPackage: String = "com.google.android.wearable.healthservices"
-const val whsUri: String = "content://$whsPackage.dev.synthetic/synthetic_config"
+const val whsConfigUri: String = "content://$whsPackage.dev.synthetic/synthetic_config"
+const val whsActiveExerciseUri: String = "content://$whsPackage.dev.exerciseinfo"
 const val whsDevVersionCode = 1
 val capabilityStatePattern = Regex("Row: \\d+ data_type=(\\w+), is_enabled=(true|false), override_value=(\\d+\\.?\\d*)")
 val versionCodePattern = Regex("versionCode=(\\d+)")
+val activeExerciseRegex = Regex("active_exercise=(true|false)")
 
 /**
  * Content provider implementation of [WearHealthServicesDeviceManager].
@@ -36,24 +38,25 @@
  * This class uses the content provider for the synthetic HAL in WHS to sync the current state
  * of the UI to the selected Wear OS device.
  */
-internal class ContentProviderDeviceManager(private val adbSession: AdbSession, private var capabilities: List<WhsCapability> = WHS_CAPABILITIES) : WearHealthServicesDeviceManager {
+internal class ContentProviderDeviceManager(private val adbSession: AdbSession,
+                                            private var capabilities: List<WhsCapability> = WHS_CAPABILITIES) : WearHealthServicesDeviceManager {
   private var serialNumber: String? = null
   private val logger = Logger.getInstance(ContentProviderDeviceManager::class.java)
 
   override suspend fun loadCapabilities() = capabilities
 
-  override suspend fun loadCurrentCapabilityStates(): Map<WhsDataType, CapabilityStatus> {
+  override suspend fun loadCurrentCapabilityStates(): Map<WhsDataType, CapabilityState> {
     if (serialNumber == null) {
-      // TODO: Log this error
+      logger.warn(IllegalStateException("Serial number not set"))
       return emptyMap()
     }
 
     val device = DeviceSelector.fromSerialNumber(serialNumber!!)
-    val output = adbSession.deviceServices.shellAsText(device, "content query --uri $whsUri")
+    val output = adbSession.deviceServices.shellAsText(device, "content query --uri $whsConfigUri")
 
     val contentProviderEntryMatches = capabilityStatePattern.findAll(output.stdout)
 
-    val capabilities = mutableMapOf<WhsDataType, CapabilityStatus>()
+    val capabilities = mutableMapOf<WhsDataType, CapabilityState>()
 
     for (match in contentProviderEntryMatches) {
       val dataType = match.groupValues[1].toDataType()
@@ -62,7 +65,7 @@
       }
       val isEnabled = match.groupValues[2].toBoolean()
 
-      capabilities[dataType] = CapabilityStatus(isEnabled, null)
+      capabilities[dataType] = CapabilityState(isEnabled, null)
     }
 
     return capabilities
@@ -70,17 +73,17 @@
 
   override suspend fun clearContentProvider() {
     if (serialNumber == null) {
-      // TODO: Log this error
+      logger.warn(IllegalStateException("Serial number not set"))
       return
     }
 
     val device = DeviceSelector.fromSerialNumber(serialNumber!!)
-    adbSession.deviceServices.shellAsText(device, "content delete --uri $whsUri")
+    adbSession.deviceServices.shellAsText(device, "content delete --uri $whsConfigUri")
   }
 
   override suspend fun isWhsVersionSupported(): Boolean {
     if (serialNumber == null) {
-      // TODO: Log this error
+      logger.warn(IllegalStateException("Serial number not set"))
       return false
     }
 
@@ -96,11 +99,23 @@
     this.serialNumber = serialNumber
   }
 
-  // TODO(b/305924111) Implement loadOngoingExercise method
-  override suspend fun loadOngoingExercise() = false
+  private fun activeExerciseCommand(): String {
+    return "content query --uri $whsActiveExerciseUri"
+  }
+
+  override suspend fun loadActiveExercise(): Boolean {
+    if (serialNumber == null) {
+      logger.warn(IllegalStateException("Serial number not set"))
+      return false
+    }
+
+    val output = adbSession.deviceServices.shellAsText(DeviceSelector.fromSerialNumber(serialNumber!!), activeExerciseCommand())
+    val activeExercise = activeExerciseRegex.find(output.stdout)?.groupValues?.get(1)?.toBoolean()
+    return activeExercise ?: false
+  }
 
   private fun contentUpdateMultipleCapabilities(capabilityUpdates: Map<WhsDataType, Any?>): String {
-    val sb = StringBuilder("content update --uri $whsUri")
+    val sb = StringBuilder("content update --uri $whsConfigUri")
     for ((dataType, value) in capabilityUpdates.toSortedMap(compareBy { it.name })) {
       if (dataType == WhsDataType.LOCATION && value !is Boolean) {
         continue // Location does not have an override value
@@ -132,13 +147,12 @@
 
   override suspend fun setCapabilities(capabilityUpdates: Map<WhsDataType, Boolean>) {
     if (serialNumber == null) {
-      // TODO: Log this error
+      logger.warn(IllegalStateException("Serial number not set"))
       return
     }
 
-    val contentUpdateCommand = contentUpdateMultipleCapabilities(capabilityUpdates)
     val device = DeviceSelector.fromSerialNumber(serialNumber!!)
-
+    val contentUpdateCommand = contentUpdateMultipleCapabilities(capabilityUpdates)
     adbSession.deviceServices.shellAsText(device, contentUpdateCommand)
   }
 
@@ -152,12 +166,18 @@
     adbSession.deviceServices.shellAsText(device, triggerEventCommand(eventTrigger))
   }
 
-  private fun triggerEventCommand(eventTrigger: EventTrigger) =
-    "am broadcast -a \"${eventTrigger.eventKey}\" $whsPackage"
+  private fun triggerEventCommand(eventTrigger: EventTrigger): String {
+    val commandStringBuilder = StringBuilder("am broadcast -a \"${eventTrigger.eventKey}\"")
+    for ((key, value) in eventTrigger.eventMetadata) {
+      commandStringBuilder.append(" --es $key \"$value\"")
+    }
+    commandStringBuilder.append(" $whsPackage")
+    return commandStringBuilder.toString()
+  }
 
   override suspend fun overrideValues(overrideUpdates: Map<WhsDataType, Number?>) {
     if (serialNumber == null) {
-      // TODO: Log this error
+      logger.warn(IllegalStateException("Serial number not set"))
       return
     }
 
diff --git a/wear-whs/src/com/android/tools/idea/wearwhs/communication/WearHealthServicesDeviceManager.kt b/wear-whs/src/com/android/tools/idea/wearwhs/communication/WearHealthServicesDeviceManager.kt
index 3528814..ea746a4 100644
--- a/wear-whs/src/com/android/tools/idea/wearwhs/communication/WearHealthServicesDeviceManager.kt
+++ b/wear-whs/src/com/android/tools/idea/wearwhs/communication/WearHealthServicesDeviceManager.kt
@@ -35,7 +35,7 @@
    *
    * @return true if there's an ongoing exercise, false otherwise.
    */
-  suspend fun loadOngoingExercise(): Boolean
+  suspend fun loadActiveExercise(): Boolean
 
   /**
    * Set multiple WHS capabilities on the device.
@@ -50,25 +50,32 @@
   /**
    * Loads the current state from WHS to compare with the current UI.
    */
-  suspend fun loadCurrentCapabilityStates(): Map<WhsDataType, CapabilityStatus>
+  suspend fun loadCurrentCapabilityStates(): Map<WhsDataType, CapabilityState>
 
   /**
    * Deletes all data from the WHS content provider
    */
   suspend fun clearContentProvider()
 
+  /**
+   * Returns if the WHS version is supported.
+   */
   suspend fun isWhsVersionSupported(): Boolean
 
   /**
    * Sets the serial number of the emulator to connect.
    */
   fun setSerialNumber(serialNumber: String)
+
+  /**
+   * Sends an event trigger to the device.
+   */
   suspend fun triggerEvent(eventTrigger: EventTrigger)
 }
 
-internal data class CapabilityStatus(
-  var enabled: Boolean,
-  var overrideValue: Float?,
+internal data class CapabilityState(
+  val enabled: Boolean,
+  val overrideValue: Float?,
 )
 
 internal class ConnectionLostException(message: String) : Exception(message)
diff --git a/wear-whs/src/com/android/tools/idea/wearwhs/view/WearHealthServicesToolWindow.kt b/wear-whs/src/com/android/tools/idea/wearwhs/view/WearHealthServicesToolWindow.kt
index 0d2b157c..82688b2 100644
--- a/wear-whs/src/com/android/tools/idea/wearwhs/view/WearHealthServicesToolWindow.kt
+++ b/wear-whs/src/com/android/tools/idea/wearwhs/view/WearHealthServicesToolWindow.kt
@@ -54,6 +54,7 @@
 import javax.swing.DefaultComboBoxModel
 import javax.swing.JButton
 import javax.swing.JCheckBox
+import javax.swing.JComponent
 import javax.swing.JLabel
 import javax.swing.JPanel
 import javax.swing.JTextField
@@ -67,19 +68,22 @@
   true, true), Disposable {
   private val uiScope: CoroutineScope = AndroidCoroutineScope(this, uiThread)
   private val workerScope: CoroutineScope = AndroidCoroutineScope(this, workerThread)
+  private var isErrorState = false
 
   fun setSerialNumber(serialNumber: String) {
-    if (serialNumber != stateManager.serialNumber) {
+    if (serialNumber != stateManager.serialNumber || isErrorState) {
       stateManager.serialNumber = serialNumber
       workerScope.launch {
         if (stateManager.isWhsVersionSupported()) {
           withContext(uiThread) {
+            isErrorState = false
             removeAll()
             add(createContentPanel())
           }
         }
         else {
           withContext(uiThread) {
+            isErrorState = true
             removeAll()
             add(createWhsVersionNotSupportedPanel())
           }
@@ -227,6 +231,14 @@
       setBorder(Borders.empty(2))
       isVisible = false
     }
+    // List of elements that should be hidden if there's an active exercise
+    val overrideElementsList = mutableListOf<JComponent>()
+    overrideElementsList.add(warningLabel)
+    stateManager.getOngoingExercise().onEach {
+      overrideElementsList.forEach { element ->
+        element.isVisible = it
+      }
+    }.launchIn(uiScope)
     return JPanel(VerticalFlowLayout()).apply {
       add(warningLabel)
       border = horizontalBorders
@@ -236,12 +248,9 @@
         }, BorderLayout.CENTER)
         add(JPanel(FlowLayout()).apply {
           add(JLabel(message("wear.whs.panel.override")).apply {
+            overrideElementsList.add(this)
             font = font.deriveFont(Font.BOLD)
           })
-          add(JLabel(message("wear.whs.panel.unit")).apply {
-            font = font.deriveFont(Font.BOLD)
-            preferredSize = Dimension(50, preferredSize.height)
-          })
         }, BorderLayout.EAST)
       })
       capabilities.forEach { capability ->
@@ -250,7 +259,7 @@
           val checkBox = JCheckBox(message(capability.label)).also { checkBox ->
             val plainFont = checkBox.font.deriveFont(Font.PLAIN)
             val italicFont = checkBox.font.deriveFont(Font.ITALIC)
-            stateManager.getState(capability).map { it.enabled }.onEach { enabled ->
+            stateManager.getState(capability).map { it.capabilityState.enabled }.onEach { enabled ->
               checkBox.isSelected = enabled
             }.launchIn(uiScope)
             stateManager.getState(capability).map { it.synced }.onEach { synced ->
@@ -272,6 +281,7 @@
           }
           add(checkBox, BorderLayout.CENTER)
           add(JPanel(FlowLayout()).apply {
+            overrideElementsList.add(this)
             add(JTextField().also { textField ->
               textField.addFocusListener(object : FocusListener {
                 override fun focusGained(e: FocusEvent?) {}
@@ -316,7 +326,7 @@
                   }
                 }
               })
-              stateManager.getState(capability).map { it.overrideValue }.onEach {
+              stateManager.getState(capability).map { it.capabilityState.overrideValue }.onEach {
                 if (!textField.isFocusOwner) {
                   textField.text = it?.toString() ?: ""
                 }
diff --git a/wear-whs/src/com/android/tools/idea/wearwhs/view/WearHealthServicesToolWindowStateManager.kt b/wear-whs/src/com/android/tools/idea/wearwhs/view/WearHealthServicesToolWindowStateManager.kt
index 749ffde..f371055 100644
--- a/wear-whs/src/com/android/tools/idea/wearwhs/view/WearHealthServicesToolWindowStateManager.kt
+++ b/wear-whs/src/com/android/tools/idea/wearwhs/view/WearHealthServicesToolWindowStateManager.kt
@@ -19,6 +19,7 @@
 import com.android.tools.idea.wearwhs.EventTrigger
 import com.android.tools.idea.wearwhs.WearWhsBundle.message
 import com.android.tools.idea.wearwhs.WhsCapability
+import com.android.tools.idea.wearwhs.communication.CapabilityState
 import com.android.tools.idea.wearwhs.view.Preset.ALL
 import com.android.tools.idea.wearwhs.view.Preset.CUSTOM
 import com.android.tools.idea.wearwhs.view.Preset.STANDARD
@@ -55,7 +56,7 @@
    */
   suspend  fun setOverrideValue(capability: WhsCapability, value: Float?)
 
-  fun getState(capability: WhsCapability): StateFlow<CapabilityState>
+  fun getState(capability: WhsCapability): StateFlow<CapabilityUIState>
 
     /**
    * Applies the changes on current device.
@@ -126,8 +127,7 @@
 /**
  * Data class representing current state of a WHS capability.
  */
-internal data class CapabilityState(
-  val enabled: Boolean = false,
-  val overrideValue: Float? = null,
+internal data class CapabilityUIState(
   val synced: Boolean = false,
+  val capabilityState: CapabilityState = CapabilityState(false, null)
 )
diff --git a/wear-whs/src/com/android/tools/idea/wearwhs/view/WearHealthServicesToolWindowStateManagerImpl.kt b/wear-whs/src/com/android/tools/idea/wearwhs/view/WearHealthServicesToolWindowStateManagerImpl.kt
index 16f630b..f05c003 100644
--- a/wear-whs/src/com/android/tools/idea/wearwhs/view/WearHealthServicesToolWindowStateManagerImpl.kt
+++ b/wear-whs/src/com/android/tools/idea/wearwhs/view/WearHealthServicesToolWindowStateManagerImpl.kt
@@ -17,27 +17,42 @@
 
 import com.android.tools.idea.concurrency.AndroidCoroutineScope
 import com.android.tools.idea.wearwhs.EventTrigger
+import com.android.tools.idea.wearwhs.WHS_CAPABILITIES
 import com.android.tools.idea.wearwhs.WhsCapability
+import com.android.tools.idea.wearwhs.WhsDataType
+import com.android.tools.idea.wearwhs.communication.CapabilityState
 import com.android.tools.idea.wearwhs.communication.ConnectionLostException
 import com.android.tools.idea.wearwhs.communication.WearHealthServicesDeviceManager
 import com.android.tools.idea.wearwhs.logger.WearHealthServicesEventLogger
 import com.intellij.openapi.Disposable
+import com.intellij.openapi.diagnostic.Logger
 import io.ktor.util.collections.ConcurrentMap
+import kotlinx.coroutines.delay
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.StateFlow
 import kotlinx.coroutines.flow.asStateFlow
 import kotlinx.coroutines.launch
+import org.jetbrains.annotations.VisibleForTesting
+import org.jetbrains.annotations.TestOnly
+import kotlin.time.Duration.Companion.seconds
+
+/**
+ * Default polling interval for updating the state manager with values from [WearHealthServicesDeviceManager].
+ */
+private const val POLLING_INTERVAL_SECONDS: Long = 10L
 
 internal class WearHealthServicesToolWindowStateManagerImpl(
   private val deviceManager: WearHealthServicesDeviceManager,
-  private val logger: WearHealthServicesEventLogger = WearHealthServicesEventLogger())
+  private val logger: WearHealthServicesEventLogger = WearHealthServicesEventLogger(),
+  @VisibleForTesting private val pollingIntervalSeconds: Long = POLLING_INTERVAL_SECONDS)
   : WearHealthServicesToolWindowStateManager, Disposable {
+
   private val currentPreset = MutableStateFlow(Preset.ALL)
   private val capabilitiesList = MutableStateFlow(emptyList<WhsCapability>())
-  private val capabilityToState = ConcurrentMap<WhsCapability, MutableStateFlow<CapabilityState>>()
+  private val capabilityToState = ConcurrentMap<WhsCapability, MutableStateFlow<CapabilityUIState>>()
   private val progress = MutableStateFlow<WhsStateManagerStatus>(WhsStateManagerStatus.Idle)
+  private val workerScope = AndroidCoroutineScope(this)
 
-  // TODO(b/305924111): Update this value periodically to reflect it on the UI
   private val ongoingExercise = MutableStateFlow(false)
 
   override var serialNumber: String? = null
@@ -51,14 +66,45 @@
     }
 
   init {
-    AndroidCoroutineScope(this).launch {
+    workerScope.launch {
       setCapabilities(deviceManager.loadCapabilities())
+      while (true) {
+        updateState()
+        delay(pollingIntervalSeconds.seconds)
+      }
+    }
+  }
+
+  private suspend fun updateState() {
+    if (serialNumber == null) {
+      // Panel is not bound to an emulator yet
+      return
+    }
+    try {
+      ongoingExercise.emit(deviceManager.loadActiveExercise())
+      val currentStates = deviceManager.loadCurrentCapabilityStates()
+      currentStates.forEach { (dataType, state) ->
+        // Update values only if they're synced through and got changed in the background
+        capabilityToState[dataType.toCapability()]?.let { stateFlow ->
+          if (stateFlow.value.synced) {
+            stateFlow.emit(
+              stateFlow.value.copy(
+                capabilityState = CapabilityState(state.enabled, state.overrideValue),
+                synced = true
+              )
+            )
+          }
+        }
+      }
+    }
+    catch (e: ConnectionLostException) {
+      Logger.getInstance(WearHealthServicesToolWindowStateManager::class.java).warn(e)
     }
   }
 
   private suspend fun setCapabilities(whsCapabilities: List<WhsCapability>) {
     capabilityToState.clear()
-    capabilityToState.putAll(whsCapabilities.associateWith { MutableStateFlow(CapabilityState()) })
+    capabilityToState.putAll(whsCapabilities.associateWith { MutableStateFlow(CapabilityUIState()) })
     setPreset(currentPreset.value)
     capabilitiesList.emit(whsCapabilities)
   }
@@ -69,7 +115,8 @@
   override suspend fun isWhsVersionSupported(): Boolean {
     return try {
       deviceManager.isWhsVersionSupported()
-    } catch (exception: ConnectionLostException) {
+    }
+    catch (exception: ConnectionLostException) {
       // TODO(b/320432666): For now catch this error and show whs version not supported UI, eventually show separate could not connect UI
       false
     }
@@ -80,7 +127,8 @@
   override suspend fun triggerEvent(eventTrigger: EventTrigger) {
     try {
       deviceManager.triggerEvent(eventTrigger)
-    } catch (exception: ConnectionLostException) {
+    }
+    catch (exception: ConnectionLostException) {
       progress.emit(WhsStateManagerStatus.ConnectionLost)
     }
   }
@@ -102,29 +150,30 @@
     currentPreset.emit(preset)
   }
 
-  override fun getState(capability: WhsCapability): StateFlow<CapabilityState> =
+  override fun getState(capability: WhsCapability): StateFlow<CapabilityUIState> =
     capabilityToState[capability]?.asStateFlow() ?: throw IllegalArgumentException()
 
   override suspend fun setCapabilityEnabled(capability: WhsCapability, enabled: Boolean) {
     val stateFlow = capabilityToState[capability] ?: throw IllegalArgumentException()
-    val newState = stateFlow.value.copy(enabled = enabled, synced = false)
+    val newState = stateFlow.value.copy(capabilityState = CapabilityState(enabled, stateFlow.value.capabilityState.overrideValue), synced = false)
     stateFlow.emit(newState)
   }
 
   override suspend fun setOverrideValue(capability: WhsCapability, value: Float?) {
     val stateFlow = capabilityToState[capability] ?: throw IllegalArgumentException()
-    val newState = stateFlow.value.copy(overrideValue = value, synced = false)
+    val newState = stateFlow.value.copy(capabilityState = CapabilityState(stateFlow.value.capabilityState.enabled, value), synced = false)
     stateFlow.emit(newState)
   }
 
   override suspend fun applyChanges() {
     progress.emit(WhsStateManagerStatus.Syncing)
-    val capabilityUpdates = capabilityToState.entries.associate { it.key.dataType to it.value.value.enabled }
-    val overrideUpdates = capabilityToState.entries.associate { it.key.dataType to it.value.value.overrideValue }
+    val capabilityUpdates = capabilityToState.entries.associate { it.key.dataType to it.value.value.capabilityState.enabled }
+    val overrideUpdates = capabilityToState.entries.associate { it.key.dataType to it.value.value.capabilityState.overrideValue }
     try {
       deviceManager.setCapabilities(capabilityUpdates)
       deviceManager.overrideValues(overrideUpdates)
-    } catch (exception: ConnectionLostException) {
+    }
+    catch (exception: ConnectionLostException) {
       logger.logApplyChangesFailure()
       progress.emit(WhsStateManagerStatus.ConnectionLost)
       return
@@ -149,4 +198,15 @@
   override fun dispose() { // Clear all callbacks to avoid memory leaks
     capabilityToState.clear()
   }
+
+  @TestOnly
+  internal suspend fun forceUpdateState() {
+    updateState()
+  }
+}
+
+private fun WhsDataType.toCapability(): WhsCapability {
+  return WHS_CAPABILITIES.single {
+    it.dataType == this
+  }
 }
diff --git a/wear-whs/testData/screens/whs-panel-default-linux.png b/wear-whs/testData/screens/whs-panel-default-linux.png
index 8b61d61..15cf60e 100644
--- a/wear-whs/testData/screens/whs-panel-default-linux.png
+++ b/wear-whs/testData/screens/whs-panel-default-linux.png
Binary files differ
diff --git a/wear-whs/testData/screens/whs-panel-default-windows.png b/wear-whs/testData/screens/whs-panel-default-windows.png
index c492faf..b973d64 100644
--- a/wear-whs/testData/screens/whs-panel-default-windows.png
+++ b/wear-whs/testData/screens/whs-panel-default-windows.png
Binary files differ
diff --git a/wear-whs/testData/screens/whs-panel-state-manager-modified-linux.png b/wear-whs/testData/screens/whs-panel-state-manager-modified-linux.png
index 647bb44..dc9020f 100644
--- a/wear-whs/testData/screens/whs-panel-state-manager-modified-linux.png
+++ b/wear-whs/testData/screens/whs-panel-state-manager-modified-linux.png
Binary files differ
diff --git a/wear-whs/testData/screens/whs-panel-state-manager-modified-windows.png b/wear-whs/testData/screens/whs-panel-state-manager-modified-windows.png
index 209d9e1..678723b 100644
--- a/wear-whs/testData/screens/whs-panel-state-manager-modified-windows.png
+++ b/wear-whs/testData/screens/whs-panel-state-manager-modified-windows.png
Binary files differ
diff --git a/wear-whs/testSrc/com/android/tools/idea/wearwhs/communication/DeviceManagerTest.kt b/wear-whs/testSrc/com/android/tools/idea/wearwhs/communication/DeviceManagerTest.kt
index f4b78b4..1de7c28 100644
--- a/wear-whs/testSrc/com/android/tools/idea/wearwhs/communication/DeviceManagerTest.kt
+++ b/wear-whs/testSrc/com/android/tools/idea/wearwhs/communication/DeviceManagerTest.kt
@@ -19,7 +19,6 @@
 import com.android.adblib.testing.FakeAdbSession
 import com.android.tools.idea.wearwhs.EventTrigger
 import com.android.tools.idea.wearwhs.WHS_CAPABILITIES
-import com.android.tools.idea.wearwhs.WhsCapability
 import com.android.tools.idea.wearwhs.WhsDataType
 import junit.framework.TestCase.assertEquals
 import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -29,148 +28,12 @@
 import org.junit.Before
 import org.junit.Test
 
+const val WHS_PACKAGE_ID = "com.google.android.wearable.healthservices"
+const val WHS_CONTENT_PROVIDER_URI = "content://$WHS_PACKAGE_ID.dev.synthetic/synthetic_config"
+const val CONTENT_UPDATE_SHELL_COMMAND = "content update --uri $WHS_CONTENT_PROVIDER_URI"
+
 @OptIn(ExperimentalCoroutinesApi::class)
 class DeviceManagerTest {
-  private val adbCommandEnableSteps = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind STEPS:b:true"
-  private val adbCommandEnableDistance = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind DISTANCE:b:true"
-  private val adbCommandEnableTotalCalories = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind TOTAL_CALORIES:b:true"
-  private val adbCommandEnableFloors = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind FLOORS:b:true"
-  private val adbCommandEnableElevationGain = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind ELEVATION_GAIN:b:true"
-  private val adbCommandEnableElevationLoss = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind ELEVATION_LOSS:b:true"
-  private val adbCommandEnableAbsoluteElevation = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind ABSOLUTE_ELEVATION:b:true"
-  private val adbCommandEnableLocation = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind LOCATION:b:true"
-  private val adbCommandEnableHeartRateBpm = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind HEART_RATE_BPM:b:true"
-  private val adbCommandEnableSpeed = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind SPEED:b:true"
-  private val adbCommandEnablePace = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind PACE:b:true"
-  private val adbCommandEnableStepsPerMinute = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind STEPS_PER_MINUTE:b:true"
-  private val adbCommandDisableSteps = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind STEPS:b:false"
-  private val adbCommandDisableDistance = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind DISTANCE:b:false"
-  private val adbCommandDisableTotalCalories = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind TOTAL_CALORIES:b:false"
-  private val adbCommandDisableFloors = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind FLOORS:b:false"
-  private val adbCommandDisableElevationGain = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind ELEVATION_GAIN:b:false"
-  private val adbCommandDisableElevationLoss = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind ELEVATION_LOSS:b:false"
-  private val adbCommandDisableAbsoluteElevation = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind ABSOLUTE_ELEVATION:b:false"
-  private val adbCommandDisableLocation = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind LOCATION:b:false"
-  private val adbCommandDisableHeartRateBpm = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind HEART_RATE_BPM:b:false"
-  private val adbCommandDisableSpeed = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind SPEED:b:false"
-  private val adbCommandDisablePace = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind PACE:b:false"
-  private val adbCommandDisableStepsPerMinute = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind STEPS_PER_MINUTE:b:false"
-  private val adbCommandSetStepsTo55 = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind STEPS:i:55"
-  private val adbCommandSetDistanceTo10 = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind DISTANCE:f:10.0"
-  private val adbCommandSetTotalCaloriesTo100 = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind TOTAL_CALORIES:f:100.0"
-  private val adbCommandSetFloorsTo5 = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind FLOORS:f:5.0"
-  private val adbCommandSetElevationGainTo50 = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind ELEVATION_GAIN:f:50.0"
-  private val adbCommandSetElevationLossTo20 = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind ELEVATION_LOSS:f:20.0"
-  private val adbCommandSetAbsoluteElevationTo120 = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind ABSOLUTE_ELEVATION:f:120.0"
-  private val adbCommandSetHeartRateBpmTo65 = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind HEART_RATE_BPM:f:65.0"
-  private val adbCommandSetSpeedTo30 = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind SPEED:f:30.0"
-  private val adbCommandSetPaceTo20 = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind PACE:f:20.0"
-  private val adbCommandSetStepsPerMinuteTo25 = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind STEPS_PER_MINUTE:f:25.0"
-  private val adbCommandClearSteps = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind STEPS:s:\"\""
-  private val adbCommandClearDistance = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind DISTANCE:s:\"\""
-  private val adbCommandClearTotalCalories = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind TOTAL_CALORIES:s:\"\""
-  private val adbCommandClearFloors = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind FLOORS:s:\"\""
-  private val adbCommandClearElevationGain = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind ELEVATION_GAIN:s:\"\""
-  private val adbCommandClearElevationLoss = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind ELEVATION_LOSS:s:\"\""
-  private val adbCommandClearAbsoluteElevation = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind ABSOLUTE_ELEVATION:s:\"\""
-  private val adbCommandClearHeartRateBpm = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind HEART_RATE_BPM:s:\"\""
-  private val adbCommandClearSpeed = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind SPEED:s:\"\""
-  private val adbCommandClearPace = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind PACE:s:\"\""
-  private val adbCommandClearStepsPerMinute = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind STEPS_PER_MINUTE:s:\"\""
-  private val adbCommandDeleteEntries = "content delete --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config"
-  private val adbCommandSetMultipleCapabilities = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind ABSOLUTE_ELEVATION:b:false --bind DISTANCE:b:false --bind ELEVATION_GAIN:b:true --bind ELEVATION_LOSS:b:false --bind FLOORS:b:false --bind HEART_RATE_BPM:b:true --bind LOCATION:b:true --bind PACE:b:true --bind SPEED:b:false --bind STEPS:b:true --bind STEPS_PER_MINUTE:b:false --bind TOTAL_CALORIES:b:false"
-  private val adbCommandMultipleFloatOverrides = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind DISTANCE:f:12.0 --bind FLOORS:f:5.0 --bind TOTAL_CALORIES:f:123.0"
-  private val adbCommandFloatIntOverrides = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind ELEVATION_LOSS:f:5.0 --bind STEPS:i:55"
-  private val adbCommandFloatIntNullOverrides = "content update --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config --bind ELEVATION_LOSS:f:5.0 --bind PACE:s:\"\" --bind STEPS:i:55"
-  private val adbCommandCheckWhsVersionCode = "dumpsys package com.google.android.wearable.healthservices | grep versionCode | head -n1"
-  private val adbCommandQueryContentProvider = "content query --uri content://com.google.android.wearable.healthservices.dev.synthetic/synthetic_config"
-
-  private val capabilities = mapOf(
-    WhsDataType.STEPS to WhsCapability(
-      WhsDataType.STEPS,
-      "wear.whs.capability.steps.label",
-      "wear.whs.capability.steps.unit",
-      isOverrideable = true,
-      isStandardCapability = true,
-    ),
-    WhsDataType.DISTANCE to WhsCapability(
-      WhsDataType.DISTANCE,
-      "wear.whs.capability.distance.label",
-      "wear.whs.capability.distance.unit",
-      isOverrideable = true,
-      isStandardCapability = true,
-    ),
-    WhsDataType.TOTAL_CALORIES to WhsCapability(
-      WhsDataType.TOTAL_CALORIES,
-      "wear.whs.capability.total.calories.label",
-      "wear.whs.capability.total.calories.unit",
-      isOverrideable = true,
-      isStandardCapability = true,
-    ),
-    WhsDataType.FLOORS to WhsCapability(
-      WhsDataType.FLOORS,
-      "wear.whs.capability.floors.label",
-      "wear.whs.capability.unit.none",
-      isOverrideable = true,
-      isStandardCapability = true,
-    ),
-    WhsDataType.ELEVATION_GAIN to WhsCapability(
-      WhsDataType.ELEVATION_GAIN,
-      "wear.whs.capability.elevation.gain.label",
-      "wear.whs.capability.elevation.gain.unit",
-      isOverrideable = true,
-      isStandardCapability = true,
-    ),
-    WhsDataType.ELEVATION_LOSS to WhsCapability(
-      WhsDataType.ELEVATION_LOSS,
-      "wear.whs.capability.elevation.loss.label",
-      "wear.whs.capability.elevation.loss.unit",
-      isOverrideable = true,
-      isStandardCapability = true,
-    ),
-    WhsDataType.ABSOLUTE_ELEVATION to WhsCapability(
-      WhsDataType.ABSOLUTE_ELEVATION,
-      "wear.whs.capability.absolute.elevation.label",
-      "wear.whs.capability.unit.none",
-      isOverrideable = true,
-      isStandardCapability = true,
-    ),
-    WhsDataType.LOCATION to WhsCapability(
-      WhsDataType.LOCATION,
-      "wear.whs.capability.location.label",
-      "wear.whs.capability.unit.none",
-      isOverrideable = true,
-      isStandardCapability = true,
-    ),
-    WhsDataType.HEART_RATE_BPM to WhsCapability(
-      WhsDataType.HEART_RATE_BPM,
-      "wear.whs.capability.heart.rate.label",
-      "wear.whs.capability.heart.rate.unit",
-      isOverrideable = true,
-      isStandardCapability = true,
-    ),
-    WhsDataType.SPEED to WhsCapability(
-      WhsDataType.SPEED,
-      "wear.whs.capability.speed.label",
-      "wear.whs.capability.speed.unit",
-      isOverrideable = true,
-      isStandardCapability = true,
-    ),
-    WhsDataType.PACE to WhsCapability(
-      WhsDataType.PACE,
-      "wear.whs.capability.pace.label",
-      "wear.whs.capability.pace.unit",
-      isOverrideable = true,
-      isStandardCapability = true,
-    ),
-    WhsDataType.STEPS_PER_MINUTE to WhsCapability(
-      WhsDataType.STEPS_PER_MINUTE,
-      "wear.whs.capability.steps.per.minute.label",
-      "wear.whs.capability.unit.none",
-      isOverrideable = true,
-      isStandardCapability = true,
-    ),
-  )
 
   private lateinit var adbSession: FakeAdbSession
   private val serialNumber: String = "1234"
@@ -180,10 +43,8 @@
     adbSession = FakeAdbSession()
   }
 
-  private fun WhsDataType.toCapability(): WhsCapability = capabilities[this]!!
-
   @Test
-  fun `Enabling capability when serial number is not set does not result in crash`() = runTest {
+  fun `enabling capability when serial number is not set does not result in crash`() = runTest {
     val deviceManager = ContentProviderDeviceManager(adbSession)
 
     val job = launch {
@@ -193,7 +54,7 @@
   }
 
   @Test
-  fun `Disabling capability when serial number is not set does not result in crash`() = runTest {
+  fun `disabling capability when serial number is not set does not result in crash`() = runTest {
     val deviceManager = ContentProviderDeviceManager(adbSession)
 
     val job = launch {
@@ -202,8 +63,9 @@
     job.join()
   }
 
-  private fun assertDeviceManagerFunctionSendsAdbCommand(func: suspend (WearHealthServicesDeviceManager) -> Unit, expectedAdbCommand: String) = runTest {
-    adbSession.deviceServices.configureShellCommand(DeviceSelector.fromSerialNumber(serialNumber), expectedAdbCommand,"")
+  private fun assertDeviceManagerFunctionSendsAdbCommand(func: suspend (WearHealthServicesDeviceManager) -> Unit,
+                                                         expectedAdbCommand: String) = runTest {
+    adbSession.deviceServices.configureShellCommand(DeviceSelector.fromSerialNumber(serialNumber), expectedAdbCommand, "")
 
     val deviceManager = ContentProviderDeviceManager(adbSession)
     deviceManager.setSerialNumber(serialNumber)
@@ -227,87 +89,89 @@
   }
 
   private fun assertEnablingCapabilitySendsAdbCommand(dataType: WhsDataType, expectedAdbCommand: String) = runTest {
-    assertDeviceManagerFunctionSendsAdbCommand({ deviceManager -> deviceManager.setCapabilities(mapOf(dataType to true)) }, expectedAdbCommand)
+    assertDeviceManagerFunctionSendsAdbCommand({ deviceManager -> deviceManager.setCapabilities(mapOf(dataType to true)) },
+                                               expectedAdbCommand)
   }
 
   private fun assertDisablingCapabilitySendsAdbCommand(dataType: WhsDataType, expectedAdbCommand: String) = runTest {
-    assertDeviceManagerFunctionSendsAdbCommand({ deviceManager -> deviceManager.setCapabilities(mapOf(dataType to false)) }, expectedAdbCommand)
+    assertDeviceManagerFunctionSendsAdbCommand({ deviceManager -> deviceManager.setCapabilities(mapOf(dataType to false)) },
+                                               expectedAdbCommand)
   }
 
   @Test
-  fun `Enable and disable steps`() {
-    assertEnablingCapabilitySendsAdbCommand(WhsDataType.STEPS, adbCommandEnableSteps)
-    assertDisablingCapabilitySendsAdbCommand(WhsDataType.STEPS, adbCommandDisableSteps)
+  fun `enable and disable steps`() {
+    assertEnablingCapabilitySendsAdbCommand(WhsDataType.STEPS, "$CONTENT_UPDATE_SHELL_COMMAND --bind STEPS:b:true")
+    assertDisablingCapabilitySendsAdbCommand(WhsDataType.STEPS, "$CONTENT_UPDATE_SHELL_COMMAND --bind STEPS:b:false")
   }
 
   @Test
-  fun `Enable and disable distance`() {
-    assertEnablingCapabilitySendsAdbCommand(WhsDataType.DISTANCE, adbCommandEnableDistance)
-    assertDisablingCapabilitySendsAdbCommand(WhsDataType.DISTANCE, adbCommandDisableDistance)
+  fun `enable and disable distance`() {
+    assertEnablingCapabilitySendsAdbCommand(WhsDataType.DISTANCE, "$CONTENT_UPDATE_SHELL_COMMAND --bind DISTANCE:b:true")
+    assertDisablingCapabilitySendsAdbCommand(WhsDataType.DISTANCE, "$CONTENT_UPDATE_SHELL_COMMAND --bind DISTANCE:b:false")
   }
 
   @Test
-  fun `Enable and disable total calories`() {
-    assertEnablingCapabilitySendsAdbCommand(WhsDataType.TOTAL_CALORIES, adbCommandEnableTotalCalories)
-    assertDisablingCapabilitySendsAdbCommand(WhsDataType.TOTAL_CALORIES, adbCommandDisableTotalCalories)
+  fun `enable and disable calories`() {
+    assertEnablingCapabilitySendsAdbCommand(WhsDataType.CALORIES, "$CONTENT_UPDATE_SHELL_COMMAND --bind CALORIES:b:true")
+    assertDisablingCapabilitySendsAdbCommand(WhsDataType.CALORIES, "$CONTENT_UPDATE_SHELL_COMMAND --bind CALORIES:b:false")
   }
 
   @Test
-  fun `Enable and disable floors`() {
-    assertEnablingCapabilitySendsAdbCommand(WhsDataType.FLOORS, adbCommandEnableFloors)
-    assertDisablingCapabilitySendsAdbCommand(WhsDataType.FLOORS, adbCommandDisableFloors)
+  fun `enable and disable floors`() {
+    assertEnablingCapabilitySendsAdbCommand(WhsDataType.FLOORS, "$CONTENT_UPDATE_SHELL_COMMAND --bind FLOORS:b:true")
+    assertDisablingCapabilitySendsAdbCommand(WhsDataType.FLOORS, "$CONTENT_UPDATE_SHELL_COMMAND --bind FLOORS:b:false")
   }
 
   @Test
-  fun `Enable and disable elevation gain`() {
-    assertEnablingCapabilitySendsAdbCommand(WhsDataType.ELEVATION_GAIN, adbCommandEnableElevationGain)
-    assertDisablingCapabilitySendsAdbCommand(WhsDataType.ELEVATION_GAIN, adbCommandDisableElevationGain)
+  fun `enable and disable elevation gain`() {
+    assertEnablingCapabilitySendsAdbCommand(WhsDataType.ELEVATION_GAIN, "$CONTENT_UPDATE_SHELL_COMMAND --bind ELEVATION_GAIN:b:true")
+    assertDisablingCapabilitySendsAdbCommand(WhsDataType.ELEVATION_GAIN, "$CONTENT_UPDATE_SHELL_COMMAND --bind ELEVATION_GAIN:b:false")
   }
 
   @Test
-  fun `Enable and disable elevation loss`() {
-    assertEnablingCapabilitySendsAdbCommand(WhsDataType.ELEVATION_LOSS, adbCommandEnableElevationLoss)
-    assertDisablingCapabilitySendsAdbCommand(WhsDataType.ELEVATION_LOSS, adbCommandDisableElevationLoss)
+  fun `enable and disable elevation loss`() {
+    assertEnablingCapabilitySendsAdbCommand(WhsDataType.ELEVATION_LOSS, "$CONTENT_UPDATE_SHELL_COMMAND --bind ELEVATION_LOSS:b:true")
+    assertDisablingCapabilitySendsAdbCommand(WhsDataType.ELEVATION_LOSS, "$CONTENT_UPDATE_SHELL_COMMAND --bind ELEVATION_LOSS:b:false")
   }
 
   @Test
-  fun `Enable and disable absolute elevation`() {
-    assertEnablingCapabilitySendsAdbCommand(WhsDataType.ABSOLUTE_ELEVATION, adbCommandEnableAbsoluteElevation)
-    assertDisablingCapabilitySendsAdbCommand(WhsDataType.ABSOLUTE_ELEVATION, adbCommandDisableAbsoluteElevation)
+  fun `enable and disable absolute elevation`() {
+    assertEnablingCapabilitySendsAdbCommand(WhsDataType.ABSOLUTE_ELEVATION, "$CONTENT_UPDATE_SHELL_COMMAND --bind ABSOLUTE_ELEVATION:b:true")
+    assertDisablingCapabilitySendsAdbCommand(WhsDataType.ABSOLUTE_ELEVATION, "$CONTENT_UPDATE_SHELL_COMMAND --bind ABSOLUTE_ELEVATION:b:false")
   }
 
   @Test
-  fun `Enable and disable location`() {
-    assertEnablingCapabilitySendsAdbCommand(WhsDataType.LOCATION, adbCommandEnableLocation)
-    assertDisablingCapabilitySendsAdbCommand(WhsDataType.LOCATION, adbCommandDisableLocation)
+  fun `enable and disable location`() {
+    assertEnablingCapabilitySendsAdbCommand(WhsDataType.LOCATION, "$CONTENT_UPDATE_SHELL_COMMAND --bind LOCATION:b:true")
+    assertDisablingCapabilitySendsAdbCommand(WhsDataType.LOCATION, "$CONTENT_UPDATE_SHELL_COMMAND --bind LOCATION:b:false")
   }
 
   @Test
-  fun `Enable and disable heart rate bpm`() {
-    assertEnablingCapabilitySendsAdbCommand(WhsDataType.HEART_RATE_BPM, adbCommandEnableHeartRateBpm)
-    assertDisablingCapabilitySendsAdbCommand(WhsDataType.HEART_RATE_BPM, adbCommandDisableHeartRateBpm)
+  fun `enable and disable heart rate bpm`() {
+    assertEnablingCapabilitySendsAdbCommand(WhsDataType.HEART_RATE_BPM, "$CONTENT_UPDATE_SHELL_COMMAND --bind HEART_RATE_BPM:b:true")
+    assertDisablingCapabilitySendsAdbCommand(WhsDataType.HEART_RATE_BPM, "$CONTENT_UPDATE_SHELL_COMMAND --bind HEART_RATE_BPM:b:false")
   }
 
   @Test
-  fun `Enable and disable speed`() {
-    assertEnablingCapabilitySendsAdbCommand(WhsDataType.SPEED, adbCommandEnableSpeed)
-    assertDisablingCapabilitySendsAdbCommand(WhsDataType.SPEED, adbCommandDisableSpeed)
+  fun `enable and disable speed`() {
+    assertEnablingCapabilitySendsAdbCommand(WhsDataType.SPEED, "$CONTENT_UPDATE_SHELL_COMMAND --bind SPEED:b:true")
+    assertDisablingCapabilitySendsAdbCommand(WhsDataType.SPEED, "$CONTENT_UPDATE_SHELL_COMMAND --bind SPEED:b:false")
   }
 
   @Test
-  fun `Enable and disable pace`() {
-    assertEnablingCapabilitySendsAdbCommand(WhsDataType.PACE, adbCommandEnablePace)
-    assertDisablingCapabilitySendsAdbCommand(WhsDataType.PACE, adbCommandDisablePace)
+  fun `enable and disable pace`() {
+    assertEnablingCapabilitySendsAdbCommand(WhsDataType.PACE, "$CONTENT_UPDATE_SHELL_COMMAND --bind PACE:b:true")
+    assertDisablingCapabilitySendsAdbCommand(WhsDataType.PACE, "$CONTENT_UPDATE_SHELL_COMMAND --bind PACE:b:false")
   }
 
   @Test
-  fun `Enable and disable steps per minute`() {
-    assertEnablingCapabilitySendsAdbCommand(WhsDataType.STEPS_PER_MINUTE, adbCommandEnableStepsPerMinute)
-    assertDisablingCapabilitySendsAdbCommand(WhsDataType.STEPS_PER_MINUTE, adbCommandDisableStepsPerMinute)
+  fun `enable and disable steps per minute`() {
+    assertEnablingCapabilitySendsAdbCommand(WhsDataType.STEPS_PER_MINUTE, "$CONTENT_UPDATE_SHELL_COMMAND --bind STEPS_PER_MINUTE:b:true")
+    assertDisablingCapabilitySendsAdbCommand(WhsDataType.STEPS_PER_MINUTE, "$CONTENT_UPDATE_SHELL_COMMAND --bind STEPS_PER_MINUTE:b:false")
   }
 
   @Test
-  fun `Setting capability override value when serial number is not set does not result in crash`() = runTest {
+  fun `setting capability override value when serial number is not set does not result in crash`() = runTest {
     val deviceManager = ContentProviderDeviceManager(adbSession)
 
     val job = launch {
@@ -317,73 +181,74 @@
   }
 
   private fun assertOverrideSendsAdbCommand(dataType: WhsDataType, overrideValue: Number?, expectedAdbCommand: String) = runTest {
-    assertDeviceManagerFunctionSendsAdbCommand({ deviceManager -> deviceManager.overrideValues(mapOf(dataType to overrideValue)) }, expectedAdbCommand)
+    assertDeviceManagerFunctionSendsAdbCommand({ deviceManager -> deviceManager.overrideValues(mapOf(dataType to overrideValue)) },
+                                               expectedAdbCommand)
   }
 
   @Test
-  fun `Override steps`() = runTest {
-    assertOverrideSendsAdbCommand(WhsDataType.STEPS, 55, adbCommandSetStepsTo55)
-    assertOverrideSendsAdbCommand(WhsDataType.STEPS, null, adbCommandClearSteps)
+  fun `override steps`() {
+    assertOverrideSendsAdbCommand(WhsDataType.STEPS, 55, "$CONTENT_UPDATE_SHELL_COMMAND --bind STEPS:i:55")
+    assertOverrideSendsAdbCommand(WhsDataType.STEPS, null, "$CONTENT_UPDATE_SHELL_COMMAND --bind STEPS:s:\"\"")
   }
 
   @Test
-  fun `Override distance`() {
-    assertOverrideSendsAdbCommand(WhsDataType.DISTANCE, 10, adbCommandSetDistanceTo10)
-    assertOverrideSendsAdbCommand(WhsDataType.DISTANCE, null, adbCommandClearDistance)
+  fun `override distance`() {
+    assertOverrideSendsAdbCommand(WhsDataType.DISTANCE, 10, "$CONTENT_UPDATE_SHELL_COMMAND --bind DISTANCE:f:10.0")
+    assertOverrideSendsAdbCommand(WhsDataType.DISTANCE, null, "$CONTENT_UPDATE_SHELL_COMMAND --bind DISTANCE:s:\"\"")
   }
 
   @Test
-  fun `Override total calories`() {
-    assertOverrideSendsAdbCommand(WhsDataType.TOTAL_CALORIES, 100, adbCommandSetTotalCaloriesTo100)
-    assertOverrideSendsAdbCommand(WhsDataType.TOTAL_CALORIES, null, adbCommandClearTotalCalories)
+  fun `override calories`() {
+    assertOverrideSendsAdbCommand(WhsDataType.CALORIES, 100, "$CONTENT_UPDATE_SHELL_COMMAND --bind CALORIES:f:100.0")
+    assertOverrideSendsAdbCommand(WhsDataType.CALORIES, null, "$CONTENT_UPDATE_SHELL_COMMAND --bind CALORIES:s:\"\"")
   }
 
   @Test
-  fun `Override floors`() {
-    assertOverrideSendsAdbCommand(WhsDataType.FLOORS, 5, adbCommandSetFloorsTo5)
-    assertOverrideSendsAdbCommand(WhsDataType.FLOORS, null, adbCommandClearFloors)
+  fun `override floors`() {
+    assertOverrideSendsAdbCommand(WhsDataType.FLOORS, 5, "$CONTENT_UPDATE_SHELL_COMMAND --bind FLOORS:f:5.0")
+    assertOverrideSendsAdbCommand(WhsDataType.FLOORS, null, "$CONTENT_UPDATE_SHELL_COMMAND --bind FLOORS:s:\"\"")
   }
 
   @Test
-  fun `Override elevation gain`() {
-    assertOverrideSendsAdbCommand(WhsDataType.ELEVATION_GAIN, 50, adbCommandSetElevationGainTo50)
-    assertOverrideSendsAdbCommand(WhsDataType.ELEVATION_GAIN, null, adbCommandClearElevationGain)
+  fun `override elevation gain`() {
+    assertOverrideSendsAdbCommand(WhsDataType.ELEVATION_GAIN, 50, "$CONTENT_UPDATE_SHELL_COMMAND --bind ELEVATION_GAIN:f:50.0")
+    assertOverrideSendsAdbCommand(WhsDataType.ELEVATION_GAIN, null, "$CONTENT_UPDATE_SHELL_COMMAND --bind ELEVATION_GAIN:s:\"\"")
   }
 
   @Test
-  fun `Override elevation loss`() {
-    assertOverrideSendsAdbCommand(WhsDataType.ELEVATION_LOSS, 20, adbCommandSetElevationLossTo20)
-    assertOverrideSendsAdbCommand(WhsDataType.ELEVATION_LOSS, null, adbCommandClearElevationLoss)
+  fun `override elevation loss`() {
+    assertOverrideSendsAdbCommand(WhsDataType.ELEVATION_LOSS, 20, "$CONTENT_UPDATE_SHELL_COMMAND --bind ELEVATION_LOSS:f:20.0")
+    assertOverrideSendsAdbCommand(WhsDataType.ELEVATION_LOSS, null, "$CONTENT_UPDATE_SHELL_COMMAND --bind ELEVATION_LOSS:s:\"\"")
   }
 
   @Test
-  fun `Override absolute elevation`() {
-    assertOverrideSendsAdbCommand(WhsDataType.ABSOLUTE_ELEVATION, 120, adbCommandSetAbsoluteElevationTo120)
-    assertOverrideSendsAdbCommand(WhsDataType.ABSOLUTE_ELEVATION, null, adbCommandClearAbsoluteElevation)
+  fun `override absolute elevation`() {
+    assertOverrideSendsAdbCommand(WhsDataType.ABSOLUTE_ELEVATION, 120, "$CONTENT_UPDATE_SHELL_COMMAND --bind ABSOLUTE_ELEVATION:f:120.0")
+    assertOverrideSendsAdbCommand(WhsDataType.ABSOLUTE_ELEVATION, null, "$CONTENT_UPDATE_SHELL_COMMAND --bind ABSOLUTE_ELEVATION:s:\"\"")
   }
 
   @Test
-  fun `Override heart rate bpm`() {
-    assertOverrideSendsAdbCommand(WhsDataType.HEART_RATE_BPM, 65, adbCommandSetHeartRateBpmTo65)
-    assertOverrideSendsAdbCommand(WhsDataType.HEART_RATE_BPM, null, adbCommandClearHeartRateBpm)
+  fun `override heart rate bpm`() {
+    assertOverrideSendsAdbCommand(WhsDataType.HEART_RATE_BPM, 65, "$CONTENT_UPDATE_SHELL_COMMAND --bind HEART_RATE_BPM:f:65.0")
+    assertOverrideSendsAdbCommand(WhsDataType.HEART_RATE_BPM, null, "$CONTENT_UPDATE_SHELL_COMMAND --bind HEART_RATE_BPM:s:\"\"")
   }
 
   @Test
-  fun `Override speed`() {
-    assertOverrideSendsAdbCommand(WhsDataType.SPEED, 30, adbCommandSetSpeedTo30)
-    assertOverrideSendsAdbCommand(WhsDataType.SPEED, null, adbCommandClearSpeed)
+  fun `override speed`() {
+    assertOverrideSendsAdbCommand(WhsDataType.SPEED, 30, "$CONTENT_UPDATE_SHELL_COMMAND --bind SPEED:f:30.0")
+    assertOverrideSendsAdbCommand(WhsDataType.SPEED, null, "$CONTENT_UPDATE_SHELL_COMMAND --bind SPEED:s:\"\"")
   }
 
   @Test
-  fun `Override pace`() {
-    assertOverrideSendsAdbCommand(WhsDataType.PACE, 20, adbCommandSetPaceTo20)
-    assertOverrideSendsAdbCommand(WhsDataType.PACE, null, adbCommandClearPace)
+  fun `override pace`() {
+    assertOverrideSendsAdbCommand(WhsDataType.PACE, 20, "$CONTENT_UPDATE_SHELL_COMMAND --bind PACE:f:20.0")
+    assertOverrideSendsAdbCommand(WhsDataType.PACE, null, "$CONTENT_UPDATE_SHELL_COMMAND --bind PACE:s:\"\"")
   }
 
   @Test
-  fun `Override steps per minute`() {
-    assertOverrideSendsAdbCommand(WhsDataType.STEPS_PER_MINUTE, 25, adbCommandSetStepsPerMinuteTo25)
-    assertOverrideSendsAdbCommand(WhsDataType.STEPS_PER_MINUTE, null, adbCommandClearStepsPerMinute)
+  fun `override steps per minute`() {
+    assertOverrideSendsAdbCommand(WhsDataType.STEPS_PER_MINUTE, 25, "$CONTENT_UPDATE_SHELL_COMMAND --bind STEPS_PER_MINUTE:f:25.0")
+    assertOverrideSendsAdbCommand(WhsDataType.STEPS_PER_MINUTE, null, "$CONTENT_UPDATE_SHELL_COMMAND --bind STEPS_PER_MINUTE:s:\"\"")
   }
 
   @Test
@@ -401,7 +266,20 @@
   }
 
   @Test
-  fun `Delete entries without setting serial number does not result in crash`() = runTest {
+  fun `trigger full swing golf shot event`() = runBlocking {
+    assertDeviceManagerFunctionSendsAdbCommand(
+      { deviceManager ->
+        deviceManager.triggerEvent(
+          EventTrigger(
+            "whs.GOLF_SHOT",
+            "label",
+            mapOf("golf_shot_swing_type" to "full")))
+      },
+      "am broadcast -a \"whs.GOLF_SHOT\" --es golf_shot_swing_type \"full\" com.google.android.wearable.healthservices")
+  }
+
+  @Test
+  fun `clear content provider without setting serial number does not result in crash`() = runTest {
     val deviceManager = ContentProviderDeviceManager(adbSession)
 
     val job = launch {
@@ -411,12 +289,13 @@
   }
 
   @Test
-  fun `Delete entries triggers correct adb command`() {
-    assertDeviceManagerFunctionSendsAdbCommand({ deviceManager -> deviceManager.clearContentProvider() }, adbCommandDeleteEntries)
+  fun `clear content provider triggers correct adb command`() {
+    assertDeviceManagerFunctionSendsAdbCommand({ deviceManager -> deviceManager.clearContentProvider() },
+                                               "content delete --uri $WHS_CONTENT_PROVIDER_URI")
   }
 
   @Test
-  fun `Setting multiple capabilities without setting serial number does not result in crash`() = runTest {
+  fun `setting multiple capabilities without setting serial number does not result in crash`() = runTest {
     val deviceManager = ContentProviderDeviceManager(adbSession)
 
     val job = launch {
@@ -426,25 +305,28 @@
   }
 
   @Test
-  fun `Setting multiple capabilities triggers expected adb command with keys in alphabetical order`() {
-    assertDeviceManagerFunctionSendsAdbCommand({ deviceManager -> deviceManager.setCapabilities(mapOf(
-      WhsDataType.STEPS to true,
-      WhsDataType.DISTANCE to false,
-      WhsDataType.TOTAL_CALORIES to false,
-      WhsDataType.FLOORS to false,
-      WhsDataType.ELEVATION_GAIN to true,
-      WhsDataType.ELEVATION_LOSS to false,
-      WhsDataType.ABSOLUTE_ELEVATION to false,
-      WhsDataType.LOCATION to true,
-      WhsDataType.HEART_RATE_BPM to true,
-      WhsDataType.SPEED to false,
-      WhsDataType.PACE to true,
-      WhsDataType.STEPS_PER_MINUTE to false,
-    )) }, adbCommandSetMultipleCapabilities)
+  fun `setting multiple capabilities triggers expected adb command with keys in alphabetical order`() {
+    assertDeviceManagerFunctionSendsAdbCommand({ deviceManager ->
+                                                 deviceManager.setCapabilities(mapOf(
+                                                   WhsDataType.STEPS to true,
+                                                   WhsDataType.DISTANCE to false,
+                                                   WhsDataType.CALORIES to false,
+                                                   WhsDataType.FLOORS to false,
+                                                   WhsDataType.ELEVATION_GAIN to true,
+                                                   WhsDataType.ELEVATION_LOSS to false,
+                                                   WhsDataType.ABSOLUTE_ELEVATION to false,
+                                                   WhsDataType.LOCATION to true,
+                                                   WhsDataType.HEART_RATE_BPM to true,
+                                                   WhsDataType.SPEED to false,
+                                                   WhsDataType.PACE to true,
+                                                   WhsDataType.STEPS_PER_MINUTE to false,
+                                                 ))
+                                               },
+                                               "$CONTENT_UPDATE_SHELL_COMMAND --bind ABSOLUTE_ELEVATION:b:false --bind CALORIES:b:false --bind DISTANCE:b:false --bind ELEVATION_GAIN:b:true --bind ELEVATION_LOSS:b:false --bind FLOORS:b:false --bind HEART_RATE_BPM:b:true --bind LOCATION:b:true --bind PACE:b:true --bind SPEED:b:false --bind STEPS:b:true --bind STEPS_PER_MINUTE:b:false")
   }
 
   @Test
-  fun `Setting multiple override values without setting serial number does not result in crash`() = runTest {
+  fun `setting multiple override values without setting serial number does not result in crash`() = runTest {
     val deviceManager = ContentProviderDeviceManager(adbSession)
 
     val job = launch {
@@ -454,43 +336,54 @@
   }
 
   @Test
-  fun `Setting multiple float override values triggers expected adb command with keys in alphabetical order`() {
-    assertDeviceManagerFunctionSendsAdbCommand({ deviceManager -> deviceManager.overrideValues(mapOf(
-      WhsDataType.DISTANCE to 12.0,
-      WhsDataType.TOTAL_CALORIES to 123.0,
-      WhsDataType.FLOORS to 5.0,
-    )) }, adbCommandMultipleFloatOverrides)
+  fun `setting multiple float override values triggers expected adb command with keys in alphabetical order`() {
+    assertDeviceManagerFunctionSendsAdbCommand({ deviceManager ->
+                                                 deviceManager.overrideValues(mapOf(
+                                                   WhsDataType.DISTANCE to 12.0,
+                                                   WhsDataType.CALORIES to 123.0,
+                                                   WhsDataType.FLOORS to 5.0,
+                                                 ))
+                                               },
+                                               "$CONTENT_UPDATE_SHELL_COMMAND --bind CALORIES:f:123.0 --bind DISTANCE:f:12.0 --bind FLOORS:f:5.0")
   }
 
   @Test
-  fun `Setting float and int override values triggers expected adb command with keys in alphabetical order`() {
-    assertDeviceManagerFunctionSendsAdbCommand({ deviceManager -> deviceManager.overrideValues(mapOf(
-      WhsDataType.STEPS to 55,
-      WhsDataType.ELEVATION_LOSS to 5.0,
-    )) }, adbCommandFloatIntOverrides)
+  fun `setting float and int override values triggers expected adb command with keys in alphabetical order`() {
+    assertDeviceManagerFunctionSendsAdbCommand({ deviceManager ->
+                                                 deviceManager.overrideValues(mapOf(
+                                                   WhsDataType.STEPS to 55,
+                                                   WhsDataType.ELEVATION_LOSS to 5.0,
+                                                 ))
+                                               }, "$CONTENT_UPDATE_SHELL_COMMAND --bind ELEVATION_LOSS:f:5.0 --bind STEPS:i:55")
   }
 
   @Test
-  fun `Setting float, int and null override values triggers expected adb command with keys in alphabetical order`() {
-    assertDeviceManagerFunctionSendsAdbCommand({ deviceManager -> deviceManager.overrideValues(mapOf(
-      WhsDataType.STEPS to 55,
-      WhsDataType.ELEVATION_LOSS to 5.0,
-      WhsDataType.PACE to null,
-    )) }, adbCommandFloatIntNullOverrides)
+  fun `setting float, int and null override values triggers expected adb command with keys in alphabetical order`() {
+    assertDeviceManagerFunctionSendsAdbCommand({ deviceManager ->
+                                                 deviceManager.overrideValues(mapOf(
+                                                   WhsDataType.STEPS to 55,
+                                                   WhsDataType.ELEVATION_LOSS to 5.0,
+                                                   WhsDataType.PACE to null,
+                                                 ))
+                                               },
+                                               "$CONTENT_UPDATE_SHELL_COMMAND --bind ELEVATION_LOSS:f:5.0 --bind PACE:s:\"\" --bind STEPS:i:55")
   }
 
   @Test
-  fun `Setting location override value is ignored`() {
-    assertDeviceManagerFunctionSendsAdbCommand({ deviceManager -> deviceManager.overrideValues(mapOf(
-      WhsDataType.STEPS to 55,
-      WhsDataType.ELEVATION_LOSS to 5.0,
-      WhsDataType.PACE to null,
-      WhsDataType.LOCATION to null,
-    )) }, adbCommandFloatIntNullOverrides)
+  fun `setting location override value is ignored`() {
+    assertDeviceManagerFunctionSendsAdbCommand({ deviceManager ->
+                                                 deviceManager.overrideValues(mapOf(
+                                                   WhsDataType.STEPS to 55,
+                                                   WhsDataType.ELEVATION_LOSS to 5.0,
+                                                   WhsDataType.PACE to null,
+                                                   WhsDataType.LOCATION to null,
+                                                 ))
+                                               },
+                                               "$CONTENT_UPDATE_SHELL_COMMAND --bind ELEVATION_LOSS:f:5.0 --bind PACE:s:\"\" --bind STEPS:i:55")
   }
 
   @Test
-  fun `Checking is WHS version is supported without setting serial number does not result in crash`() = runTest {
+  fun `checking is WHS version is supported without setting serial number does not result in crash`() = runTest {
     val deviceManager = ContentProviderDeviceManager(adbSession)
 
     val job = launch {
@@ -500,7 +393,8 @@
   }
 
   private fun assertWhsVersionCheckAdbResponseIsParsedCorrectly(response: String, expectedIsSupportedBool: Boolean) = runTest {
-    adbSession.deviceServices.configureShellCommand(DeviceSelector.fromSerialNumber(serialNumber), adbCommandCheckWhsVersionCode, response)
+    val checkWhsVersionCommand = "dumpsys package $WHS_PACKAGE_ID | grep versionCode | head -n1"
+    adbSession.deviceServices.configureShellCommand(DeviceSelector.fromSerialNumber(serialNumber), checkWhsVersionCommand, response)
 
     val deviceManager = ContentProviderDeviceManager(adbSession)
     deviceManager.setSerialNumber(serialNumber)
@@ -511,6 +405,34 @@
     val job = launch {
       isSupported = deviceManager.isWhsVersionSupported()
     }
+
+    job.join()
+
+    val currentCount = adbSession.deviceServices.shellV2Requests.size
+    val newRequestsCount = currentCount - previousCount
+
+    assertEquals(1, newRequestsCount)
+
+    val shellRequest = adbSession.deviceServices.shellV2Requests.last
+
+    assert(shellRequest.deviceSelector.contains(serialNumber))
+    assertEquals(checkWhsVersionCommand, shellRequest.command)
+    assertEquals(expectedIsSupportedBool, isSupported)
+  }
+
+  private fun assertExerciseCommandParsesResultsCorrectly(response: String, expected: Boolean) = runTest {
+    val queryExerciseStateCommand = "content query --uri content://com.google.android.wearable.healthservices.dev.exerciseinfo"
+    adbSession.deviceServices.configureShellCommand(DeviceSelector.fromSerialNumber(serialNumber), queryExerciseStateCommand,
+                                                    response)
+    val deviceManager = ContentProviderDeviceManager(adbSession)
+    deviceManager.setSerialNumber(serialNumber)
+
+    val previousCount = adbSession.deviceServices.shellV2Requests.size
+
+    var isSupported = false
+    val job = launch {
+      isSupported = deviceManager.loadActiveExercise()
+    }
     job.join()
 
     val currentCount = adbSession.deviceServices.shellV2Requests.size
@@ -521,28 +443,40 @@
     val shellRequest = adbSession.deviceServices.shellV2Requests.last
 
     assert(shellRequest.deviceSelector.contains(serialNumber))
-    assertEquals(adbCommandCheckWhsVersionCode, shellRequest.command)
+    assertEquals(queryExerciseStateCommand, shellRequest.command)
 
-    assertEquals(expectedIsSupportedBool, isSupported)
+    assertEquals(expected, isSupported)
   }
 
   @Test
-  fun `Unexpected ADB response results in WHS version being reported as unsupported`() {
+  fun `load active exercise returns true when exercise is active`() = assertExerciseCommandParsesResultsCorrectly(
+    "Row: 0 active_exercise=true", true)
+
+  @Test
+  fun `load active exercise returns false when exercise is not active`() = assertExerciseCommandParsesResultsCorrectly(
+    "Row: 0 active_exercise=false", false)
+
+  @Test
+  fun `load active exercise returns false when response is unexpected`() = assertExerciseCommandParsesResultsCorrectly(
+    "This is not supposed to happen", false)
+
+  @Test
+  fun `unexpected ADB response results in WHS version being reported as unsupported`() {
     assertWhsVersionCheckAdbResponseIsParsedCorrectly("Unexpected response", false)
   }
 
   @Test
-  fun `Dev WHS version codes are supported`() {
+  fun `dev WHS version codes are supported`() {
     assertWhsVersionCheckAdbResponseIsParsedCorrectly("    versionCode=1 minSdk=30 targetSdk=33", true)
   }
 
   @Test
-  fun `Non dev WHS version codes are not supported`() {
+  fun `non dev WHS version codes are not supported`() {
     assertWhsVersionCheckAdbResponseIsParsedCorrectly("    versionCode=1417661 minSdk=30 targetSdk=33", false)
   }
 
   @Test
-  fun `Loading capabilities without setting serial number does not result in crash`() = runTest {
+  fun `loading capabilities without setting serial number does not result in crash`() = runTest {
     val deviceManager = ContentProviderDeviceManager(adbSession)
 
     val job = launch {
@@ -551,15 +485,16 @@
     job.join()
   }
 
-  private fun assertLoadCapabilitiesAdbResponseIsParsedCorrectly(response: String, expectedCapabilites: Map<WhsDataType, CapabilityStatus>) = runTest {
-    adbSession.deviceServices.configureShellCommand(DeviceSelector.fromSerialNumber(serialNumber), adbCommandQueryContentProvider, response)
+  private fun assertLoadCapabilitiesAdbResponseIsParsedCorrectly(response: String, expectedCapabilites: Map<WhsDataType, CapabilityState>) = runTest {
+    val queryContentProviderCommand = "content query --uri $WHS_CONTENT_PROVIDER_URI"
+    adbSession.deviceServices.configureShellCommand(DeviceSelector.fromSerialNumber(serialNumber), queryContentProviderCommand, response)
 
     val deviceManager = ContentProviderDeviceManager(adbSession)
     deviceManager.setSerialNumber(serialNumber)
 
     val previousCount = adbSession.deviceServices.shellV2Requests.size
 
-    var parsedCapabilities = WHS_CAPABILITIES.associate { it.dataType to CapabilityStatus(false, null) }
+    var parsedCapabilities = WHS_CAPABILITIES.associate { it.dataType to CapabilityState(false, null) }
     val job = launch {
       parsedCapabilities = deviceManager.loadCurrentCapabilityStates()
     }
@@ -573,49 +508,56 @@
     val shellRequest = adbSession.deviceServices.shellV2Requests.last
 
     assert(shellRequest.deviceSelector.contains(serialNumber))
-    assertEquals(adbCommandQueryContentProvider, shellRequest.command)
+    assertEquals(queryContentProviderCommand, shellRequest.command)
 
     assertEquals(expectedCapabilites, parsedCapabilities)
   }
 
   @Test
-  fun `Unexpected ADB response results in no capabilities being reported`() {
+  fun `unexpected ADB response results in no capabilities being reported`() {
     assertLoadCapabilitiesAdbResponseIsParsedCorrectly("Unexpected response", emptyMap())
   }
 
   @Test
-  fun `Enabled state of capabilities are parsed, override values are ignored`() {
-    assertLoadCapabilitiesAdbResponseIsParsedCorrectly("Row: 0 data_type=STEPS_PER_MINUTE, is_enabled=false, override_value=0.0\n" +
-                                                       "Row: 1 data_type=SPEED, is_enabled=true, override_value=0.0\n" +
-                                                       "Row: 2 data_type=FLOORS, is_enabled=false, override_value=0.0\n" +
-                                                       "Row: 3 data_type=ABSOLUTE_ELEVATION, is_enabled=false, override_value=0.0\n" +
-                                                       "Row: 4 data_type=ELEVATION_LOSS, is_enabled=false, override_value=0.0\n" +
-                                                       "Row: 5 data_type=DISTANCE, is_enabled=true, override_value=0.0\n" +
-                                                       "Row: 6 data_type=ELEVATION_GAIN, is_enabled=false, override_value=0.0\n" +
-                                                       "Row: 7 data_type=TOTAL_CALORIES, is_enabled=false, override_value=0.0\n" +
-                                                       "Row: 8 data_type=PACE, is_enabled=false, override_value=0.0\n" +
-                                                       "Row: 9 data_type=HEART_RATE_BPM, is_enabled=true, override_value=55.0\n" +
-                                                       "Row: 10 data_type=STEPS, is_enabled=true, override_value=0", mapOf(
-                                                        WhsDataType.STEPS_PER_MINUTE to CapabilityStatus(false, null),
-                                                        WhsDataType.SPEED to CapabilityStatus(true, null),
-                                                        WhsDataType.FLOORS to CapabilityStatus(false, null),
-                                                        WhsDataType.ABSOLUTE_ELEVATION to CapabilityStatus(false, null),
-                                                        WhsDataType.ELEVATION_LOSS to CapabilityStatus(false, null),
-                                                        WhsDataType.DISTANCE to CapabilityStatus(true, null),
-                                                        WhsDataType.ELEVATION_GAIN to CapabilityStatus(false, null),
-                                                        WhsDataType.TOTAL_CALORIES to CapabilityStatus(false, null),
-                                                        WhsDataType.PACE to CapabilityStatus(false, null),
-                                                        WhsDataType.HEART_RATE_BPM to CapabilityStatus(true, null),
-                                                        WhsDataType.STEPS to CapabilityStatus(true, null),
+  fun `enabled state of capabilities are parsed, override values are ignored`() {
+    assertLoadCapabilitiesAdbResponseIsParsedCorrectly("""
+                                                       Row: 0 data_type=STEPS_PER_MINUTE, is_enabled=false, override_value=0.0
+                                                       Row: 1 data_type=SPEED, is_enabled=true, override_value=0.0
+                                                       Row: 2 data_type=FLOORS, is_enabled=false, override_value=0.0
+                                                       Row: 3 data_type=ABSOLUTE_ELEVATION, is_enabled=false, override_value=0.0
+                                                       Row: 4 data_type=ELEVATION_LOSS, is_enabled=false, override_value=0.0
+                                                       Row: 5 data_type=DISTANCE, is_enabled=true, override_value=0.0
+                                                       Row: 6 data_type=ELEVATION_GAIN, is_enabled=false, override_value=0.0
+                                                       Row: 7 data_type=CALORIES, is_enabled=false, override_value=0.0
+                                                       Row: 8 data_type=PACE, is_enabled=false, override_value=0.0
+                                                       Row: 9 data_type=HEART_RATE_BPM, is_enabled=true, override_value=55.0
+                                                       Row: 10 data_type=STEPS, is_enabled=true, override_value=0
+                                                       """.trimIndent(),
+                                                       mapOf(
+                                                        WhsDataType.STEPS_PER_MINUTE to CapabilityState(false, null),
+                                                        WhsDataType.SPEED to CapabilityState(true, null),
+                                                        WhsDataType.FLOORS to CapabilityState(false, null),
+                                                        WhsDataType.ABSOLUTE_ELEVATION to CapabilityState(false, null),
+                                                        WhsDataType.ELEVATION_LOSS to CapabilityState(false, null),
+                                                        WhsDataType.DISTANCE to CapabilityState(true, null),
+                                                        WhsDataType.ELEVATION_GAIN to CapabilityState(false, null),
+                                                        WhsDataType.CALORIES to CapabilityState(false, null),
+                                                        WhsDataType.PACE to CapabilityState(false, null),
+                                                        WhsDataType.HEART_RATE_BPM to CapabilityState(true, null),
+                                                        WhsDataType.STEPS to CapabilityState(true, null),
                                                        ))
   }
 
   @Test
-  fun `Unknown data type capabilities are ignored`() {
-    assertLoadCapabilitiesAdbResponseIsParsedCorrectly("Row: 0 data_type=DATA_TYPE_UNKNOWN, is_enabled=true, override_value=0\n" +
-                                                       "Row: 1 data_type=STEPS, is_enabled=true, override_value=0\n" +
-                                                       "Row: 2 data_type=DATA_TYPE_UNKNOWN, is_enabled=true, override_value=0", mapOf(
-                                                        WhsDataType.STEPS to CapabilityStatus(true, null),
+  fun `unknown data type capabilities are ignored`() {
+    assertLoadCapabilitiesAdbResponseIsParsedCorrectly(
+      """
+                                                       Row: 0 data_type=DATA_TYPE_UNKNOWN, is_enabled=true, override_value=0
+                                                       Row: 1 data_type=STEPS, is_enabled=true, override_value=0
+                                                       Row: 2 data_type=DATA_TYPE_UNKNOWN, is_enabled=true, override_value=0
+                                                       """.trimIndent(),
+                                                       mapOf(
+                                                        WhsDataType.STEPS to CapabilityState(true, null),
                                                       ))
   }
-}
\ No newline at end of file
+}
diff --git a/wear-whs/testSrc/com/android/tools/idea/wearwhs/communication/FakeDeviceManager.kt b/wear-whs/testSrc/com/android/tools/idea/wearwhs/communication/FakeDeviceManager.kt
index b54998f..8dc62dc 100644
--- a/wear-whs/testSrc/com/android/tools/idea/wearwhs/communication/FakeDeviceManager.kt
+++ b/wear-whs/testSrc/com/android/tools/idea/wearwhs/communication/FakeDeviceManager.kt
@@ -19,9 +19,6 @@
 import com.android.tools.idea.wearwhs.WHS_CAPABILITIES
 import com.android.tools.idea.wearwhs.WhsCapability
 import com.android.tools.idea.wearwhs.WhsDataType
-import kotlinx.coroutines.delay
-
-private const val DELAY_MS = 100L
 
 /**
  * Fake implementation of [WearHealthServicesDeviceManager] for testing.
@@ -31,41 +28,39 @@
   internal var failState = false
   internal val triggeredEvents = mutableListOf<EventTrigger>()
   internal var clearContentProviderInvocations = 0
-  private val onDeviceStates = capabilities.associate { it.dataType to CapabilityStatus(false, null) }
+  private val onDeviceStates: MutableMap<WhsDataType, CapabilityState> = capabilities.associate { it.dataType to CapabilityState(false, null) } as MutableMap<WhsDataType, CapabilityState>
+  internal var activeExercise = false
 
   override suspend fun loadCapabilities() = if (failState) {
     throw ConnectionLostException("Failed to load capabilities")
   }
   else {
-    delay(DELAY_MS)
     capabilities
   }
 
-  override suspend fun loadOngoingExercise() = if (failState) {
+  override suspend fun loadActiveExercise() = if (failState) {
     throw ConnectionLostException("Failed to load ongoing exercise")
   }
   else {
-    delay(DELAY_MS)
-    false
+    activeExercise
   }
 
   override suspend fun setCapabilities(capabilityUpdates: Map<WhsDataType, Boolean>) = if (failState) {
     throw ConnectionLostException("Failed to override value")
   } else {
-    capabilityUpdates.forEach { (capability, enabled) -> onDeviceStates[capability]?.enabled = enabled }
+    capabilityUpdates.forEach { (dataType, enabled) -> onDeviceStates[dataType] = CapabilityState(enabled, onDeviceStates[dataType]!!.overrideValue) }
   }
 
   override suspend fun overrideValues(overrideUpdates: Map<WhsDataType, Number?>)  = if (failState) {
     throw ConnectionLostException("Failed to override value")
   } else {
-    overrideUpdates.forEach { (capability, value) -> onDeviceStates[capability]?.overrideValue = value?.toFloat() }
+    overrideUpdates.forEach { (dataType, value) -> onDeviceStates[dataType] = CapabilityState(onDeviceStates[dataType]!!.enabled, value?.toFloat()) }
   }
 
-  override suspend fun loadCurrentCapabilityStates(): Map<WhsDataType, CapabilityStatus> = if (failState) {
+  override suspend fun loadCurrentCapabilityStates(): Map<WhsDataType, CapabilityState> = if (failState) {
     throw ConnectionLostException("Failed to load capability states")
   }
   else {
-    delay(DELAY_MS)
     onDeviceStates
   }
 
diff --git a/wear-whs/testSrc/com/android/tools/idea/wearwhs/view/WearHealthServicesToolWindowStateManagerTest.kt b/wear-whs/testSrc/com/android/tools/idea/wearwhs/view/WearHealthServicesToolWindowStateManagerTest.kt
index 3f719ee..a79913d 100644
--- a/wear-whs/testSrc/com/android/tools/idea/wearwhs/view/WearHealthServicesToolWindowStateManagerTest.kt
+++ b/wear-whs/testSrc/com/android/tools/idea/wearwhs/view/WearHealthServicesToolWindowStateManagerTest.kt
@@ -19,25 +19,25 @@
 import com.android.tools.idea.wearwhs.EventTrigger
 import com.android.tools.idea.wearwhs.WhsCapability
 import com.android.tools.idea.wearwhs.WhsDataType
+import com.android.tools.idea.wearwhs.communication.CapabilityState
 import com.android.tools.idea.wearwhs.communication.FakeDeviceManager
-import com.android.tools.idea.wearwhs.communication.CapabilityStatus
 import com.android.tools.idea.wearwhs.logger.WearHealthServicesEventLogger
 import com.google.common.truth.Truth.assertThat
 import com.google.wireless.android.sdk.stats.AndroidStudioEvent
 import com.google.wireless.android.sdk.stats.WearHealthServicesEvent
 import com.intellij.openapi.util.Disposer
 import junit.framework.TestCase.assertEquals
-import kotlinx.coroutines.flow.takeWhile
-import kotlinx.coroutines.runBlocking
-import org.junit.Before
-import org.junit.Rule
-import org.junit.Test
 import kotlinx.coroutines.TimeoutCancellationException
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.map
+import kotlinx.coroutines.flow.takeWhile
+import kotlinx.coroutines.runBlocking
 import kotlinx.coroutines.withTimeout
 import org.junit.Assert
 import org.junit.Assert.assertFalse
+import org.junit.Before
+import org.junit.Rule
+import org.junit.Test
 
 private val capabilities = listOf(WhsCapability(
   WhsDataType.HEART_RATE_BPM,
@@ -67,7 +67,9 @@
   private val logger = WearHealthServicesEventLogger { loggedEvents.add(it) }
   private val deviceManager by lazy { FakeDeviceManager(capabilities) }
   private val stateManager by lazy {
-    WearHealthServicesToolWindowStateManagerImpl(deviceManager, logger)
+    WearHealthServicesToolWindowStateManagerImpl(deviceManager, logger, 1L).also {
+      it.serialNumber = "test"
+    }
   }
 
   @Before
@@ -87,9 +89,9 @@
 
     stateManager.setPreset(Preset.STANDARD)
 
-    stateManager.getState(capabilities[0]).map { it.enabled }.waitForValue(true)
-    stateManager.getState(capabilities[1]).map { it.enabled }.waitForValue(true)
-    stateManager.getState(capabilities[2]).map { it.enabled }.waitForValue(false)
+    stateManager.getState(capabilities[0]).map { it.capabilityState.enabled }.waitForValue(true)
+    stateManager.getState(capabilities[1]).map { it.capabilityState.enabled }.waitForValue(true)
+    stateManager.getState(capabilities[2]).map { it.capabilityState.enabled }.waitForValue(false)
   }
 
   @Test
@@ -98,9 +100,9 @@
 
     stateManager.setPreset(Preset.ALL)
 
-    stateManager.getState(capabilities[0]).map { it.enabled }.waitForValue(true)
-    stateManager.getState(capabilities[1]).map { it.enabled }.waitForValue(true)
-    stateManager.getState(capabilities[2]).map { it.enabled }.waitForValue(true)
+    stateManager.getState(capabilities[0]).map { it.capabilityState.enabled }.waitForValue(true)
+    stateManager.getState(capabilities[1]).map { it.capabilityState.enabled }.waitForValue(true)
+    stateManager.getState(capabilities[2]).map { it.capabilityState.enabled }.waitForValue(true)
   }
 
   @Test
@@ -108,7 +110,7 @@
     stateManager.getCapabilitiesList().waitForValue(capabilities)
 
     stateManager.setCapabilityEnabled(capabilities[0], false)
-    stateManager.getState(capabilities[0]).map { it.enabled }.waitForValue(false)
+    stateManager.getState(capabilities[0]).map { it.capabilityState.enabled }.waitForValue(false)
   }
 
   @Test
@@ -117,7 +119,7 @@
 
     stateManager.setOverrideValue(capabilities[1], 3f)
 
-    stateManager.getState(capabilities[1]).map { it.overrideValue }.waitForValue(3f)
+    stateManager.getState(capabilities[1]).map { it.capabilityState.overrideValue }.waitForValue(3f)
     stateManager.getState(capabilities[1]).map { it.synced }.waitForValue(false)
   }
 
@@ -134,8 +136,8 @@
     stateManager.reset()
 
     stateManager.getPreset().waitForValue(Preset.ALL)
-    stateManager.getState(capabilities[2]).map { it.enabled }.waitForValue(true)
-    stateManager.getState(capabilities[1]).map { it.overrideValue }.waitForValue(null)
+    stateManager.getState(capabilities[2]).map { it.capabilityState.enabled }.waitForValue(true)
+    stateManager.getState(capabilities[1]).map { it.capabilityState.overrideValue }.waitForValue(null)
     stateManager.getState(capabilities[0]).map { it.synced }.waitForValue(false)
 
     assertEquals(1, deviceManager.clearContentProviderInvocations)
@@ -163,14 +165,16 @@
     stateManager.getState(capabilities[2]).map { it.synced }.waitForValue(true)
 
     assertThat(deviceManager.loadCurrentCapabilityStates()).containsExactly(
-      capabilities[0].dataType, CapabilityStatus(false, null),
-      capabilities[1].dataType, CapabilityStatus(true, 3f),
-      capabilities[2].dataType, CapabilityStatus(true, null)
+      capabilities[0].dataType, CapabilityState(false, null),
+      capabilities[1].dataType, CapabilityState(true, 3f),
+      capabilities[2].dataType, CapabilityState(true, null)
     )
 
-    assertThat(loggedEvents).hasSize(1)
+    assertThat(loggedEvents).hasSize(2)
     assertThat(loggedEvents[0].kind).isEqualTo(AndroidStudioEvent.EventKind.WEAR_HEALTH_SERVICES_TOOL_WINDOW_EVENT)
-    assertThat(loggedEvents[0].wearHealthServicesEvent.kind).isEqualTo(WearHealthServicesEvent.EventKind.APPLY_CHANGES_SUCCESS)
+    assertThat(loggedEvents[0].wearHealthServicesEvent.kind).isEqualTo(WearHealthServicesEvent.EventKind.EMULATOR_BOUND)
+    assertThat(loggedEvents[1].kind).isEqualTo(AndroidStudioEvent.EventKind.WEAR_HEALTH_SERVICES_TOOL_WINDOW_EVENT)
+    assertThat(loggedEvents[1].wearHealthServicesEvent.kind).isEqualTo(WearHealthServicesEvent.EventKind.APPLY_CHANGES_SUCCESS)
   }
 
   @Test
@@ -184,9 +188,11 @@
 
     stateManager.getStatus().waitForValue(WhsStateManagerStatus.ConnectionLost)
 
-    assertThat(loggedEvents).hasSize(1)
+    assertThat(loggedEvents).hasSize(2)
     assertThat(loggedEvents[0].kind).isEqualTo(AndroidStudioEvent.EventKind.WEAR_HEALTH_SERVICES_TOOL_WINDOW_EVENT)
-    assertThat(loggedEvents[0].wearHealthServicesEvent.kind).isEqualTo(WearHealthServicesEvent.EventKind.APPLY_CHANGES_FAILURE)
+    assertThat(loggedEvents[0].wearHealthServicesEvent.kind).isEqualTo(WearHealthServicesEvent.EventKind.EMULATOR_BOUND)
+    assertThat(loggedEvents[1].kind).isEqualTo(AndroidStudioEvent.EventKind.WEAR_HEALTH_SERVICES_TOOL_WINDOW_EVENT)
+    assertThat(loggedEvents[1].wearHealthServicesEvent.kind).isEqualTo(WearHealthServicesEvent.EventKind.APPLY_CHANGES_FAILURE)
   }
 
   @Test
@@ -206,6 +212,47 @@
     stateManager.getStatus().waitForValue(WhsStateManagerStatus.Idle)
   }
 
+  @Test
+  fun `test stateManager periodically updates the values from the device`() = runBlocking {
+    stateManager.getCapabilitiesList().waitForValue(capabilities)
+
+    stateManager.applyChanges()
+
+    stateManager.getStatus().waitForValue(WhsStateManagerStatus.Idle)
+
+    // Disable value on-device
+    deviceManager.setCapabilities(mapOf(capabilities[0].dataType to false))
+
+    // Verify that the value is updated
+    stateManager.getState(capabilities[0]).map { it.capabilityState.enabled }.waitForValue(false, 5000)
+  }
+
+  @Test
+  fun `test stateManager periodically updates the override values from the device`() = runBlocking {
+    stateManager.getCapabilitiesList().waitForValue(capabilities)
+
+    stateManager.applyChanges()
+
+    stateManager.getStatus().waitForValue(WhsStateManagerStatus.Idle)
+
+    // Enable sensor and override value on device
+    deviceManager.setCapabilities(mapOf(capabilities[0].dataType to true))
+    deviceManager.overrideValues(mapOf(capabilities[0].dataType to 10f))
+
+    // Verify that the value is updated
+    stateManager.getState(capabilities[0]).map { it.capabilityState.enabled }.waitForValue(true, 5000)
+    stateManager.getState(capabilities[0]).map { it.capabilityState.overrideValue }.waitForValue(10f, 5000)
+  }
+
+  @Test
+  fun `test stateManager periodically updates the exercise status from the device`() = runBlocking {
+    stateManager.getOngoingExercise().waitForValue(false)
+    deviceManager.activeExercise = true
+
+    // Verify that the value is updated
+    stateManager.getOngoingExercise().waitForValue(true)
+  }
+
   private suspend fun <T> Flow<T>.waitForValue(value: T, timeout: Long = 1000) {
     val received = mutableListOf<T>()
     try {
diff --git a/wear-whs/testSrc/com/android/tools/idea/wearwhs/view/WearHealthServicesToolWindowTest.kt b/wear-whs/testSrc/com/android/tools/idea/wearwhs/view/WearHealthServicesToolWindowTest.kt
index 16eaff5..328b74a 100644
--- a/wear-whs/testSrc/com/android/tools/idea/wearwhs/view/WearHealthServicesToolWindowTest.kt
+++ b/wear-whs/testSrc/com/android/tools/idea/wearwhs/view/WearHealthServicesToolWindowTest.kt
@@ -89,11 +89,12 @@
   @Test
   fun `test panel screenshot matches expectation with modified state manager values`() = runBlocking {
     stateManager.getCapabilitiesList().waitForValue(deviceManager.capabilities)
-
-    deviceManager.failState = true
-
     stateManager.getCapabilitiesList().waitForValue(WHS_CAPABILITIES)
 
+    deviceManager.activeExercise = true
+
+    stateManager.forceUpdateState()
+
     stateManager.setPreset(Preset.CUSTOM)
     stateManager.setCapabilityEnabled(deviceManager.capabilities[0], true)
     stateManager.setCapabilityEnabled(deviceManager.capabilities[1], false)
@@ -126,6 +127,7 @@
     assertThat(dropDownButton.action.childrenActions).hasSize(EVENT_TRIGGER_GROUPS.size)
     assertThat(dropDownButton.action.childrenActions[0].childrenActions).hasSize(EVENT_TRIGGER_GROUPS[0].eventTriggers.size)
     assertThat(dropDownButton.action.childrenActions[1].childrenActions).hasSize(EVENT_TRIGGER_GROUPS[1].eventTriggers.size)
+    assertThat(dropDownButton.action.childrenActions[2].childrenActions).hasSize(EVENT_TRIGGER_GROUPS[2].eventTriggers.size)
   }
 
   private fun FakeUi.waitForCheckbox(text: String, selected: Boolean) = waitForDescendant<JCheckBox> {