Merge "auto-version-updates: including tracing-perfetto-*" into androidx-main
diff --git a/ads/ads-identifier-provider/integration-tests/testapp/lint-baseline.xml b/ads/ads-identifier-provider/integration-tests/testapp/lint-baseline.xml
index 7683bde..0160194 100644
--- a/ads/ads-identifier-provider/integration-tests/testapp/lint-baseline.xml
+++ b/ads/ads-identifier-provider/integration-tests/testapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="cli" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
+<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
 
     <issue
         id="UnknownNullness"
diff --git a/annotation/annotation-experimental/lint-baseline.xml b/annotation/annotation-experimental/lint-baseline.xml
new file mode 100644
index 0000000..47688b5
--- /dev/null
+++ b/annotation/annotation-experimental/lint-baseline.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
+
+    <issue
+        id="SupportAnnotationUsage"
+        message="Do not use `@java.lang.annotation.Target` here; it will cause the annotation to not be allowed on **any** element types from Java"
+        errorLine1="@java.lang.annotation.Target("
+        errorLine2="                      ~~~~~~">
+        <location
+            file="src/main/java/androidx/annotation/OptIn.kt"/>
+    </issue>
+
+</issues>
diff --git a/annotation/annotation/api/current.ignore b/annotation/annotation/api/current.ignore
new file mode 100644
index 0000000..7cc038b
--- /dev/null
+++ b/annotation/annotation/api/current.ignore
@@ -0,0 +1,13 @@
+// Baseline format: 1.0
+ChangedValue: androidx.annotation.FloatRange#from():
+    Method androidx.annotation.FloatRange.from has changed value from java.lang.Double.NEGATIVE_INFINITY to kotlin.jvm.internal.DoubleCompanionObject.NEGATIVE_INFINITY
+ChangedValue: androidx.annotation.FloatRange#to():
+    Method androidx.annotation.FloatRange.to has changed value from java.lang.Double.POSITIVE_INFINITY to kotlin.jvm.internal.DoubleCompanionObject.POSITIVE_INFINITY
+ChangedValue: androidx.annotation.IntRange#from():
+    Method androidx.annotation.IntRange.from has changed value from java.lang.Long.MIN_VALUE to kotlin.jvm.internal.LongCompanionObject.MIN_VALUE
+ChangedValue: androidx.annotation.IntRange#to():
+    Method androidx.annotation.IntRange.to has changed value from java.lang.Long.MAX_VALUE to kotlin.jvm.internal.LongCompanionObject.MAX_VALUE
+ChangedValue: androidx.annotation.Size#max():
+    Method androidx.annotation.Size.max has changed value from java.lang.Long.MAX_VALUE to kotlin.jvm.internal.LongCompanionObject.MAX_VALUE
+ChangedValue: androidx.annotation.Size#min():
+    Method androidx.annotation.Size.min has changed value from java.lang.Long.MIN_VALUE to kotlin.jvm.internal.LongCompanionObject.MIN_VALUE
diff --git a/annotation/annotation/api/current.txt b/annotation/annotation/api/current.txt
index 262ddb2..f6bd56a 100644
--- a/annotation/annotation/api/current.txt
+++ b/annotation/annotation/api/current.txt
@@ -99,9 +99,9 @@
   }
 
   @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS}) public @interface FloatRange {
-    method public abstract double from() default java.lang.Double.NEGATIVE_INFINITY;
+    method public abstract double from() default kotlin.jvm.internal.DoubleCompanionObject.NEGATIVE_INFINITY;
     method public abstract boolean fromInclusive() default true;
-    method public abstract double to() default java.lang.Double.POSITIVE_INFINITY;
+    method public abstract double to() default kotlin.jvm.internal.DoubleCompanionObject.POSITIVE_INFINITY;
     method public abstract boolean toInclusive() default true;
     property public abstract double from;
     property public abstract boolean fromInclusive;
@@ -182,8 +182,8 @@
   }
 
   @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS}) public @interface IntRange {
-    method public abstract long from() default java.lang.Long.MIN_VALUE;
-    method public abstract long to() default java.lang.Long.MAX_VALUE;
+    method public abstract long from() default kotlin.jvm.internal.LongCompanionObject.MIN_VALUE;
+    method public abstract long to() default kotlin.jvm.internal.LongCompanionObject.MAX_VALUE;
     property public abstract long from;
     property public abstract long to;
   }
@@ -294,8 +294,8 @@
   }
 
   @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS}) public @interface Size {
-    method public abstract long max() default java.lang.Long.MAX_VALUE;
-    method public abstract long min() default java.lang.Long.MIN_VALUE;
+    method public abstract long max() default kotlin.jvm.internal.LongCompanionObject.MAX_VALUE;
+    method public abstract long min() default kotlin.jvm.internal.LongCompanionObject.MIN_VALUE;
     method public abstract long multiple() default 1;
     method public abstract long value() default -1;
     property public abstract long max;
diff --git a/annotation/annotation/api/public_plus_experimental_current.txt b/annotation/annotation/api/public_plus_experimental_current.txt
index 262ddb2..f6bd56a 100644
--- a/annotation/annotation/api/public_plus_experimental_current.txt
+++ b/annotation/annotation/api/public_plus_experimental_current.txt
@@ -99,9 +99,9 @@
   }
 
   @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS}) public @interface FloatRange {
-    method public abstract double from() default java.lang.Double.NEGATIVE_INFINITY;
+    method public abstract double from() default kotlin.jvm.internal.DoubleCompanionObject.NEGATIVE_INFINITY;
     method public abstract boolean fromInclusive() default true;
-    method public abstract double to() default java.lang.Double.POSITIVE_INFINITY;
+    method public abstract double to() default kotlin.jvm.internal.DoubleCompanionObject.POSITIVE_INFINITY;
     method public abstract boolean toInclusive() default true;
     property public abstract double from;
     property public abstract boolean fromInclusive;
@@ -182,8 +182,8 @@
   }
 
   @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS}) public @interface IntRange {
-    method public abstract long from() default java.lang.Long.MIN_VALUE;
-    method public abstract long to() default java.lang.Long.MAX_VALUE;
+    method public abstract long from() default kotlin.jvm.internal.LongCompanionObject.MIN_VALUE;
+    method public abstract long to() default kotlin.jvm.internal.LongCompanionObject.MAX_VALUE;
     property public abstract long from;
     property public abstract long to;
   }
@@ -294,8 +294,8 @@
   }
 
   @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS}) public @interface Size {
-    method public abstract long max() default java.lang.Long.MAX_VALUE;
-    method public abstract long min() default java.lang.Long.MIN_VALUE;
+    method public abstract long max() default kotlin.jvm.internal.LongCompanionObject.MAX_VALUE;
+    method public abstract long min() default kotlin.jvm.internal.LongCompanionObject.MIN_VALUE;
     method public abstract long multiple() default 1;
     method public abstract long value() default -1;
     property public abstract long max;
diff --git a/annotation/annotation/api/restricted_current.ignore b/annotation/annotation/api/restricted_current.ignore
new file mode 100644
index 0000000..7cc038b
--- /dev/null
+++ b/annotation/annotation/api/restricted_current.ignore
@@ -0,0 +1,13 @@
+// Baseline format: 1.0
+ChangedValue: androidx.annotation.FloatRange#from():
+    Method androidx.annotation.FloatRange.from has changed value from java.lang.Double.NEGATIVE_INFINITY to kotlin.jvm.internal.DoubleCompanionObject.NEGATIVE_INFINITY
+ChangedValue: androidx.annotation.FloatRange#to():
+    Method androidx.annotation.FloatRange.to has changed value from java.lang.Double.POSITIVE_INFINITY to kotlin.jvm.internal.DoubleCompanionObject.POSITIVE_INFINITY
+ChangedValue: androidx.annotation.IntRange#from():
+    Method androidx.annotation.IntRange.from has changed value from java.lang.Long.MIN_VALUE to kotlin.jvm.internal.LongCompanionObject.MIN_VALUE
+ChangedValue: androidx.annotation.IntRange#to():
+    Method androidx.annotation.IntRange.to has changed value from java.lang.Long.MAX_VALUE to kotlin.jvm.internal.LongCompanionObject.MAX_VALUE
+ChangedValue: androidx.annotation.Size#max():
+    Method androidx.annotation.Size.max has changed value from java.lang.Long.MAX_VALUE to kotlin.jvm.internal.LongCompanionObject.MAX_VALUE
+ChangedValue: androidx.annotation.Size#min():
+    Method androidx.annotation.Size.min has changed value from java.lang.Long.MIN_VALUE to kotlin.jvm.internal.LongCompanionObject.MIN_VALUE
diff --git a/annotation/annotation/api/restricted_current.txt b/annotation/annotation/api/restricted_current.txt
index 262ddb2..f6bd56a 100644
--- a/annotation/annotation/api/restricted_current.txt
+++ b/annotation/annotation/api/restricted_current.txt
@@ -99,9 +99,9 @@
   }
 
   @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS}) public @interface FloatRange {
-    method public abstract double from() default java.lang.Double.NEGATIVE_INFINITY;
+    method public abstract double from() default kotlin.jvm.internal.DoubleCompanionObject.NEGATIVE_INFINITY;
     method public abstract boolean fromInclusive() default true;
-    method public abstract double to() default java.lang.Double.POSITIVE_INFINITY;
+    method public abstract double to() default kotlin.jvm.internal.DoubleCompanionObject.POSITIVE_INFINITY;
     method public abstract boolean toInclusive() default true;
     property public abstract double from;
     property public abstract boolean fromInclusive;
@@ -182,8 +182,8 @@
   }
 
   @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS}) public @interface IntRange {
-    method public abstract long from() default java.lang.Long.MIN_VALUE;
-    method public abstract long to() default java.lang.Long.MAX_VALUE;
+    method public abstract long from() default kotlin.jvm.internal.LongCompanionObject.MIN_VALUE;
+    method public abstract long to() default kotlin.jvm.internal.LongCompanionObject.MAX_VALUE;
     property public abstract long from;
     property public abstract long to;
   }
@@ -294,8 +294,8 @@
   }
 
   @kotlin.annotation.MustBeDocumented @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.LOCAL_VARIABLE, kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER, kotlin.annotation.AnnotationTarget.PROPERTY_SETTER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.ANNOTATION_CLASS}) public @interface Size {
-    method public abstract long max() default java.lang.Long.MAX_VALUE;
-    method public abstract long min() default java.lang.Long.MIN_VALUE;
+    method public abstract long max() default kotlin.jvm.internal.LongCompanionObject.MAX_VALUE;
+    method public abstract long min() default kotlin.jvm.internal.LongCompanionObject.MIN_VALUE;
     method public abstract long multiple() default 1;
     method public abstract long value() default -1;
     property public abstract long max;
diff --git a/annotation/annotation/build.gradle b/annotation/annotation/build.gradle
index f85daab..7f3042f 100644
--- a/annotation/annotation/build.gradle
+++ b/annotation/annotation/build.gradle
@@ -1,16 +1,51 @@
+import androidx.build.KmpPlatformsKt
+import androidx.build.LibraryType
 import androidx.build.Publish
+import org.jetbrains.kotlin.gradle.plugin.KotlinPlatformType
+import org.jetbrains.kotlin.gradle.tasks.KotlinNativeCompile
 
 plugins {
     id("AndroidXPlugin")
-    id("java-library")
-    id("kotlin")
 }
 
-dependencies {
-    api(libs.kotlinStdlib)
+androidXMultiplatform {
+    jvm {
+        withJava() // Remove after b/247980072
+    }
+    mac()
+    linux()
+    ios()
+
+    sourceSets {
+        commonMain {
+            dependencies {
+                api(libs.kotlinStdlib)
+            }
+        }
+
+        if (KmpPlatformsKt.enableNative(project)) {
+            nonJvmMain {
+                dependsOn commonMain
+            }
+
+            targets.all { target ->
+                if (target.platformType !in [KotlinPlatformType.jvm, KotlinPlatformType.common]) {
+                    target.compilations["main"].defaultSourceSet {
+                        dependsOn(nonJvmMain)
+                    }
+                }
+            }
+        }
+
+        // Workaround for https://youtrack.jetbrains.com/issue/KT-51763
+        // Make sure commonization runs before any compilation task.
+        tasks.withType(KotlinNativeCompile).configureEach {
+            it.dependsOn(tasks.named("commonize"))
+        }
+    }
 }
 
-jar {
+jvmJar {
     from sourceSets.main.output
     // Strip out typedef classes. For Android libraries, this is done
     // automatically by the Gradle plugin, but the Annotation library is a
@@ -29,12 +64,13 @@
 
 // add annotations jar task as artifacts
 artifacts {
-    archives jar
+    archives jvmJar
     archives annotationsZip
 }
 
 androidx {
     name = "Android Support Library Annotations"
+    type = LibraryType.KMP_LIBRARY
     publish = Publish.SNAPSHOT_AND_RELEASE
     mavenVersion = LibraryVersions.ANNOTATION
     mavenGroup = LibraryGroups.ANNOTATION
diff --git a/annotation/annotation/src/main/java/androidx/annotation/AnyThread.kt b/annotation/annotation/src/commonMain/kotlin/androidx/annotation/AnyThread.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/AnyThread.kt
rename to annotation/annotation/src/commonMain/kotlin/androidx/annotation/AnyThread.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/CallSuper.kt b/annotation/annotation/src/commonMain/kotlin/androidx/annotation/CallSuper.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/CallSuper.kt
rename to annotation/annotation/src/commonMain/kotlin/androidx/annotation/CallSuper.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/CheckResult.kt b/annotation/annotation/src/commonMain/kotlin/androidx/annotation/CheckResult.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/CheckResult.kt
rename to annotation/annotation/src/commonMain/kotlin/androidx/annotation/CheckResult.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/ColorInt.kt b/annotation/annotation/src/commonMain/kotlin/androidx/annotation/ColorInt.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/ColorInt.kt
rename to annotation/annotation/src/commonMain/kotlin/androidx/annotation/ColorInt.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/ColorLong.kt b/annotation/annotation/src/commonMain/kotlin/androidx/annotation/ColorLong.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/ColorLong.kt
rename to annotation/annotation/src/commonMain/kotlin/androidx/annotation/ColorLong.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/Discouraged.kt b/annotation/annotation/src/commonMain/kotlin/androidx/annotation/Discouraged.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/Discouraged.kt
rename to annotation/annotation/src/commonMain/kotlin/androidx/annotation/Discouraged.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/EmptySuper.kt b/annotation/annotation/src/commonMain/kotlin/androidx/annotation/EmptySuper.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/EmptySuper.kt
rename to annotation/annotation/src/commonMain/kotlin/androidx/annotation/EmptySuper.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/FloatRange.kt b/annotation/annotation/src/commonMain/kotlin/androidx/annotation/FloatRange.kt
similarity index 93%
rename from annotation/annotation/src/main/java/androidx/annotation/FloatRange.kt
rename to annotation/annotation/src/commonMain/kotlin/androidx/annotation/FloatRange.kt
index 3cadac6..a3304be 100644
--- a/annotation/annotation/src/main/java/androidx/annotation/FloatRange.kt
+++ b/annotation/annotation/src/commonMain/kotlin/androidx/annotation/FloatRange.kt
@@ -43,12 +43,12 @@
      * Smallest value. Whether it is inclusive or not is determined
      * by [.fromInclusive]
      */
-    val from: Double = java.lang.Double.NEGATIVE_INFINITY,
+    val from: Double = Double.NEGATIVE_INFINITY,
     /**
      * Largest value. Whether it is inclusive or not is determined
      * by [.toInclusive]
      */
-    val to: Double = java.lang.Double.POSITIVE_INFINITY,
+    val to: Double = Double.POSITIVE_INFINITY,
     /** Whether the from value is included in the range  */
     val fromInclusive: Boolean = true,
     /** Whether the to value is included in the range  */
diff --git a/annotation/annotation/src/main/java/androidx/annotation/GuardedBy.kt b/annotation/annotation/src/commonMain/kotlin/androidx/annotation/GuardedBy.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/GuardedBy.kt
rename to annotation/annotation/src/commonMain/kotlin/androidx/annotation/GuardedBy.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/IntDef.kt b/annotation/annotation/src/commonMain/kotlin/androidx/annotation/IntDef.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/IntDef.kt
rename to annotation/annotation/src/commonMain/kotlin/androidx/annotation/IntDef.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/IntRange.kt b/annotation/annotation/src/commonMain/kotlin/androidx/annotation/IntRange.kt
similarity index 93%
rename from annotation/annotation/src/main/java/androidx/annotation/IntRange.kt
rename to annotation/annotation/src/commonMain/kotlin/androidx/annotation/IntRange.kt
index 94c903e..2dfe044 100644
--- a/annotation/annotation/src/main/java/androidx/annotation/IntRange.kt
+++ b/annotation/annotation/src/commonMain/kotlin/androidx/annotation/IntRange.kt
@@ -39,7 +39,7 @@
 )
 public annotation class IntRange(
     /** Smallest value, inclusive  */
-    val from: Long = java.lang.Long.MIN_VALUE,
+    val from: Long = Long.MIN_VALUE,
     /** Largest value, inclusive  */
-    val to: Long = java.lang.Long.MAX_VALUE
+    val to: Long = Long.MAX_VALUE
 )
\ No newline at end of file
diff --git a/annotation/annotation/src/main/java/androidx/annotation/LongDef.kt b/annotation/annotation/src/commonMain/kotlin/androidx/annotation/LongDef.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/LongDef.kt
rename to annotation/annotation/src/commonMain/kotlin/androidx/annotation/LongDef.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/MainThread.kt b/annotation/annotation/src/commonMain/kotlin/androidx/annotation/MainThread.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/MainThread.kt
rename to annotation/annotation/src/commonMain/kotlin/androidx/annotation/MainThread.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/OpenForTesting.kt b/annotation/annotation/src/commonMain/kotlin/androidx/annotation/OpenForTesting.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/OpenForTesting.kt
rename to annotation/annotation/src/commonMain/kotlin/androidx/annotation/OpenForTesting.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/ProductionVisibility.kt b/annotation/annotation/src/commonMain/kotlin/androidx/annotation/ProductionVisibility.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/ProductionVisibility.kt
rename to annotation/annotation/src/commonMain/kotlin/androidx/annotation/ProductionVisibility.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/RequiresFeature.kt b/annotation/annotation/src/commonMain/kotlin/androidx/annotation/RequiresFeature.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/RequiresFeature.kt
rename to annotation/annotation/src/commonMain/kotlin/androidx/annotation/RequiresFeature.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/RestrictTo.kt b/annotation/annotation/src/commonMain/kotlin/androidx/annotation/RestrictTo.kt
similarity index 83%
copy from annotation/annotation/src/main/java/androidx/annotation/RestrictTo.kt
copy to annotation/annotation/src/commonMain/kotlin/androidx/annotation/RestrictTo.kt
index be84d7a..1b5036e 100644
--- a/annotation/annotation/src/main/java/androidx/annotation/RestrictTo.kt
+++ b/annotation/annotation/src/commonMain/kotlin/androidx/annotation/RestrictTo.kt
@@ -17,12 +17,6 @@
 package androidx.annotation
 
 import androidx.annotation.RestrictTo.Scope
-import java.lang.annotation.ElementType.ANNOTATION_TYPE
-import java.lang.annotation.ElementType.CONSTRUCTOR
-import java.lang.annotation.ElementType.FIELD
-import java.lang.annotation.ElementType.METHOD
-import java.lang.annotation.ElementType.PACKAGE
-import java.lang.annotation.ElementType.TYPE
 
 /**
  * Denotes that the annotated element should only be accessed from within a
@@ -46,7 +40,7 @@
  * ```
  */
 @MustBeDocumented
-@kotlin.annotation.Retention(AnnotationRetention.BINARY)
+@Retention(AnnotationRetention.BINARY)
 @Target(
     AnnotationTarget.ANNOTATION_CLASS,
     AnnotationTarget.CLASS,
@@ -57,13 +51,7 @@
     AnnotationTarget.FIELD,
     AnnotationTarget.FILE
 )
-// Needed due to Kotlin's lack of PACKAGE annotation target
-// https://youtrack.jetbrains.com/issue/KT-45921
-@Suppress("DEPRECATED_JAVA_ANNOTATION")
-@java.lang.annotation.Target(
-    ANNOTATION_TYPE, TYPE, METHOD, CONSTRUCTOR, FIELD, PACKAGE
-)
-public annotation class RestrictTo(
+public expect annotation class RestrictTo(
     /**
      * The scope to which usage should be restricted.
      */
diff --git a/annotation/annotation/src/main/java/androidx/annotation/ReturnThis.kt b/annotation/annotation/src/commonMain/kotlin/androidx/annotation/ReturnThis.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/ReturnThis.kt
rename to annotation/annotation/src/commonMain/kotlin/androidx/annotation/ReturnThis.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/Size.kt b/annotation/annotation/src/commonMain/kotlin/androidx/annotation/Size.kt
similarity index 94%
rename from annotation/annotation/src/main/java/androidx/annotation/Size.kt
rename to annotation/annotation/src/commonMain/kotlin/androidx/annotation/Size.kt
index b57c5d0..574d8c5 100644
--- a/annotation/annotation/src/main/java/androidx/annotation/Size.kt
+++ b/annotation/annotation/src/commonMain/kotlin/androidx/annotation/Size.kt
@@ -42,9 +42,9 @@
     /** An exact size (or -1 if not specified)  */
     val value: Long = -1,
     /** A minimum size, inclusive  */
-    val min: Long = java.lang.Long.MIN_VALUE,
+    val min: Long = Long.MIN_VALUE,
     /** A maximum size, inclusive  */
-    val max: Long = java.lang.Long.MAX_VALUE,
+    val max: Long = Long.MAX_VALUE,
     /** The size must be a multiple of this factor  */
     val multiple: Long = 1
 )
\ No newline at end of file
diff --git a/annotation/annotation/src/main/java/androidx/annotation/StringDef.kt b/annotation/annotation/src/commonMain/kotlin/androidx/annotation/StringDef.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/StringDef.kt
rename to annotation/annotation/src/commonMain/kotlin/androidx/annotation/StringDef.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/VisibleForTesting.kt b/annotation/annotation/src/commonMain/kotlin/androidx/annotation/VisibleForTesting.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/VisibleForTesting.kt
rename to annotation/annotation/src/commonMain/kotlin/androidx/annotation/VisibleForTesting.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/AnimRes.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/AnimRes.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/AnimRes.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/AnimRes.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/AnimatorRes.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/AnimatorRes.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/AnimatorRes.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/AnimatorRes.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/AnyRes.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/AnyRes.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/AnyRes.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/AnyRes.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/ArrayRes.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/ArrayRes.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/ArrayRes.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/ArrayRes.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/AttrRes.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/AttrRes.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/AttrRes.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/AttrRes.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/BinderThread.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/BinderThread.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/BinderThread.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/BinderThread.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/BoolRes.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/BoolRes.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/BoolRes.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/BoolRes.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/ChecksSdkIntAtLeast.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/ChecksSdkIntAtLeast.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/ChecksSdkIntAtLeast.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/ChecksSdkIntAtLeast.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/ColorRes.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/ColorRes.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/ColorRes.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/ColorRes.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/ContentView.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/ContentView.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/ContentView.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/ContentView.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/DeprecatedSinceApi.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/DeprecatedSinceApi.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/DeprecatedSinceApi.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/DeprecatedSinceApi.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/DimenRes.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/DimenRes.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/DimenRes.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/DimenRes.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/Dimension.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/Dimension.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/Dimension.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/Dimension.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/DimensionUnit.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/DimensionUnit.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/DimensionUnit.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/DimensionUnit.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/DisplayContext.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/DisplayContext.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/DisplayContext.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/DisplayContext.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/DoNotInline.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/DoNotInline.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/DoNotInline.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/DoNotInline.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/DrawableRes.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/DrawableRes.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/DrawableRes.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/DrawableRes.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/FontRes.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/FontRes.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/FontRes.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/FontRes.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/FractionRes.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/FractionRes.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/FractionRes.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/FractionRes.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/GravityInt.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/GravityInt.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/GravityInt.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/GravityInt.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/HalfFloat.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/HalfFloat.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/HalfFloat.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/HalfFloat.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/IdRes.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/IdRes.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/IdRes.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/IdRes.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/InspectableProperty.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/InspectableProperty.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/InspectableProperty.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/InspectableProperty.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/IntegerRes.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/IntegerRes.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/IntegerRes.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/IntegerRes.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/InterpolatorRes.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/InterpolatorRes.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/InterpolatorRes.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/InterpolatorRes.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/Keep.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/Keep.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/Keep.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/Keep.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/LayoutRes.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/LayoutRes.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/LayoutRes.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/LayoutRes.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/MenuRes.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/MenuRes.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/MenuRes.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/MenuRes.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/NavigationRes.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/NavigationRes.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/NavigationRes.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/NavigationRes.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/NonNull.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/NonNull.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/NonNull.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/NonNull.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/NonUiContext.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/NonUiContext.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/NonUiContext.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/NonUiContext.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/Nullable.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/Nullable.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/Nullable.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/Nullable.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/PluralsRes.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/PluralsRes.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/PluralsRes.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/PluralsRes.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/Px.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/Px.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/Px.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/Px.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/RawRes.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/RawRes.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/RawRes.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/RawRes.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/RequiresApi.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/RequiresApi.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/RequiresApi.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/RequiresApi.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/RequiresPermission.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/RequiresPermission.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/RequiresPermission.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/RequiresPermission.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/RestrictTo.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/RestrictTo.jvm.kt
similarity index 85%
rename from annotation/annotation/src/main/java/androidx/annotation/RestrictTo.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/RestrictTo.jvm.kt
index be84d7a..d64d5e3 100644
--- a/annotation/annotation/src/main/java/androidx/annotation/RestrictTo.kt
+++ b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/RestrictTo.jvm.kt
@@ -17,12 +17,7 @@
 package androidx.annotation
 
 import androidx.annotation.RestrictTo.Scope
-import java.lang.annotation.ElementType.ANNOTATION_TYPE
-import java.lang.annotation.ElementType.CONSTRUCTOR
-import java.lang.annotation.ElementType.FIELD
-import java.lang.annotation.ElementType.METHOD
-import java.lang.annotation.ElementType.PACKAGE
-import java.lang.annotation.ElementType.TYPE
+import java.lang.annotation.ElementType
 
 /**
  * Denotes that the annotated element should only be accessed from within a
@@ -46,7 +41,7 @@
  * ```
  */
 @MustBeDocumented
-@kotlin.annotation.Retention(AnnotationRetention.BINARY)
+@Retention(AnnotationRetention.BINARY)
 @Target(
     AnnotationTarget.ANNOTATION_CLASS,
     AnnotationTarget.CLASS,
@@ -55,21 +50,26 @@
     AnnotationTarget.PROPERTY_SETTER,
     AnnotationTarget.CONSTRUCTOR,
     AnnotationTarget.FIELD,
-    AnnotationTarget.FILE
+    AnnotationTarget.FILE,
 )
 // Needed due to Kotlin's lack of PACKAGE annotation target
 // https://youtrack.jetbrains.com/issue/KT-45921
 @Suppress("DEPRECATED_JAVA_ANNOTATION")
 @java.lang.annotation.Target(
-    ANNOTATION_TYPE, TYPE, METHOD, CONSTRUCTOR, FIELD, PACKAGE
+    ElementType.ANNOTATION_TYPE,
+    ElementType.TYPE,
+    ElementType.METHOD,
+    ElementType.CONSTRUCTOR,
+    ElementType.FIELD,
+    ElementType.PACKAGE,
 )
-public annotation class RestrictTo(
+public actual annotation class RestrictTo actual constructor(
     /**
      * The scope to which usage should be restricted.
      */
-    vararg val value: Scope
+    actual vararg val value: Scope
 ) {
-    public enum class Scope {
+    public actual enum class Scope {
         /**
          * Restrict usage to code within the same library (e.g. the same
          * gradle group ID and artifact ID).
diff --git a/annotation/annotation/src/main/java/androidx/annotation/StringRes.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/StringRes.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/StringRes.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/StringRes.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/StyleRes.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/StyleRes.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/StyleRes.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/StyleRes.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/StyleableRes.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/StyleableRes.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/StyleableRes.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/StyleableRes.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/TransitionRes.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/TransitionRes.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/TransitionRes.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/TransitionRes.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/UiContext.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/UiContext.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/UiContext.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/UiContext.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/UiThread.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/UiThread.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/UiThread.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/UiThread.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/WorkerThread.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/WorkerThread.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/WorkerThread.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/WorkerThread.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/XmlRes.kt b/annotation/annotation/src/jvmMain/kotlin/androidx/annotation/XmlRes.kt
similarity index 100%
rename from annotation/annotation/src/main/java/androidx/annotation/XmlRes.kt
rename to annotation/annotation/src/jvmMain/kotlin/androidx/annotation/XmlRes.kt
diff --git a/annotation/annotation/src/main/java/androidx/annotation/RestrictTo.kt b/annotation/annotation/src/nonJvmMain/kotlin/androidx/annotation/RestrictTo.nonJvm.kt
similarity index 81%
copy from annotation/annotation/src/main/java/androidx/annotation/RestrictTo.kt
copy to annotation/annotation/src/nonJvmMain/kotlin/androidx/annotation/RestrictTo.nonJvm.kt
index be84d7a..9671c90 100644
--- a/annotation/annotation/src/main/java/androidx/annotation/RestrictTo.kt
+++ b/annotation/annotation/src/nonJvmMain/kotlin/androidx/annotation/RestrictTo.nonJvm.kt
@@ -17,12 +17,6 @@
 package androidx.annotation
 
 import androidx.annotation.RestrictTo.Scope
-import java.lang.annotation.ElementType.ANNOTATION_TYPE
-import java.lang.annotation.ElementType.CONSTRUCTOR
-import java.lang.annotation.ElementType.FIELD
-import java.lang.annotation.ElementType.METHOD
-import java.lang.annotation.ElementType.PACKAGE
-import java.lang.annotation.ElementType.TYPE
 
 /**
  * Denotes that the annotated element should only be accessed from within a
@@ -46,7 +40,7 @@
  * ```
  */
 @MustBeDocumented
-@kotlin.annotation.Retention(AnnotationRetention.BINARY)
+@Retention(AnnotationRetention.BINARY)
 @Target(
     AnnotationTarget.ANNOTATION_CLASS,
     AnnotationTarget.CLASS,
@@ -55,21 +49,15 @@
     AnnotationTarget.PROPERTY_SETTER,
     AnnotationTarget.CONSTRUCTOR,
     AnnotationTarget.FIELD,
-    AnnotationTarget.FILE
+    AnnotationTarget.FILE,
 )
-// Needed due to Kotlin's lack of PACKAGE annotation target
-// https://youtrack.jetbrains.com/issue/KT-45921
-@Suppress("DEPRECATED_JAVA_ANNOTATION")
-@java.lang.annotation.Target(
-    ANNOTATION_TYPE, TYPE, METHOD, CONSTRUCTOR, FIELD, PACKAGE
-)
-public annotation class RestrictTo(
+public actual annotation class RestrictTo actual constructor(
     /**
      * The scope to which usage should be restricted.
      */
-    vararg val value: Scope
+    actual vararg val value: Scope
 ) {
-    public enum class Scope {
+    public actual enum class Scope {
         /**
          * Restrict usage to code within the same library (e.g. the same
          * gradle group ID and artifact ID).
diff --git a/appcompat/appcompat/src/main/res/values-ro/strings.xml b/appcompat/appcompat/src/main/res/values-ro/strings.xml
index 037261b..d5bde8f 100644
--- a/appcompat/appcompat/src/main/res/values-ro/strings.xml
+++ b/appcompat/appcompat/src/main/res/values-ro/strings.xml
@@ -17,8 +17,8 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="abc_action_mode_done" msgid="4692188335987374352">"Gata"</string>
-    <string name="abc_action_bar_home_description" msgid="5976598919945601918">"Navigați la ecranul de pornire"</string>
-    <string name="abc_action_bar_up_description" msgid="8388173803310557296">"Navigați în sus"</string>
+    <string name="abc_action_bar_home_description" msgid="5976598919945601918">"Navighează la ecranul de pornire"</string>
+    <string name="abc_action_bar_up_description" msgid="8388173803310557296">"Navighează în sus"</string>
     <string name="abc_action_menu_overflow_description" msgid="3937310113216875497">"Mai multe opțiuni"</string>
     <string name="abc_toolbar_collapse_description" msgid="1656852541809559762">"Restrânge"</string>
     <string name="abc_searchview_description_search" msgid="3417662926640357176">"Caută"</string>
diff --git a/appsearch/appsearch/lint-baseline.xml b/appsearch/appsearch/lint-baseline.xml
new file mode 100644
index 0000000..fa994f2
--- /dev/null
+++ b/appsearch/appsearch/lint-baseline.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="cli" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
+
+    <issue
+        id="SupportAnnotationUsage"
+        message="This annotation does not apply for type java.util.Set&lt;java.util.Set&lt;java.lang.Integer>>; expected int"
+        errorLine1="                @SetSchemaRequest.AppSearchSupportedPermission @NonNull"
+        errorLine2="                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/appsearch/app/GetSchemaResponse.java"/>
+    </issue>
+
+</issues>
diff --git a/arch/core/core-testing/lint-baseline.xml b/arch/core/core-testing/lint-baseline.xml
index e4e77e4..0004e63 100644
--- a/arch/core/core-testing/lint-baseline.xml
+++ b/arch/core/core-testing/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="cli" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
+<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
 
     <issue
         id="UnknownNullness"
diff --git a/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/BaselineProfiles.kt b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/BaselineProfiles.kt
index 7466d0f..fb018a7 100644
--- a/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/BaselineProfiles.kt
+++ b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/BaselineProfiles.kt
@@ -51,6 +51,8 @@
             " Use `adb root`."
     }
 
+    getInstalledPackageInfo(packageName) // throws clearly if not installed
+
     val startTime = System.nanoTime()
     val scope = MacrobenchmarkScope(packageName, launchWithClearTask = true)
 
@@ -72,10 +74,12 @@
     killProcessBlock.invoke()
     try {
         userspaceTrace("compile $packageName") {
+            var iteration = 1
             compilationMode.resetAndCompile(
                 packageName = packageName,
                 killProcessBlock = killProcessBlock
             ) {
+                scope.iteration = iteration++
                 profileBlock(scope)
             }
         }
diff --git a/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/Macrobenchmark.kt b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/Macrobenchmark.kt
index e63fb5f..fe156f1 100644
--- a/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/Macrobenchmark.kt
+++ b/benchmark/benchmark-macro/src/main/java/androidx/benchmark/macro/Macrobenchmark.kt
@@ -16,6 +16,7 @@
 
 package androidx.benchmark.macro
 
+import android.content.pm.ApplicationInfo
 import android.content.pm.ApplicationInfo.FLAG_DEBUGGABLE
 import android.content.pm.PackageManager
 import android.os.Build
@@ -39,18 +40,24 @@
 import androidx.tracing.trace
 import java.io.File
 
+/**
+ * Get package ApplicationInfo, throw if not found
+ */
 @Suppress("DEPRECATION")
-internal fun checkErrors(packageName: String): ConfigurationError.SuppressionState? {
+internal fun getInstalledPackageInfo(packageName: String): ApplicationInfo {
     val pm = InstrumentationRegistry.getInstrumentation().context.packageManager
-
-    val applicationInfo = try {
-        pm.getApplicationInfo(packageName, 0)
+    try {
+        return pm.getApplicationInfo(packageName, 0)
     } catch (notFoundException: PackageManager.NameNotFoundException) {
         throw AssertionError(
             "Unable to find target package $packageName, is it installed?",
             notFoundException
         )
     }
+}
+
+internal fun checkErrors(packageName: String): ConfigurationError.SuppressionState? {
+    val applicationInfo = getInstalledPackageInfo(packageName)
 
     val errorNotProfileable = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
         applicationInfo.isNotProfileableByShell()
diff --git a/benchmark/integration-tests/macrobenchmark/build.gradle b/benchmark/integration-tests/macrobenchmark/build.gradle
index b9738c4..e823480 100644
--- a/benchmark/integration-tests/macrobenchmark/build.gradle
+++ b/benchmark/integration-tests/macrobenchmark/build.gradle
@@ -41,6 +41,7 @@
     androidTestImplementation(project(":benchmark:benchmark-macro-junit4"))
     androidTestImplementation(project(":internal-testutils-macrobenchmark"))
     androidTestImplementation(project(":tracing:tracing-ktx"))
+    androidTestImplementation(libs.kotlinTest)
     androidTestImplementation(libs.testRules)
     androidTestImplementation(libs.testExtJunit)
     androidTestImplementation(libs.testCore)
diff --git a/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/BaselineProfileFilterTest.kt b/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/BaselineProfileRuleTest.kt
similarity index 77%
rename from benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/BaselineProfileFilterTest.kt
rename to benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/BaselineProfileRuleTest.kt
index 0ae84d3..cb321f5 100644
--- a/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/BaselineProfileFilterTest.kt
+++ b/benchmark/integration-tests/macrobenchmark/src/androidTest/java/androidx/benchmark/integration/macrobenchmark/BaselineProfileRuleTest.kt
@@ -25,6 +25,10 @@
 import androidx.test.filters.SdkSuppress
 import com.google.common.truth.Truth.assertThat
 import java.io.File
+import kotlin.test.assertFailsWith
+import org.junit.Assert.assertEquals
+import org.junit.Assert.assertTrue
+import org.junit.Assert.fail
 import org.junit.Assume.assumeTrue
 import org.junit.Rule
 import org.junit.Test
@@ -32,24 +36,41 @@
 @LargeTest
 @SdkSuppress(minSdkVersion = 29)
 @OptIn(ExperimentalBaselineProfilesApi::class)
-class BaselineProfileFilterTest {
+class BaselineProfileRuleTest {
 
     @get:Rule
     val baselineRule = BaselineProfileRule()
 
     @Test
-    fun baselineProfilesFilter() {
+    fun appNotInstalled() {
+        val error = assertFailsWith<AssertionError> {
+            baselineRule.collectBaselineProfile(
+                packageName = "fake.package.not.installed",
+                profileBlock = {
+                    fail("not expected")
+                }
+            )
+        }
+        println(error.message)
+        assertTrue(error.message!!.contains("Unable to find target package"))
+    }
+
+    @Test
+    fun filter() {
         assumeTrue(Shell.isSessionRooted())
 
+        var nextIteration = 1
         // Collects the baseline profile
         baselineRule.collectBaselineProfile(
             packageName = PACKAGE_NAME,
             packageFilters = listOf(PACKAGE_NAME),
             profileBlock = {
+                assertEquals(nextIteration++, iteration)
                 startActivityAndWait(Intent(ACTION))
                 device.waitForIdle()
             }
         )
+        assertEquals(4, nextIteration)
 
         // Asserts the output of the baseline profile
         val lines = File(Outputs.outputDirectory, BASELINE_PROFILE_OUTPUT_FILE_NAME).readLines()
@@ -72,6 +93,6 @@
         // according to the patter `<class>_<method>-baseline-prof.txt`. Changes for class and
         // method names should be reflected here in order for the test to succeed.
         private const val BASELINE_PROFILE_OUTPUT_FILE_NAME =
-            "BaselineProfileFilterTest_baselineProfilesFilter-baseline-prof.txt"
+            "BaselineProfileRuleTest_filter-baseline-prof.txt"
     }
 }
diff --git a/biometric/biometric/src/main/res/values-ro/strings.xml b/biometric/biometric/src/main/res/values-ro/strings.xml
index de7b985..cf7f6e5 100644
--- a/biometric/biometric/src/main/res/values-ro/strings.xml
+++ b/biometric/biometric/src/main/res/values-ro/strings.xml
@@ -26,22 +26,22 @@
     <string name="fingerprint_error_lockout" msgid="7291787166416782245">"Prea multe încercări. Încearcă din nou mai târziu."</string>
     <string name="default_error_msg" msgid="4776854077120974966">"Eroare necunoscută"</string>
     <string name="generic_error_user_canceled" msgid="7309881387583143581">"Autentificarea a fost anulată de utilizator."</string>
-    <string name="confirm_device_credential_password" msgid="5912733858573823945">"Folosiți parola"</string>
+    <string name="confirm_device_credential_password" msgid="5912733858573823945">"Folosește parola"</string>
     <string name="generic_error_no_device_credential" msgid="3791785319221634505">"Nu este setat niciun cod PIN, model sau parolă."</string>
     <string name="generic_error_no_keyguard" msgid="1807436368654974044">"Dispozitivul nu acceptă codul PIN, modelul sau parola."</string>
     <string name="fingerprint_dialog_icon_description" msgid="5462024216548165325">"Pictograma amprentă"</string>
-    <string name="use_fingerprint_label" msgid="6961788485681412417">"Folosiți amprenta"</string>
-    <string name="use_face_label" msgid="6533512708069459542">"Folosiți chipul"</string>
-    <string name="use_biometric_label" msgid="6524145989441579428">"Folosiți sistemele biometrice"</string>
-    <string name="use_screen_lock_label" msgid="5459869335976243512">"Folosiți blocarea ecranului"</string>
-    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Folosiți amprenta sau blocarea ecranului"</string>
-    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Folosiți deblocarea facială sau ecranul de blocare"</string>
-    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Folosiți sistemele biometrice sau blocarea ecranului"</string>
-    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Folosiți amprenta pentru a continua"</string>
+    <string name="use_fingerprint_label" msgid="6961788485681412417">"Folosește amprenta"</string>
+    <string name="use_face_label" msgid="6533512708069459542">"Folosește chipul"</string>
+    <string name="use_biometric_label" msgid="6524145989441579428">"Folosește sistemele biometrice"</string>
+    <string name="use_screen_lock_label" msgid="5459869335976243512">"Folosește blocarea ecranului"</string>
+    <string name="use_fingerprint_or_screen_lock_label" msgid="7577690399303139443">"Folosește amprenta sau blocarea ecranului"</string>
+    <string name="use_face_or_screen_lock_label" msgid="2116180187159450292">"Folosește deblocarea facială sau ecranul de blocare"</string>
+    <string name="use_biometric_or_screen_lock_label" msgid="5385448280139639016">"Folosește sistemele biometrice sau blocarea ecranului"</string>
+    <string name="fingerprint_prompt_message" msgid="7449360011861769080">"Folosește amprenta pentru a continua"</string>
     <string name="face_prompt_message" msgid="2282389249605674226">"Folosiți-vă chipul ca să continuați"</string>
-    <string name="biometric_prompt_message" msgid="1160635338192065472">"Folosiți sistemele biometrice pentru a continua"</string>
+    <string name="biometric_prompt_message" msgid="1160635338192065472">"Folosește sistemele biometrice pentru a continua"</string>
     <string name="screen_lock_prompt_message" msgid="5659570757430909869">"Introduceți blocarea ecranului ca să continuați"</string>
-    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Folosiți amprenta sau blocarea ecranului pentru a continua"</string>
+    <string name="fingerprint_or_screen_lock_prompt_message" msgid="8382576858490514495">"Folosește amprenta sau blocarea ecranului pentru a continua"</string>
     <string name="face_or_screen_lock_prompt_message" msgid="4562557128765735254">"Folosiți-vă chipul sau blocarea ecranului pentru a continua"</string>
-    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Folosiți sistemele biometrice sau blocarea ecranului pentru a continua"</string>
+    <string name="biometric_or_screen_lock_prompt_message" msgid="2102429900219199821">"Folosește sistemele biometrice sau blocarea ecranului pentru a continua"</string>
 </resources>
diff --git a/buildSrc/apply/applyAndroidXLayoutlibImplPlugin.gradle b/buildSrc/apply/applyAndroidXLayoutlibImplPlugin.gradle
new file mode 100644
index 0000000..c89f0f4
--- /dev/null
+++ b/buildSrc/apply/applyAndroidXLayoutlibImplPlugin.gradle
@@ -0,0 +1,9 @@
+import androidx.build.layoutlib.AndroidXLayoutlibImplPlugin
+
+buildscript {
+    dependencies {
+        classpath(project.files("${project.rootProject.ext["buildSrcOut"]}/private/build/libs/private.jar"))
+    }
+}
+
+apply plugin: AndroidXLayoutlibImplPlugin
diff --git a/buildSrc/apply/applyAndroidXPaparazziImplPlugin.gradle b/buildSrc/apply/applyAndroidXPaparazziImplPlugin.gradle
deleted file mode 100644
index ece0f79..0000000
--- a/buildSrc/apply/applyAndroidXPaparazziImplPlugin.gradle
+++ /dev/null
@@ -1,9 +0,0 @@
-import androidx.build.paparazzi.AndroidXPaparazziImplPlugin
-
-buildscript {
-    dependencies {
-        classpath(project.files("${project.rootProject.ext["buildSrcOut"]}/private/build/libs/private.jar"))
-    }
-}
-
-apply plugin: AndroidXPaparazziImplPlugin
diff --git a/buildSrc/plugins/src/main/kotlin/androidx/build/paparazzi/AndroidXPaparazziPlugin.kt b/buildSrc/plugins/src/main/kotlin/androidx/build/AndroidXLayoutlibPlugin.kt
similarity index 86%
rename from buildSrc/plugins/src/main/kotlin/androidx/build/paparazzi/AndroidXPaparazziPlugin.kt
rename to buildSrc/plugins/src/main/kotlin/androidx/build/AndroidXLayoutlibPlugin.kt
index 98fc29f..f6cd2a5 100644
--- a/buildSrc/plugins/src/main/kotlin/androidx/build/paparazzi/AndroidXPaparazziPlugin.kt
+++ b/buildSrc/plugins/src/main/kotlin/androidx/build/AndroidXLayoutlibPlugin.kt
@@ -14,9 +14,8 @@
  * limitations under the License.
  */
 
-package androidx.build.paparazzi
+package androidx.build
 
-import androidx.build.getSupportRootFolder
 import org.gradle.api.Plugin
 import org.gradle.api.Project
 
@@ -25,12 +24,12 @@
  *
  * The actual implementation is in AndroidXPaparazziImplPlugin.
  */
-class AndroidXPaparazziPlugin : Plugin<Project> {
+class AndroidXLayoutlibPlugin : Plugin<Project> {
     override fun apply(project: Project) {
         val supportRoot = project.getSupportRootFolder()
         project.apply(
             mapOf(
-                "from" to "$supportRoot/buildSrc/apply/applyAndroidXPaparazziImplPlugin.gradle"
+                "from" to "$supportRoot/buildSrc/apply/applyAndroidXLayoutlibImplPlugin.gradle"
             )
         )
     }
diff --git a/buildSrc/plugins/src/main/resources/META-INF/gradle-plugins/AndroidXPaparazziPlugin.properties b/buildSrc/plugins/src/main/resources/META-INF/gradle-plugins/AndroidXLayoutlibPlugin.properties
similarity index 89%
rename from buildSrc/plugins/src/main/resources/META-INF/gradle-plugins/AndroidXPaparazziPlugin.properties
rename to buildSrc/plugins/src/main/resources/META-INF/gradle-plugins/AndroidXLayoutlibPlugin.properties
index b95a130..9d8b362 100644
--- a/buildSrc/plugins/src/main/resources/META-INF/gradle-plugins/AndroidXPaparazziPlugin.properties
+++ b/buildSrc/plugins/src/main/resources/META-INF/gradle-plugins/AndroidXLayoutlibPlugin.properties
@@ -14,4 +14,4 @@
 # limitations under the License.
 #
 
-implementation-class=androidx.build.paparazzi.AndroidXPaparazziPlugin
+implementation-class=androidx.build.AndroidXLayoutlibPlugin
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/LintConfiguration.kt b/buildSrc/private/src/main/kotlin/androidx/build/LintConfiguration.kt
index 0a8392a..26c4b7d 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/LintConfiguration.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/LintConfiguration.kt
@@ -202,9 +202,6 @@
         // Broken in 7.0.0-alpha15 due to b/180408990
         disable.add("RestrictedApi")
 
-        // Reenable after upgradingto 7.1.0-beta01
-        disable.add("SupportAnnotationUsage")
-
         // Provide stricter enforcement for project types intended to run on a device.
         if (extension.type.compilationTarget == CompilationTarget.DEVICE) {
             fatal.add("Assert")
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/paparazzi/AndroidXPaparazziImplPlugin.kt b/buildSrc/private/src/main/kotlin/androidx/build/layoutlib/AndroidXLayoutlibImplPlugin.kt
similarity index 96%
rename from buildSrc/private/src/main/kotlin/androidx/build/paparazzi/AndroidXPaparazziImplPlugin.kt
rename to buildSrc/private/src/main/kotlin/androidx/build/layoutlib/AndroidXLayoutlibImplPlugin.kt
index 778810b..f4bff37 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/paparazzi/AndroidXPaparazziImplPlugin.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/layoutlib/AndroidXLayoutlibImplPlugin.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.build.paparazzi
+package androidx.build.layoutlib
 
 import androidx.build.OperatingSystem
 import androidx.build.SupportConfig.COMPILE_SDK_VERSION
@@ -38,7 +38,7 @@
 /**
  * Configures screenshot testing using Paparazzi for AndroidX projects.
  */
-class AndroidXPaparazziImplPlugin : Plugin<Project> {
+class AndroidXLayoutlibImplPlugin : Plugin<Project> {
     override fun apply(project: Project) {
         val paparazziNative = project.createUnzippedPaparazziNativeDependency()
         project.afterEvaluate {
@@ -121,7 +121,7 @@
 
     private companion object {
         /** Package name of the test library, used to namespace system properties */
-        const val PACKAGE_NAME = "androidx.test.screenshot.paparazzi"
+        const val PACKAGE_NAME = "androidx.test.screenshot.layoutlib"
 
         /** Artifact type attribute for unzipped Paparazzi layoutlib unzipped artifacts */
         const val UNZIPPED_PAPARAZZI_NATIVE = "unzipped-paparazzi-native"
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/paparazzi/UnzipPaparazziNativeTransform.kt b/buildSrc/private/src/main/kotlin/androidx/build/layoutlib/UnzipPaparazziNativeTransform.kt
similarity index 98%
rename from buildSrc/private/src/main/kotlin/androidx/build/paparazzi/UnzipPaparazziNativeTransform.kt
rename to buildSrc/private/src/main/kotlin/androidx/build/layoutlib/UnzipPaparazziNativeTransform.kt
index 0af7ef7..5ba6ef5 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/paparazzi/UnzipPaparazziNativeTransform.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/layoutlib/UnzipPaparazziNativeTransform.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.build.paparazzi
+package androidx.build.layoutlib
 
 import java.util.zip.ZipInputStream
 import org.gradle.api.artifacts.transform.CacheableTransform
diff --git a/buildSrc/private/src/main/kotlin/androidx/build/studio/StudioTask.kt b/buildSrc/private/src/main/kotlin/androidx/build/studio/StudioTask.kt
index 344be48..c0ca9a5 100644
--- a/buildSrc/private/src/main/kotlin/androidx/build/studio/StudioTask.kt
+++ b/buildSrc/private/src/main/kotlin/androidx/build/studio/StudioTask.kt
@@ -198,8 +198,8 @@
         check(vmOptions.exists()) {
             "Invalid Studio vm options file location: ${vmOptions.canonicalPath}"
         }
-        val processBuilder = ProcessBuilder().apply {
-            redirectErrorStream(true)
+        ProcessBuilder().apply {
+            inheritIO()
             with(platformUtilities) { command(launchCommandArguments) }
 
             val additionalStudioEnvironmentProperties = mapOf(
@@ -218,14 +218,7 @@
 
             // Append to the existing environment variables set by gradlew and the user.
             environment().putAll(additionalStudioEnvironmentProperties)
-        }
-        val process = processBuilder.start()
-        process.waitFor()
-        // Can't just use inheritIO due to https://github.com/gradle/gradle/issues/16719
-        val outputText = process.stdOutText()
-        println(outputText)
-        check(process.exitValue() == 0) {
-            "Studio failed to start:\n$outputText"
+            start()
         }
     }
 
@@ -319,10 +312,3 @@
     override val vmOptions
         get() = supportRootFolder.resolve("playground-common/studio.vmoptions")
 }
-
-/**
- * Returns the contents of the process's standard output stream as a string
- */
-fun Process.stdOutText(): String {
-    return inputStream.bufferedReader().use { it.readText() }
-}
diff --git a/buildSrc/private/src/main/resources/META-INF/gradle-plugins/AndroidXPaparazziImplPlugin.properties b/buildSrc/private/src/main/resources/META-INF/gradle-plugins/AndroidXPaparazziImplPlugin.properties
index 0ea8b07..eacaf4a 100644
--- a/buildSrc/private/src/main/resources/META-INF/gradle-plugins/AndroidXPaparazziImplPlugin.properties
+++ b/buildSrc/private/src/main/resources/META-INF/gradle-plugins/AndroidXPaparazziImplPlugin.properties
@@ -14,4 +14,4 @@
 # limitations under the License.
 #
 
-implementation-class=androidx.build.paparazzi.AndroidXPaparazziImplPlugin
+implementation-class=androidx.build.layoutlib.AndroidXLayoutlibImplPlugin
diff --git a/busytown/androidx-studio-integration.sh b/busytown/androidx-studio-integration.sh
index 0165dd4..ea45943 100755
--- a/busytown/androidx-studio-integration.sh
+++ b/busytown/androidx-studio-integration.sh
@@ -6,6 +6,9 @@
 $SCRIPT_PATH/impl/build-studio-and-androidx.sh \
   -x lint \
   -x lintDebug \
+  -x lintWithExpandProjectionDebug \
+  -x lintWithoutExpandProjectionDebug \
+  -x lintWithNullAwareTypeConverterDebug \
   -x lintReport \
   -x verifyDependencyVersions \
   listTaskOutputs \
diff --git a/camera/camera-camera2-pipe-integration/api/current.txt b/camera/camera-camera2-pipe-integration/api/current.txt
new file mode 100644
index 0000000..54b5db2
--- /dev/null
+++ b/camera/camera-camera2-pipe-integration/api/current.txt
@@ -0,0 +1,9 @@
+// Signature format: 4.0
+package androidx.camera.camera2.pipe.integration {
+
+  @RequiresApi(21) public final class CameraPipeConfig {
+    method public static androidx.camera.core.CameraXConfig defaultConfig();
+  }
+
+}
+
diff --git a/camera/camera-camera2-pipe-integration/api/public_plus_experimental_current.txt b/camera/camera-camera2-pipe-integration/api/public_plus_experimental_current.txt
new file mode 100644
index 0000000..90f98dc
--- /dev/null
+++ b/camera/camera-camera2-pipe-integration/api/public_plus_experimental_current.txt
@@ -0,0 +1,53 @@
+// Signature format: 4.0
+package androidx.camera.camera2.pipe.integration {
+
+  @RequiresApi(21) public final class CameraPipeConfig {
+    method public static androidx.camera.core.CameraXConfig defaultConfig();
+  }
+
+}
+
+package androidx.camera.camera2.pipe.integration.interop {
+
+  @RequiresApi(21) @androidx.camera.camera2.pipe.integration.interop.ExperimentalCamera2Interop public final class Camera2CameraControl {
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> addCaptureRequestOptions(androidx.camera.camera2.pipe.integration.interop.CaptureRequestOptions bundle);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> clearCaptureRequestOptions();
+    method public static androidx.camera.camera2.pipe.integration.interop.Camera2CameraControl from(androidx.camera.core.CameraControl cameraControl);
+    method public androidx.camera.camera2.pipe.integration.interop.CaptureRequestOptions getCaptureRequestOptions();
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void> setCaptureRequestOptions(androidx.camera.camera2.pipe.integration.interop.CaptureRequestOptions bundle);
+  }
+
+  @RequiresApi(21) @androidx.camera.camera2.pipe.integration.interop.ExperimentalCamera2Interop public final class Camera2CameraInfo {
+    method public static androidx.camera.camera2.pipe.integration.interop.Camera2CameraInfo from(androidx.camera.core.CameraInfo cameraInfo);
+    method public <T> T? getCameraCharacteristic(android.hardware.camera2.CameraCharacteristics.Key<T> key);
+    method public String getCameraId();
+  }
+
+  @RequiresApi(21) @androidx.camera.camera2.pipe.integration.interop.ExperimentalCamera2Interop public final class Camera2Interop {
+  }
+
+  @RequiresApi(21) public static final class Camera2Interop.Extender<T> {
+    ctor public Camera2Interop.Extender(androidx.camera.core.ExtendableBuilder<T> baseBuilder);
+    method public <ValueT> androidx.camera.camera2.pipe.integration.interop.Camera2Interop.Extender<T> setCaptureRequestOption(android.hardware.camera2.CaptureRequest.Key<ValueT> key, ValueT? value);
+    method public androidx.camera.camera2.pipe.integration.interop.Camera2Interop.Extender<T> setDeviceStateCallback(android.hardware.camera2.CameraDevice.StateCallback stateCallback);
+    method @RequiresApi(28) public androidx.camera.camera2.pipe.integration.interop.Camera2Interop.Extender<T> setPhysicalCameraId(String cameraId);
+    method public androidx.camera.camera2.pipe.integration.interop.Camera2Interop.Extender<T> setSessionCaptureCallback(android.hardware.camera2.CameraCaptureSession.CaptureCallback captureCallback);
+    method public androidx.camera.camera2.pipe.integration.interop.Camera2Interop.Extender<T> setSessionStateCallback(android.hardware.camera2.CameraCaptureSession.StateCallback stateCallback);
+  }
+
+  @RequiresApi(21) @androidx.camera.camera2.pipe.integration.interop.ExperimentalCamera2Interop public class CaptureRequestOptions {
+    method public <ValueT> ValueT? getCaptureRequestOption(android.hardware.camera2.CaptureRequest.Key<ValueT> key);
+  }
+
+  @RequiresApi(21) public static final class CaptureRequestOptions.Builder implements androidx.camera.core.ExtendableBuilder<androidx.camera.camera2.pipe.integration.interop.CaptureRequestOptions> {
+    ctor public CaptureRequestOptions.Builder();
+    method public androidx.camera.camera2.pipe.integration.interop.CaptureRequestOptions build();
+    method public <ValueT> androidx.camera.camera2.pipe.integration.interop.CaptureRequestOptions.Builder clearCaptureRequestOption(android.hardware.camera2.CaptureRequest.Key<ValueT> key);
+    method public <ValueT> androidx.camera.camera2.pipe.integration.interop.CaptureRequestOptions.Builder setCaptureRequestOption(android.hardware.camera2.CaptureRequest.Key<ValueT> key, ValueT? value);
+  }
+
+  @kotlin.RequiresOptIn @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public @interface ExperimentalCamera2Interop {
+  }
+
+}
+
diff --git a/camera/camera-camera2-pipe-integration/api/res-current.txt b/camera/camera-camera2-pipe-integration/api/res-current.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/camera/camera-camera2-pipe-integration/api/res-current.txt
diff --git a/camera/camera-camera2-pipe-integration/api/restricted_current.txt b/camera/camera-camera2-pipe-integration/api/restricted_current.txt
new file mode 100644
index 0000000..54b5db2
--- /dev/null
+++ b/camera/camera-camera2-pipe-integration/api/restricted_current.txt
@@ -0,0 +1,9 @@
+// Signature format: 4.0
+package androidx.camera.camera2.pipe.integration {
+
+  @RequiresApi(21) public final class CameraPipeConfig {
+    method public static androidx.camera.core.CameraXConfig defaultConfig();
+  }
+
+}
+
diff --git a/camera/camera-camera2-pipe-integration/build.gradle b/camera/camera-camera2-pipe-integration/build.gradle
index 7806882..798dd71 100644
--- a/camera/camera-camera2-pipe-integration/build.gradle
+++ b/camera/camera-camera2-pipe-integration/build.gradle
@@ -102,7 +102,7 @@
 
 androidx {
     name = "Jetpack Camera Camera Pipe Integration Library"
-    publish = Publish.NONE
+    publish = Publish.SNAPSHOT_AND_RELEASE
     mavenGroup = LibraryGroups.CAMERA
     mavenVersion = LibraryVersions.CAMERA_PIPE
     inceptionYear = "2020"
diff --git a/camera/camera-camera2-pipe-integration/lint-baseline.xml b/camera/camera-camera2-pipe-integration/lint-baseline.xml
new file mode 100644
index 0000000..76fc250
--- /dev/null
+++ b/camera/camera-camera2-pipe-integration/lint-baseline.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
+
+    <issue
+        id="SupportAnnotationUsage"
+        message="Did you mean `@get:VisibleForTesting`? Without `get:` this annotates the constructor parameter itself instead of the associated getter."
+        errorLine1="    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) internal val requestListener:"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/camera/camera2/pipe/integration/interop/Camera2CameraControl.kt"/>
+    </issue>
+
+</issues>
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/CameraPipeConfig.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/CameraPipeConfig.kt
index 0064af2..ff1ec6d 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/CameraPipeConfig.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/CameraPipeConfig.kt
@@ -25,16 +25,22 @@
  * Convenience class for generating a pre-populated CameraPipe based [CameraXConfig].
  */
 @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
-object CameraPipeConfig {
+class CameraPipeConfig private constructor() {
     /**
-     * Creates a [CameraXConfig] containing a default CameraPipe implementation for CameraX.
+     * @hide
      */
-    @JvmStatic
-    fun defaultConfig(): CameraXConfig {
-        return CameraXConfig.Builder()
-            .setCameraFactoryProvider(::CameraFactoryAdapter)
-            .setDeviceSurfaceManagerProvider(::CameraSurfaceAdapter)
-            .setUseCaseConfigFactoryProvider(::CameraUseCaseAdapter)
-            .build()
+    companion object {
+
+        /**
+         * Creates a [CameraXConfig] containing a default CameraPipe implementation for CameraX.
+         */
+        @JvmStatic
+        fun defaultConfig(): CameraXConfig {
+            return CameraXConfig.Builder()
+                .setCameraFactoryProvider(::CameraFactoryAdapter)
+                .setDeviceSurfaceManagerProvider(::CameraSurfaceAdapter)
+                .setUseCaseConfigFactoryProvider(::CameraUseCaseAdapter)
+                .build()
+        }
     }
 }
\ No newline at end of file
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/config/CameraConfig.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/config/CameraConfig.kt
index 402b40c..bb7b78d 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/config/CameraConfig.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/config/CameraConfig.kt
@@ -19,6 +19,7 @@
 package androidx.camera.camera2.pipe.integration.config
 
 import androidx.annotation.RequiresApi
+import androidx.annotation.VisibleForTesting
 import androidx.camera.camera2.pipe.CameraId
 import androidx.camera.camera2.pipe.CameraMetadata
 import androidx.camera.camera2.pipe.CameraPipe
@@ -30,6 +31,7 @@
 import androidx.camera.camera2.pipe.integration.compat.ZoomCompat
 import androidx.camera.camera2.pipe.integration.impl.CameraPipeCameraProperties
 import androidx.camera.camera2.pipe.integration.impl.CameraProperties
+import androidx.camera.camera2.pipe.integration.impl.ComboRequestListener
 import androidx.camera.camera2.pipe.integration.impl.EvCompControl
 import androidx.camera.camera2.pipe.integration.impl.FlashControl
 import androidx.camera.camera2.pipe.integration.impl.TorchControl
@@ -45,11 +47,11 @@
 import dagger.Module
 import dagger.Provides
 import dagger.Subcomponent
+import javax.inject.Scope
 import kotlinx.coroutines.CoroutineName
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.SupervisorJob
 import kotlinx.coroutines.asCoroutineDispatcher
-import javax.inject.Scope
 
 @Scope
 annotation class CameraScope
@@ -64,7 +66,6 @@
         EvCompControl.Bindings::class,
         FlashControl.Bindings::class,
         TorchControl.Bindings::class,
-        Camera2CameraControl.Bindings::class,
         Camera2CameraControlCompat.Bindings::class,
     ],
     subcomponents = [UseCaseCameraComponent::class]
@@ -95,6 +96,19 @@
             )
         }
 
+        @CameraScope
+        @Provides
+        fun provideCamera2CameraControl(
+            compat: Camera2CameraControlCompat,
+            threads: UseCaseThreads,
+            @VisibleForTesting
+            requestListener: ComboRequestListener,
+        ) = Camera2CameraControl.create(
+            compat,
+            threads,
+            requestListener
+        )
+
         @Provides
         fun provideCameraMetadata(cameraPipe: CameraPipe, config: CameraConfig): CameraMetadata =
             cameraPipe.cameras().awaitMetadata(config.cameraId)
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/interop/Camera2CameraControl.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/interop/Camera2CameraControl.kt
index af52eda..35d0833 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/interop/Camera2CameraControl.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/interop/Camera2CameraControl.kt
@@ -22,7 +22,6 @@
 import androidx.camera.camera2.pipe.integration.adapter.CameraControlAdapter
 import androidx.camera.camera2.pipe.integration.adapter.asListenableFuture
 import androidx.camera.camera2.pipe.integration.compat.Camera2CameraControlCompat
-import androidx.camera.camera2.pipe.integration.config.CameraScope
 import androidx.camera.camera2.pipe.integration.impl.ComboRequestListener
 import androidx.camera.camera2.pipe.integration.impl.UseCaseCamera
 import androidx.camera.camera2.pipe.integration.impl.UseCaseCameraControl
@@ -31,10 +30,6 @@
 import androidx.camera.core.impl.utils.futures.Futures
 import androidx.core.util.Preconditions
 import com.google.common.util.concurrent.ListenableFuture
-import dagger.Binds
-import dagger.Module
-import dagger.multibindings.IntoSet
-import javax.inject.Inject
 
 /**
  * An class that provides ability to interoperate with the [android.hardware.camera2] APIs.
@@ -48,13 +43,14 @@
  * unexpected behavior depends on the options being applied.
  */
 @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
-@CameraScope
+@SuppressWarnings("HiddenSuperclass")
 @ExperimentalCamera2Interop
-class Camera2CameraControl @Inject constructor(
+class Camera2CameraControl
+private constructor(
     private val compat: Camera2CameraControlCompat,
     private val threads: UseCaseThreads,
-    @VisibleForTesting
-    internal val requestListener: ComboRequestListener,
+    @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) internal val requestListener:
+    ComboRequestListener,
 ) : UseCaseCameraControl {
 
     private var _useCaseCamera: UseCaseCamera? = null
@@ -105,6 +101,7 @@
      * options are set or camera is closed before the current request completes.
      * Cancelling the ListenableFuture is a no-op.
      */
+    @SuppressWarnings("AsyncSuffixFuture")
     fun setCaptureRequestOptions(bundle: CaptureRequestOptions): ListenableFuture<Void?> {
         compat.clearRequestOption()
         compat.addRequestOption(bundle)
@@ -128,6 +125,7 @@
      * completely. The future fails with [CameraControl.OperationCanceledException] if newer
      * options are set or camera is closed before the current request completes.
      */
+    @SuppressWarnings("AsyncSuffixFuture")
     fun addCaptureRequestOptions(
         bundle: CaptureRequestOptions
     ): ListenableFuture<Void?> {
@@ -146,15 +144,14 @@
     fun getCaptureRequestOptions(): CaptureRequestOptions = compat.getRequestOption()
 
     /**
-     * Clears all capture request options.
+     * Clears all capture request options that is currently applied by the [Camera2CameraControl].
      *
      * @return a [ListenableFuture] which completes when the repeating
      * [android.hardware.camera2.CaptureResult] shows the options have be submitted
      * completely. The future fails with [CameraControl.OperationCanceledException] if newer
      * options are set or camera is closed before the current request completes.
-     * @hide
      */
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    @SuppressWarnings("AsyncSuffixFuture")
     fun clearCaptureRequestOptions(): ListenableFuture<Void?> {
         compat.clearRequestOption()
         return updateAsync("clearCaptureRequestOptions")
@@ -168,14 +165,6 @@
     /**
      * @hide
      */
-    @RestrictTo(RestrictTo.Scope.LIBRARY)
-    @Module
-    abstract class Bindings {
-        @Binds
-        @IntoSet
-        abstract fun provideControls(control: Camera2CameraControl): UseCaseCameraControl
-    }
-
     companion object {
 
         /**
@@ -203,5 +192,24 @@
             )
             return (cameraControl as CameraControlAdapter).camera2cameraControl
         }
+
+        /**
+         * This is the workaround to prevent constructor from being added to public API.
+         *
+         * @hide
+         */
+        @RestrictTo(RestrictTo.Scope.LIBRARY)
+        @JvmStatic
+        fun create(
+            compat: Camera2CameraControlCompat,
+            threads: UseCaseThreads,
+            requestListener: ComboRequestListener,
+        ): Camera2CameraControl {
+            return Camera2CameraControl(
+                compat,
+                threads,
+                requestListener
+            )
+        }
     }
 }
\ No newline at end of file
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/interop/Camera2CameraInfo.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/interop/Camera2CameraInfo.kt
new file mode 100644
index 0000000..381c7dc
--- /dev/null
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/interop/Camera2CameraInfo.kt
@@ -0,0 +1,89 @@
+/*
+ * Copyright 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 androidx.camera.camera2.pipe.integration.interop
+
+import android.hardware.camera2.CameraCharacteristics
+import androidx.annotation.RequiresApi
+import androidx.camera.core.CameraInfo
+
+/**
+ * An interface for retrieving Camera2-related camera information.
+ */
+@ExperimentalCamera2Interop
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+class Camera2CameraInfo private constructor() {
+
+    /**
+     * Gets a camera characteristic value.
+     *
+     * The characteristic value is the same as the value in the [CameraCharacteristics]
+     * that would be obtained from
+     * [android.hardware.camera2.CameraManager.getCameraCharacteristics].
+     *
+     * @param <T> The type of the characteristic value.
+     * @param key The [CameraCharacteristics.Key] of the characteristic.
+     * @return the value of the characteristic.
+    </T> */
+    fun <T> getCameraCharacteristic(
+        @Suppress("UNUSED_PARAMETER") key: CameraCharacteristics.Key<T>
+    ): T? {
+        TODO()
+    }
+
+    /**
+     * Gets the string camera ID.
+     *
+     *
+     * The camera ID is the same as the camera ID that would be obtained from
+     * [android.hardware.camera2.CameraManager.getCameraIdList]. The ID that is retrieved
+     * is not static and can change depending on the current internal configuration of the
+     * [androidx.camera.core.Camera] from which the CameraInfo was retrieved.
+     *
+     * The Camera is a logical camera which can be backed by multiple
+     * [android.hardware.camera2.CameraDevice]. However, only one CameraDevice is active at
+     * one time. When the CameraDevice changes then the camera id will change.
+     *
+     * @return the camera ID.
+     * @throws IllegalStateException if the camera info does not contain the camera 2 camera ID
+     * (e.g., if CameraX was not initialized with a
+     * [androidx.camera.camera2.Camera2Config]).
+     */
+
+    fun getCameraId(): String {
+        TODO()
+    }
+
+    /**
+     * @hide
+     */
+    companion object {
+
+        /**
+         * Gets the [Camera2CameraInfo] from a [CameraInfo].
+         *
+         * @param cameraInfo The [CameraInfo] to get from.
+         * @return The camera information with Camera2 implementation.
+         * @throws IllegalArgumentException if the camera info does not contain the camera2 information
+         * (e.g., if CameraX was not initialized with a
+         * [androidx.camera.camera2.Camera2Config]).
+         */
+        @JvmStatic
+        fun from(@Suppress("UNUSED_PARAMETER") cameraInfo: CameraInfo): Camera2CameraInfo {
+            TODO()
+        }
+    }
+}
\ No newline at end of file
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/interop/Camera2Interop.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/interop/Camera2Interop.kt
index 96b7b41..7381d3e 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/interop/Camera2Interop.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/interop/Camera2Interop.kt
@@ -46,6 +46,7 @@
      * @property baseBuilder The builder being extended.
      * @constructor Creates an Extender that can be used to add Camera2 options to another Builder.
      */
+    @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
     class Extender<T> (private var baseBuilder: ExtendableBuilder<T>) {
 
         /**
@@ -174,5 +175,31 @@
             )
             return this
         }
+
+        /**
+         * Set the ID of the physical camera to get output from.
+         *
+         * In the case one logical camera is made up of multiple physical cameras, this call
+         * forces the physical camera with the specified camera ID to produce image.
+         *
+         * The valid physical camera IDs can be queried by `CameraCharacteristics
+         * .getPhysicalCameraIds` on API &gt;= 28. Passing in an invalid physical camera ID will
+         * be ignored.
+         *
+         * On API &lt;= 27, the physical camera ID will be ignored since logical camera is not
+         * supported on these API levels.
+         *
+         * Currently it doesn't support binding use cases with different physical camera IDs. If
+         * use cases with different physical camera IDs are bound at the same time, an
+         * [IllegalArgumentException] will be thrown.
+         *
+         * @param cameraId The desired camera ID.
+         * @return The current Extender.
+         */
+
+        @RequiresApi(28)
+        fun setPhysicalCameraId(@Suppress("UNUSED_PARAMETER") cameraId: String): Extender<T> {
+            TODO()
+        }
     }
 }
\ No newline at end of file
diff --git a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/interop/CaptureRequestOptions.kt b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/interop/CaptureRequestOptions.kt
index 05cda0a..2cf815d 100644
--- a/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/interop/CaptureRequestOptions.kt
+++ b/camera/camera-camera2-pipe-integration/src/main/java/androidx/camera/camera2/pipe/integration/interop/CaptureRequestOptions.kt
@@ -36,7 +36,18 @@
  */
 @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
 @ExperimentalCamera2Interop
-open class CaptureRequestOptions(private val config: Config) : ReadableConfig {
+
+open class CaptureRequestOptions private constructor(
+    private val config: Config,
+    @Suppress("UNUSED_PARAMETER") unused: Boolean
+) :
+    ReadableConfig {
+
+    /**
+     * @hide
+     */
+    @RestrictTo(RestrictTo.Scope.LIBRARY)
+    constructor(config: Config) : this(config, false)
 
     /**
      * Returns a value for the given [CaptureRequest.Key] or null if it hasn't been set.
@@ -46,7 +57,7 @@
      * @return The stored value or null if the value does not exist in this
      * configuration.
      */
-    fun <ValueT> getCaptureRequestOption(key: CaptureRequest.Key<ValueT>): ValueT? {
+    open fun <ValueT> getCaptureRequestOption(key: CaptureRequest.Key<ValueT>): ValueT? {
         // Type should have been only set via Builder#setCaptureRequestOption()
         @Suppress("UNCHECKED_CAST")
         val opt = key.createCaptureRequestOption() as Config.Option<ValueT>
@@ -88,9 +99,13 @@
     /**
      * Builder for creating [CaptureRequestOptions] instance.
      */
+    @RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
     class Builder : ExtendableBuilder<CaptureRequestOptions?> {
         private val mutableOptionsBundle = MutableOptionsBundle.create()
 
+        /**
+         * @hide
+         */
         companion object {
             /**
              * Generates a Builder from another Config object.
diff --git a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/adapter/SupportedSurfaceCombinationTest.kt b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/adapter/SupportedSurfaceCombinationTest.kt
index b27be3a..84788a9 100644
--- a/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/adapter/SupportedSurfaceCombinationTest.kt
+++ b/camera/camera-camera2-pipe-integration/src/test/java/androidx/camera/camera2/pipe/integration/adapter/SupportedSurfaceCombinationTest.kt
@@ -31,7 +31,7 @@
 import android.view.WindowManager
 import androidx.camera.camera2.pipe.CameraId
 import androidx.camera.camera2.pipe.CameraMetadata
-import androidx.camera.camera2.pipe.integration.CameraPipeConfig.defaultConfig
+import androidx.camera.camera2.pipe.integration.CameraPipeConfig
 import androidx.camera.camera2.pipe.integration.adapter.GuaranteedConfigurationsUtil.getFullSupportedCombinationList
 import androidx.camera.camera2.pipe.integration.adapter.GuaranteedConfigurationsUtil.getLegacySupportedCombinationList
 import androidx.camera.camera2.pipe.integration.adapter.GuaranteedConfigurationsUtil.getLevel3SupportedCombinationList
@@ -2624,7 +2624,7 @@
             .thenReturn(cameraDevicesWithCameraMetaData)
         cameraFactory!!.cameraManager = mockCameraAppComponent
         val cameraXConfig = CameraXConfig.Builder.fromConfig(
-            defaultConfig()
+            CameraPipeConfig.defaultConfig()
         )
             .setDeviceSurfaceManagerProvider { context: Context?, _: Any?, _: Set<String?>? ->
                 CameraSurfaceAdapter(
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CameraController.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CameraController.kt
index 4ac4bba..632db76 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CameraController.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/Camera2CameraController.kt
@@ -50,7 +50,7 @@
 ) : CameraController {
     private var closed = false
     private var currentCamera: VirtualCamera? = null
-    private var currentSession: VirtualSessionState? = null
+    private var currentSession: CaptureSessionState? = null
     private var currentSurfaceMap: Map<StreamId, Surface>? = null
 
     override fun start() {
@@ -67,7 +67,7 @@
             check(currentSession == null)
 
             currentCamera = camera
-            val session = VirtualSessionState(
+            val session = CaptureSessionState(
                 graphListener,
                 captureSessionFactory,
                 captureSequenceProcessorFactory,
@@ -86,7 +86,7 @@
 
     override fun stop() {
         val camera: VirtualCamera?
-        val session: VirtualSessionState?
+        val session: CaptureSessionState?
         synchronized(this) {
             if (closed) {
                 return
@@ -107,7 +107,7 @@
 
     override fun close() {
         val camera: VirtualCamera?
-        val session: VirtualSessionState?
+        val session: CaptureSessionState?
         synchronized(this) {
             if (closed) {
                 return
@@ -139,7 +139,7 @@
 
     private suspend fun bindSessionToCamera() {
         val camera: VirtualCamera?
-        val session: VirtualSessionState?
+        val session: CaptureSessionState?
 
         synchronized(this) {
             camera = currentCamera
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CaptureSessionFactory.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CaptureSessionFactory.kt
index 275b27a..5c79c00 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CaptureSessionFactory.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CaptureSessionFactory.kt
@@ -46,7 +46,7 @@
     fun create(
         cameraDevice: CameraDeviceWrapper,
         surfaces: Map<StreamId, Surface>,
-        virtualSessionState: VirtualSessionState
+        captureSessionState: CaptureSessionState
     ): Map<StreamId, OutputConfigurationWrapper>
 }
 
@@ -99,19 +99,19 @@
     override fun create(
         cameraDevice: CameraDeviceWrapper,
         surfaces: Map<StreamId, Surface>,
-        virtualSessionState: VirtualSessionState
+        captureSessionState: CaptureSessionState
     ): Map<StreamId, OutputConfigurationWrapper> {
         try {
             cameraDevice.createCaptureSession(
                 surfaces.map { it.value },
-                virtualSessionState,
+                captureSessionState,
                 threads.camera2Handler
             )
         } catch (e: Throwable) {
             Log.warn {
-                "Failed to create capture session from $cameraDevice for $virtualSessionState!"
+                "Failed to create capture session from $cameraDevice for $captureSessionState!"
             }
-            virtualSessionState.disconnect()
+            captureSessionState.disconnect()
         }
         return emptyMap()
     }
@@ -125,7 +125,7 @@
     override fun create(
         cameraDevice: CameraDeviceWrapper,
         surfaces: Map<StreamId, Surface>,
-        virtualSessionState: VirtualSessionState
+        captureSessionState: CaptureSessionState
     ): Map<StreamId, OutputConfigurationWrapper> {
         if (graphConfig.input != null) {
             try {
@@ -137,28 +137,28 @@
                         outputConfig.format.value
                     ),
                     surfaces.map { it.value },
-                    virtualSessionState,
+                    captureSessionState,
                     threads.camera2Handler
                 )
             } catch (e: Throwable) {
                 Log.warn {
                     "Failed to create reprocessable captures session from $cameraDevice for" +
-                        " $virtualSessionState!"
+                        " $captureSessionState!"
                 }
-                virtualSessionState.disconnect()
+                captureSessionState.disconnect()
             }
         } else {
             try {
                 cameraDevice.createCaptureSession(
                     surfaces.map { it.value },
-                    virtualSessionState,
+                    captureSessionState,
                     threads.camera2Handler
                 )
             } catch (e: Throwable) {
                 Log.warn {
-                    "Failed to create captures session from $cameraDevice for $virtualSessionState!"
+                    "Failed to create captures session from $cameraDevice for $captureSessionState!"
                 }
-                virtualSessionState.disconnect()
+                captureSessionState.disconnect()
             }
         }
         return emptyMap()
@@ -172,7 +172,7 @@
     override fun create(
         cameraDevice: CameraDeviceWrapper,
         surfaces: Map<StreamId, Surface>,
-        virtualSessionState: VirtualSessionState
+        captureSessionState: CaptureSessionState
     ): Map<StreamId, OutputConfigurationWrapper> {
         TODO("Implement this")
     }
@@ -187,7 +187,7 @@
     override fun create(
         cameraDevice: CameraDeviceWrapper,
         surfaces: Map<StreamId, Surface>,
-        virtualSessionState: VirtualSessionState
+        captureSessionState: CaptureSessionState
     ): Map<StreamId, OutputConfigurationWrapper> {
         val outputs = buildOutputConfigurations(
             graphConfig,
@@ -203,7 +203,7 @@
             if (graphConfig.input == null) {
                 cameraDevice.createCaptureSessionByOutputConfigurations(
                     outputs.all,
-                    virtualSessionState,
+                    captureSessionState,
                     threads.camera2Handler
                 )
             } else {
@@ -215,15 +215,15 @@
                         outputConfig.format.value
                     ),
                     outputs.all,
-                    virtualSessionState,
+                    captureSessionState,
                     threads.camera2Handler
                 )
             }
         } catch (e: Throwable) {
             Log.warn {
-                "Failed to create capture session from $cameraDevice for $virtualSessionState!"
+                "Failed to create capture session from $cameraDevice for $captureSessionState!"
             }
-            virtualSessionState.disconnect()
+            captureSessionState.disconnect()
         }
         return emptyMap()
     }
@@ -238,7 +238,7 @@
     override fun create(
         cameraDevice: CameraDeviceWrapper,
         surfaces: Map<StreamId, Surface>,
-        virtualSessionState: VirtualSessionState
+        captureSessionState: CaptureSessionState
     ): Map<StreamId, OutputConfigurationWrapper> {
 
         val operatingMode =
@@ -271,7 +271,7 @@
             input,
             outputs.all,
             threads.camera2Executor,
-            virtualSessionState,
+            captureSessionState,
             graphConfig.sessionTemplate.value,
             graphConfig.sessionParameters
         )
@@ -280,9 +280,9 @@
             cameraDevice.createCaptureSession(sessionConfig)
         } catch (e: Throwable) {
             Log.warn {
-                "Failed to create capture session from $cameraDevice for $virtualSessionState!"
+                "Failed to create capture session from $cameraDevice for $captureSessionState!"
             }
-            virtualSessionState.disconnect()
+            captureSessionState.disconnect()
         }
         return outputs.deferred
     }
diff --git a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/VirtualSessionState.kt b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CaptureSessionState.kt
similarity index 80%
rename from camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/VirtualSessionState.kt
rename to camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CaptureSessionState.kt
index 8f6576d..0b3963c 100644
--- a/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/VirtualSessionState.kt
+++ b/camera/camera-camera2-pipe/src/main/java/androidx/camera/camera2/pipe/compat/CaptureSessionState.kt
@@ -18,6 +18,7 @@
 
 package androidx.camera.camera2.pipe.compat
 
+import android.hardware.camera2.CameraCaptureSession
 import android.view.Surface
 import androidx.annotation.GuardedBy
 import androidx.annotation.RequiresApi
@@ -36,24 +37,33 @@
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.launch
 
-internal val virtualSessionDebugIds = atomic(0)
+internal val captureSessionDebugIds = atomic(0)
 
 /**
- * This class encapsulates the state and logic required to create and start a CaptureSession.
+ * This class encapsulates the state and logic required to manage the lifecycle of a single Camera2
+ * [CameraCaptureSession], and subsequently wrapping it into a [GraphRequestProcessor] and passing
+ * it to the [GraphListener].
  *
- * After being created, it will wait for a valid CameraDevice and Surfaces that it will use
- * to create and start the capture session. Calling shutdown or disconnect will release the current
- * session (if one has been configured), and prevent / close any session that was in the process of
- * being created when shutdown / disconnect was called.
+ * After this object is created, it waits for:
+ *  - A valid CameraDevice via [cameraDevice]
+ *  - A valid map of Surfaces via [configureSurfaceMap]
+ * Once these objects are available, it will create the [CameraCaptureSession].
+ *
+ * If at any time this object is put into a COSING or CLOSED state the session will either never be
+ * created, or if the session has already been created, it will be de-referenced and ignored. This
+ * object goes into a CLOSING or CLOSED state if disconnect or shutdown is called, or if the created
+ * [CameraCaptureSession] invokes onClosed or onConfigureFailed.
+ *
+ * This class is thread safe.
  */
-internal class VirtualSessionState(
+internal class CaptureSessionState(
     private val graphListener: GraphListener,
     private val captureSessionFactory: CaptureSessionFactory,
     private val captureSequenceProcessorFactory: Camera2CaptureSequenceProcessorFactory,
     private val cameraSurfaceManager: CameraSurfaceManager,
     private val scope: CoroutineScope
 ) : CameraCaptureSessionWrapper.StateCallback {
-    private val debugId = virtualSessionDebugIds.incrementAndGet()
+    private val debugId = captureSessionDebugIds.incrementAndGet()
     private val lock = Any()
 
     private val activeSurfaceMap = synchronizedMap(HashMap<StreamId, Surface>())
@@ -157,7 +167,7 @@
     }
 
     override fun onCaptureQueueEmpty(session: CameraCaptureSessionWrapper) {
-        Log.debug { "$this Active" }
+        Log.debug { "$this CaptureQueueEmpty" }
     }
 
     private fun configure(session: CameraCaptureSessionWrapper?) {
@@ -165,9 +175,9 @@
         var tryConfigureDeferred = false
 
         // This block is designed to do two things:
-        // 1. Get or create a RequestProcessor instance.
-        // 2. Pass the requestProcessor to the graphProcessor after the session is fully created and
-        //    the onConfigured callback has been invoked.
+        // 1. Get or create a GraphRequestProcessor instance.
+        // 2. Pass the GraphRequestProcessor to the graphProcessor after the session is fully
+        //    created and the onConfigured callback has been invoked.
         synchronized(lock) {
             if (state == State.CLOSING || state == State.CLOSED) {
                 return
@@ -177,8 +187,8 @@
                 captureSession = ConfiguredCameraCaptureSession(
                     session,
                     GraphRequestProcessor.from(
-
-                        captureSequenceProcessorFactory.create(session, activeSurfaceMap))
+                        captureSequenceProcessorFactory.create(session, activeSurfaceMap)
+                    )
                 )
                 cameraCaptureSession = captureSession
             } else {
@@ -216,69 +226,66 @@
      * a closed state. This will not cancel repeating requests or abort captures.
      */
     fun disconnect() {
-        val captureSession = synchronized(lock) {
-            if (state == State.CLOSING || state == State.CLOSED) {
-                return@synchronized null
-            }
-
-            cameraCaptureSession.also {
-                cameraCaptureSession = null
-                state = State.CLOSING
-            }
-        }
-
-        if (captureSession != null) {
-            graphListener.onGraphStopped(captureSession.processor)
-        }
-
-        val tokenToClose = synchronized(lock) {
-            _cameraDevice = null
-            state = State.CLOSED
-            _surfaceTokenMap.values
-        }
-        tokenToClose.forEach { it.close() }
+        shutdown(false)
     }
 
     /**
      * This is used to disconnect the cached [CameraCaptureSessionWrapper] and put this object into
      * a closed state. This may stop the repeating request and abort captures.
      */
-    private fun shutdown() {
-        val captureSession = synchronized(lock) {
+    private fun shutdown(abortAndStopRepeating: Boolean) {
+        var configuredCaptureSession: ConfiguredCameraCaptureSession? = null
+        var tokensToClose: List<Closeable>? = null
+
+        synchronized(lock) {
             if (state == State.CLOSING || state == State.CLOSED) {
-                return@synchronized null
+                return@synchronized
             }
+            state = State.CLOSING
 
-            cameraCaptureSession.also {
-                cameraCaptureSession = null
-                state = State.CLOSING
-            }
+            configuredCaptureSession = cameraCaptureSession
+            cameraCaptureSession = null
+            tokensToClose = _surfaceTokenMap.values.toList()
+            _surfaceTokenMap.clear()
         }
 
-        if (captureSession != null) {
+        val graphProcessor = configuredCaptureSession?.processor
+        if (graphProcessor != null) {
+            Log.debug { "$this Shutdown" }
+
             Debug.traceStart { "$this#shutdown" }
-
             Debug.traceStart { "$graphListener#onGraphStopped" }
-            graphListener.onGraphStopped(captureSession.processor)
+            graphListener.onGraphStopped(graphProcessor)
             Debug.traceStop()
+            if (abortAndStopRepeating) {
+                Debug.traceStart { "$this#stopRepeating" }
+                graphProcessor.stopRepeating()
+                Debug.traceStop()
+                Debug.traceStart { "$this#stopRepeating" }
+                graphProcessor.abortCaptures()
+                Debug.traceStop()
+            }
 
-            Debug.traceStart { "$this#stopRepeating" }
-            captureSession.processor.stopRepeating()
-            Debug.traceStop()
-
-            Debug.traceStart { "$this#stopRepeating" }
-            captureSession.processor.abortCaptures()
-            Debug.traceStop()
+            // WARNING:
+            // This does NOT call close on the captureSession to avoid potentially slow
+            // reconfiguration during mode switch and shutdown. This avoids unintentional restarts
+            // by clearing the internal captureSession variable, clearing all repeating requests,
+            // and by aborting any pending single requests.
+            //
+            // The reason we do not call close is that the android camera HAL doesn't shut down
+            // cleanly unless the device is also closed. See b/135125484 for example.
+            //
+            // WARNING - DO NOT CALL session.close().
 
             Debug.traceStop()
         }
 
-        val tokenToClose = synchronized(lock) {
+        tokensToClose?.forEach { it.close() }
+
+        synchronized(lock) {
             _cameraDevice = null
             state = State.CLOSED
-            _surfaceTokenMap.values
         }
-        tokenToClose.forEach { it.close() }
     }
 
     private fun finalizeOutputsIfAvailable(retryAllowed: Boolean = true) {
@@ -391,6 +398,7 @@
         configure(session = null)
     }
 
+    @GuardedBy("lock")
     private fun updateTrackedSurfaces(
         oldSurfaceMap: Map<StreamId, Surface>,
         newSurfaceMap: Map<StreamId, Surface>
@@ -413,7 +421,7 @@
         }
     }
 
-    override fun toString(): String = "VirtualSessionState-$debugId"
+    override fun toString(): String = "CaptureSessionState-$debugId"
 
     private data class ConfiguredCameraCaptureSession(
         val session: CameraCaptureSessionWrapper,
diff --git a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/compat/CaptureSessionFactoryTest.kt b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/compat/CaptureSessionFactoryTest.kt
index cb0fa4f..687faa8 100644
--- a/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/compat/CaptureSessionFactoryTest.kt
+++ b/camera/camera-camera2-pipe/src/test/java/androidx/camera/camera2/pipe/compat/CaptureSessionFactoryTest.kt
@@ -110,7 +110,7 @@
                 testCamera.cameraId
             ),
             mapOf(stream1.id to surface),
-            virtualSessionState = VirtualSessionState(
+            captureSessionState = CaptureSessionState(
                 FakeGraphProcessor(),
                 sessionFactory,
                 object : Camera2CaptureSequenceProcessorFactory {
diff --git a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/ExcludedSupportedSizesQuirk.java b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/ExcludedSupportedSizesQuirk.java
index b82574b..9202f59 100644
--- a/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/ExcludedSupportedSizesQuirk.java
+++ b/camera/camera-camera2/src/main/java/androidx/camera/camera2/internal/compat/quirk/ExcludedSupportedSizesQuirk.java
@@ -96,8 +96,11 @@
         if (isHuaweiP20Lite()) {
             return getHuaweiP20LiteExcludedSizes(cameraId, imageFormat);
         }
-        if (isSamsungJ7PrimeApi27Above() || isSamsungJ7Api27Above()) {
-            return getSamsungJ7PrimeApi27AboveExcludedSizes(imageFormat);
+        if (isSamsungJ7PrimeApi27Above()) {
+            return getSamsungJ7PrimeApi27AboveExcludedSizes(cameraId, imageFormat);
+        }
+        if (isSamsungJ7Api27Above()) {
+            return getSamsungJ7Api27AboveExcludedSizes(cameraId, imageFormat);
         }
         Logger.w(TAG, "Cannot retrieve list of supported sizes to exclude on this device.");
         return Collections.emptyList();
@@ -136,11 +139,83 @@
     }
 
     @NonNull
-    private List<Size> getSamsungJ7PrimeApi27AboveExcludedSizes(int imageFormat) {
+    private List<Size> getSamsungJ7PrimeApi27AboveExcludedSizes(@NonNull String cameraId,
+            int imageFormat) {
         final List<Size> sizes = new ArrayList<>();
-        if (imageFormat == ImageFormatConstants.INTERNAL_DEFINED_IMAGE_FORMAT_PRIVATE) {
-            sizes.add(new Size(1920, 1080));
+
+        if (cameraId.equals("0")) {
+            switch (imageFormat) {
+                case ImageFormatConstants.INTERNAL_DEFINED_IMAGE_FORMAT_PRIVATE:
+                    sizes.add(new Size(4128, 3096));
+                    sizes.add(new Size(4128, 2322));
+                    sizes.add(new Size(3088, 3088));
+                    sizes.add(new Size(3264, 2448));
+                    sizes.add(new Size(3264, 1836));
+                    sizes.add(new Size(2048, 1536));
+                    sizes.add(new Size(2048, 1152));
+                    sizes.add(new Size(1920, 1080));
+                    break;
+                case ImageFormat.YUV_420_888:
+                    sizes.add(new Size(4128, 2322));
+                    sizes.add(new Size(3088, 3088));
+                    sizes.add(new Size(3264, 2448));
+                    sizes.add(new Size(3264, 1836));
+                    sizes.add(new Size(2048, 1536));
+                    sizes.add(new Size(2048, 1152));
+                    sizes.add(new Size(1920, 1080));
+                    break;
+            }
+        } else if (cameraId.equals("1")) {
+            if (imageFormat == ImageFormatConstants.INTERNAL_DEFINED_IMAGE_FORMAT_PRIVATE
+                    || imageFormat == ImageFormat.YUV_420_888) {
+                sizes.add(new Size(3264, 2448));
+                sizes.add(new Size(3264, 1836));
+                sizes.add(new Size(2448, 2448));
+                sizes.add(new Size(1920, 1920));
+                sizes.add(new Size(2048, 1536));
+                sizes.add(new Size(2048, 1152));
+                sizes.add(new Size(1920, 1080));
+            }
         }
+
+        return sizes;
+    }
+
+    @NonNull
+    private List<Size> getSamsungJ7Api27AboveExcludedSizes(@NonNull String cameraId,
+            int imageFormat) {
+        final List<Size> sizes = new ArrayList<>();
+
+        if (cameraId.equals("0")) {
+            switch (imageFormat) {
+                case ImageFormatConstants.INTERNAL_DEFINED_IMAGE_FORMAT_PRIVATE:
+                    sizes.add(new Size(4128, 3096));
+                    sizes.add(new Size(4128, 2322));
+                    sizes.add(new Size(3088, 3088));
+                    sizes.add(new Size(3264, 2448));
+                    sizes.add(new Size(3264, 1836));
+                    sizes.add(new Size(2048, 1536));
+                    sizes.add(new Size(2048, 1152));
+                    sizes.add(new Size(1920, 1080));
+                    break;
+                case ImageFormat.YUV_420_888:
+                    sizes.add(new Size(2048, 1536));
+                    sizes.add(new Size(2048, 1152));
+                    sizes.add(new Size(1920, 1080));
+                    break;
+            }
+        } else if (cameraId.equals("1")) {
+            if (imageFormat == ImageFormatConstants.INTERNAL_DEFINED_IMAGE_FORMAT_PRIVATE
+                    || imageFormat == ImageFormat.YUV_420_888) {
+                sizes.add(new Size(2576, 1932));
+                sizes.add(new Size(2560, 1440));
+                sizes.add(new Size(1920, 1920));
+                sizes.add(new Size(2048, 1536));
+                sizes.add(new Size(2048, 1152));
+                sizes.add(new Size(1920, 1080));
+            }
+        }
+
         return sizes;
     }
 }
diff --git a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/compat/workaround/ExcludedSupportedSizesContainerTest.java b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/compat/workaround/ExcludedSupportedSizesContainerTest.java
index 6f01115..57d1ac6 100644
--- a/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/compat/workaround/ExcludedSupportedSizesContainerTest.java
+++ b/camera/camera-camera2/src/test/java/androidx/camera/camera2/internal/compat/workaround/ExcludedSupportedSizesContainerTest.java
@@ -74,28 +74,90 @@
                 new Config("HUAWEI", "HWANE", "0", YUV_420_888, null, SIZE_720_720, SIZE_400_400)});
         data.add(new Object[]{new Config("HUAWEI", "HWANE", "1", YUV_420_888, null)});
         data.add(new Object[]{new Config("HUAWEI", "HWANE", "0", JPEG, null)});
+
         // Samsung J7 Prime (SM-G610M)
         data.add(new Object[]{
                 new Config("SAMSUNG", "ON7XELTE", "0", PRIVATE, () -> Build.VERSION.SDK_INT >= 27,
-                        SIZE_1920_1080)});
+                        new Size(4128, 3096),
+                        new Size(4128, 2322),
+                        new Size(3088, 3088),
+                        new Size(3264, 2448),
+                        new Size(3264, 1836),
+                        new Size(2048, 1536),
+                        new Size(2048, 1152),
+                        new Size(1920, 1080))});
+        data.add(new Object[]{
+                new Config("SAMSUNG", "ON7XELTE", "0", YUV_420_888,
+                        () -> Build.VERSION.SDK_INT >= 27,
+                        new Size(4128, 2322),
+                        new Size(3088, 3088),
+                        new Size(3264, 2448),
+                        new Size(3264, 1836),
+                        new Size(2048, 1536),
+                        new Size(2048, 1152),
+                        new Size(1920, 1080))});
         data.add(new Object[]{
                 new Config("SAMSUNG", "ON7XELTE", "0", JPEG, () -> Build.VERSION.SDK_INT >= 27)});
         data.add(new Object[]{
                 new Config("SAMSUNG", "ON7XELTE", "1", PRIVATE, () -> Build.VERSION.SDK_INT >= 27,
-                        SIZE_1920_1080)});
-        data.add(new Object[]{new Config("SAMSUNG", "ON7XELTE", "1", YUV_420_888,
-                () -> Build.VERSION.SDK_INT >= 27)});
+                        new Size(3264, 2448),
+                        new Size(3264, 1836),
+                        new Size(2448, 2448),
+                        new Size(1920, 1920),
+                        new Size(2048, 1536),
+                        new Size(2048, 1152),
+                        new Size(1920, 1080))});
+        data.add(new Object[]{
+                new Config("SAMSUNG", "ON7XELTE", "1", YUV_420_888,
+                        () -> Build.VERSION.SDK_INT >= 27,
+                        new Size(3264, 2448),
+                        new Size(3264, 1836),
+                        new Size(2448, 2448),
+                        new Size(1920, 1920),
+                        new Size(2048, 1536),
+                        new Size(2048, 1152),
+                        new Size(1920, 1080))});
+        data.add(new Object[]{
+                new Config("SAMSUNG", "ON7XELTE", "1", JPEG, () -> Build.VERSION.SDK_INT >= 27)});
+
         // Samsung J7 (SM-J710MN)
         data.add(new Object[]{
                 new Config("SAMSUNG", "J7XELTE", "0", PRIVATE, () -> Build.VERSION.SDK_INT >= 27,
-                        SIZE_1920_1080)});
+                        new Size(4128, 3096),
+                        new Size(4128, 2322),
+                        new Size(3088, 3088),
+                        new Size(3264, 2448),
+                        new Size(3264, 1836),
+                        new Size(2048, 1536),
+                        new Size(2048, 1152),
+                        new Size(1920, 1080))});
+        data.add(new Object[]{
+                new Config("SAMSUNG", "J7XELTE", "0", YUV_420_888,
+                        () -> Build.VERSION.SDK_INT >= 27,
+                        new Size(2048, 1536),
+                        new Size(2048, 1152),
+                        new Size(1920, 1080))});
         data.add(new Object[]{
                 new Config("SAMSUNG", "J7XELTE", "0", JPEG, () -> Build.VERSION.SDK_INT >= 27)});
         data.add(new Object[]{
                 new Config("SAMSUNG", "J7XELTE", "1", PRIVATE, () -> Build.VERSION.SDK_INT >= 27,
-                        SIZE_1920_1080)});
-        data.add(new Object[]{new Config("SAMSUNG", "J7XELTE", "1", YUV_420_888,
-                () -> Build.VERSION.SDK_INT >= 27)});
+                        new Size(2576, 1932),
+                        new Size(2560, 1440),
+                        new Size(1920, 1920),
+                        new Size(2048, 1536),
+                        new Size(2048, 1152),
+                        new Size(1920, 1080))});
+        data.add(new Object[]{
+                new Config("SAMSUNG", "J7XELTE", "1", YUV_420_888,
+                        () -> Build.VERSION.SDK_INT >= 27,
+                        new Size(2576, 1932),
+                        new Size(2560, 1440),
+                        new Size(1920, 1920),
+                        new Size(2048, 1536),
+                        new Size(2048, 1152),
+                        new Size(1920, 1080))});
+        data.add(new Object[]{
+                new Config("SAMSUNG", "J7XELTE", "1", JPEG, () -> Build.VERSION.SDK_INT >= 27)});
         return data;
     }
 
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/imagecapture/FakeTakePictureCallback.kt b/camera/camera-core/src/androidTest/java/androidx/camera/core/imagecapture/FakeTakePictureCallback.kt
index 445cf3b..76601d7 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/imagecapture/FakeTakePictureCallback.kt
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/imagecapture/FakeTakePictureCallback.kt
@@ -51,6 +51,10 @@
         TODO("Not yet implemented")
     }
 
+    override fun isAborted(): Boolean {
+        return false
+    }
+
     internal suspend fun getInMemoryResult() = suspendCoroutine { cont ->
         inMemoryResultCont = cont
     }
diff --git a/camera/camera-core/src/androidTest/java/androidx/camera/core/processing/DefaultSurfaceEffectTest.kt b/camera/camera-core/src/androidTest/java/androidx/camera/core/processing/DefaultSurfaceProcessorTest.kt
similarity index 84%
rename from camera/camera-core/src/androidTest/java/androidx/camera/core/processing/DefaultSurfaceEffectTest.kt
rename to camera/camera-core/src/androidTest/java/androidx/camera/core/processing/DefaultSurfaceProcessorTest.kt
index d80c7b3..49f2220 100644
--- a/camera/camera-core/src/androidTest/java/androidx/camera/core/processing/DefaultSurfaceEffectTest.kt
+++ b/camera/camera-core/src/androidTest/java/androidx/camera/core/processing/DefaultSurfaceProcessorTest.kt
@@ -20,8 +20,8 @@
 import android.hardware.camera2.CameraDevice.TEMPLATE_PREVIEW
 import android.util.Size
 import android.view.Surface
-import androidx.camera.core.SurfaceEffect
 import androidx.camera.core.SurfaceOutput.GlTransformOptions.USE_SURFACE_TEXTURE_TRANSFORM
+import androidx.camera.core.SurfaceProcessor
 import androidx.camera.core.SurfaceRequest
 import androidx.camera.core.impl.DeferrableSurface
 import androidx.camera.core.impl.ImageFormatConstants
@@ -51,7 +51,7 @@
 @RunWith(AndroidJUnit4::class)
 @LargeTest
 @SdkSuppress(minSdkVersion = 21)
-class DefaultSurfaceEffectTest {
+class DefaultSurfaceProcessorTest {
 
     companion object {
         private const val WIDTH = 640
@@ -88,7 +88,7 @@
     @get:Rule
     val useCamera = CameraUtil.grantCameraPermissionAndPreTest(testCameraRule, testCameraIdListRule)
 
-    private lateinit var surfaceEffect: DefaultSurfaceEffect
+    private lateinit var surfaceProcessor: DefaultSurfaceProcessor
     private lateinit var cameraDeviceHolder: CameraUtil.CameraDeviceHolder
     private lateinit var renderOutput: RenderOutput<*>
     private val inputSurfaceRequestsToClose = mutableListOf<SurfaceRequest>()
@@ -102,9 +102,9 @@
         if (::renderOutput.isInitialized) {
             renderOutput.release()
         }
-        if (::surfaceEffect.isInitialized) {
-            surfaceEffect.release()
-            surfaceEffect.awaitReleased(10_000L)
+        if (::surfaceProcessor.isInitialized) {
+            surfaceProcessor.release()
+            surfaceProcessor.awaitReleased(10_000L)
         }
         for (surfaceRequest in inputSurfaceRequestsToClose) {
             surfaceRequest.deferrableSurface.close()
@@ -114,18 +114,18 @@
     @Test
     fun release_closeAllSurfaceOutputs(): Unit = runBlocking {
         // Arrange.
-        createSurfaceEffect()
+        createSurfaceProcessor()
         val surfaceOutput1 = createSurfaceOutput()
-        surfaceEffect.onOutputSurface(surfaceOutput1)
+        surfaceProcessor.onOutputSurface(surfaceOutput1)
 
         val surfaceOutput2 = createSurfaceOutput()
-        surfaceEffect.onOutputSurface(surfaceOutput2)
+        surfaceProcessor.onOutputSurface(surfaceOutput2)
 
-        surfaceEffect.idle()
+        surfaceProcessor.idle()
 
         // Act.
-        surfaceEffect.release()
-        surfaceEffect.awaitReleased(5000)
+        surfaceProcessor.release()
+        surfaceProcessor.awaitReleased(5000)
 
         // Assert.
         assertThat(surfaceOutput1.isClosed).isTrue()
@@ -135,12 +135,12 @@
     @Test
     fun callOnInputSurfaceAfterReleased_willNotProvideSurface() {
         // Arrange.
-        createSurfaceEffect()
+        createSurfaceProcessor()
         val surfaceRequest = createInputSurfaceRequest()
 
         // Act.
-        surfaceEffect.release()
-        surfaceEffect.onInputSurface(surfaceRequest)
+        surfaceProcessor.release()
+        surfaceProcessor.onInputSurface(surfaceRequest)
 
         // Assert.
         try {
@@ -154,13 +154,13 @@
     @Test
     fun callOnOutputSurfaceAfterReleased_closeSurfaceOutput(): Unit = runBlocking {
         // Arrange.
-        createSurfaceEffect()
+        createSurfaceProcessor()
         val surfaceOutput = createSurfaceOutput()
 
         // Act.
-        surfaceEffect.release()
-        surfaceEffect.awaitReleased()
-        surfaceEffect.onOutputSurface(surfaceOutput)
+        surfaceProcessor.release()
+        surfaceProcessor.awaitReleased()
+        surfaceProcessor.onOutputSurface(surfaceOutput)
 
         // Assert.
         assertThat(surfaceOutput.isClosed).isTrue()
@@ -169,14 +169,14 @@
     @Test
     fun requestCloseAfterOnOutputSurface_closeSurfaceOutput() {
         // Arrange.
-        createSurfaceEffect()
+        createSurfaceProcessor()
         val surfaceOutput = createSurfaceOutput()
 
         // Act.
-        surfaceEffect.onOutputSurface(surfaceOutput)
-        surfaceEffect.idle()
+        surfaceProcessor.onOutputSurface(surfaceOutput)
+        surfaceProcessor.idle()
         surfaceOutput.requestClose()
-        surfaceEffect.idle()
+        surfaceProcessor.idle()
 
         // Assert.
         assertThat(surfaceOutput.isClosed).isTrue()
@@ -185,13 +185,13 @@
     @Test
     fun requestCloseBeforeOnOutputSurface_closeSurfaceOutput() {
         // Arrange.
-        createSurfaceEffect()
+        createSurfaceProcessor()
         val surfaceOutput = createSurfaceOutput()
 
         // Act.
         surfaceOutput.requestClose()
-        surfaceEffect.onOutputSurface(surfaceOutput)
-        surfaceEffect.idle()
+        surfaceProcessor.onOutputSurface(surfaceOutput)
+        surfaceProcessor.idle()
 
         // Assert.
         assertThat(surfaceOutput.isClosed).isTrue()
@@ -225,7 +225,7 @@
     fun createByInvalidShaderString_throwException() {
         val shaderProvider = createCustomShaderProvider(shaderString = "Invalid shader")
         assertThrows(IllegalArgumentException::class.java) {
-            createSurfaceEffect(shaderProvider)
+            createSurfaceProcessor(shaderProvider)
         }
     }
 
@@ -234,7 +234,7 @@
         val shaderProvider =
             createCustomShaderProvider(exceptionToThrow = RuntimeException("Failed Shader"))
         assertThrows(IllegalArgumentException::class.java) {
-            createSurfaceEffect(shaderProvider)
+            createSurfaceProcessor(shaderProvider)
         }
     }
 
@@ -242,7 +242,7 @@
     fun createByIncorrectSamplerName_throwException() {
         val shaderProvider = createCustomShaderProvider(samplerVarName = "_mySampler_")
         assertThrows(IllegalArgumentException::class.java) {
-            createSurfaceEffect(shaderProvider)
+            createSurfaceProcessor(shaderProvider)
         }
     }
 
@@ -250,7 +250,7 @@
     fun createByIncorrectFragCoordsName_throwException() {
         val shaderProvider = createCustomShaderProvider(fragCoordsVarName = "_myFragCoords_")
         assertThrows(IllegalArgumentException::class.java) {
-            createSurfaceEffect(shaderProvider)
+            createSurfaceProcessor(shaderProvider)
         }
     }
 
@@ -258,10 +258,10 @@
         outputType: OutputType,
         shaderProvider: ShaderProvider = ShaderProvider.DEFAULT
     ) {
-        createSurfaceEffect(shaderProvider)
+        createSurfaceProcessor(shaderProvider)
         // Prepare input
         val inputSurfaceRequest = createInputSurfaceRequest()
-        surfaceEffect.onInputSurface(inputSurfaceRequest)
+        surfaceProcessor.onInputSurface(inputSurfaceRequest)
         val inputDeferrableSurface = inputSurfaceRequest.deferrableSurface
         val inputSurface = inputDeferrableSurface.surface.await()
         openCameraAndSetRepeating(inputSurface)
@@ -272,7 +272,7 @@
         // Prepare output
         renderOutput = RenderOutput.createRenderOutput(outputType)
         val surfaceOutput = createSurfaceOutput(renderOutput.surface)
-        surfaceEffect.onOutputSurface(surfaceOutput)
+        surfaceProcessor.onOutputSurface(surfaceOutput)
 
         // Assert.
         assertThat(renderOutput.await(/*imageCount=*/5, /*timeoutInMs=*/10_000L)).isTrue()
@@ -289,8 +289,10 @@
         )
     }
 
-    private fun createSurfaceEffect(shaderProvider: ShaderProvider = ShaderProvider.DEFAULT) {
-        surfaceEffect = DefaultSurfaceEffect(shaderProvider)
+    private fun createSurfaceProcessor(shaderProvider: ShaderProvider = ShaderProvider.DEFAULT) {
+        surfaceProcessor = DefaultSurfaceProcessor(
+            shaderProvider
+        )
     }
 
     private fun createInputSurfaceRequest(): SurfaceRequest {
@@ -302,7 +304,7 @@
     private fun createSurfaceOutput(surface: Surface = mock(Surface::class.java)) =
         SurfaceOutputImpl(
             surface,
-            SurfaceEffect.PREVIEW,
+            SurfaceProcessor.PREVIEW,
             ImageFormatConstants.INTERNAL_DEFINED_IMAGE_FORMAT_PRIVATE,
             Size(WIDTH, HEIGHT),
             USE_SURFACE_TEXTURE_TRANSFORM,
@@ -334,11 +336,11 @@
         }
     }
 
-    private fun DefaultSurfaceEffect.idle() {
+    private fun DefaultSurfaceProcessor.idle() {
         HandlerUtil.waitForLooperToIdle(mGlHandler)
     }
 
-    private suspend fun DefaultSurfaceEffect.awaitReleased(timeoutMs: Long = 5000L) {
+    private suspend fun DefaultSurfaceProcessor.awaitReleased(timeoutMs: Long = 5000L) {
         withTimeoutOrNull(timeoutMs) {
             while (true) {
                 delay(500L)
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/CameraEffect.java b/camera/camera-core/src/main/java/androidx/camera/core/CameraEffect.java
index b4d7822..2445aa0 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/CameraEffect.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/CameraEffect.java
@@ -39,7 +39,7 @@
      */
     @Retention(RetentionPolicy.SOURCE)
     @RestrictTo(RestrictTo.Scope.LIBRARY)
-    @IntDef(flag = true, value = {SurfaceEffect.PREVIEW, SurfaceEffect.VIDEO_CAPTURE,
+    @IntDef(flag = true, value = {SurfaceProcessor.PREVIEW, SurfaceProcessor.VIDEO_CAPTURE,
             ImageEffect.IMAGE_CAPTURE})
     @interface Targets {
     }
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/EffectBundle.java b/camera/camera-core/src/main/java/androidx/camera/core/EffectBundle.java
index 1025eb6..ba6b61f 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/EffectBundle.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/EffectBundle.java
@@ -16,7 +16,7 @@
 
 package androidx.camera.core;
 
-import static androidx.camera.core.SurfaceEffect.PREVIEW;
+import static androidx.camera.core.SurfaceProcessor.PREVIEW;
 import static androidx.core.util.Preconditions.checkArgument;
 
 import androidx.annotation.NonNull;
@@ -81,7 +81,7 @@
          * Adds a {@link CameraEffect} with its targets.
          *
          * @param targets      on which the effect will be applied. CameraX only supports
-         *                     {@link SurfaceEffect#PREVIEW} for now.
+         *                     {@link SurfaceProcessor#PREVIEW} for now.
          * @param cameraEffect the effect implementation.
          * @throws IllegalArgumentException if the configuration is illegal.
          */
@@ -91,11 +91,11 @@
                 @NonNull CameraEffect cameraEffect) {
             checkArgument(!mEffects.containsKey(targets), "The target already has an effect");
             checkArgument(targets == PREVIEW, "Only allows PREVIEW target.");
-            if (cameraEffect instanceof SurfaceEffect) {
+            if (cameraEffect instanceof SurfaceProcessor) {
                 mEffects.put(targets, cameraEffect);
             } else {
                 throw new UnsupportedOperationException(
-                        "CameraX only supports SurfaceEffect for now.");
+                        "CameraX only supports SurfaceProcessor for now.");
             }
             return this;
         }
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/ImageCapture.java b/camera/camera-core/src/main/java/androidx/camera/core/ImageCapture.java
index 93d6fb72..5b22093 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/ImageCapture.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/ImageCapture.java
@@ -2001,7 +2001,7 @@
         checkMainThread();
         mImagePipeline.close();
         mImagePipeline = null;
-        mTakePictureManager.cancelUnsentRequests();
+        mTakePictureManager.abortRequests();
         mTakePictureManager = null;
     }
 
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/Preview.java b/camera/camera-core/src/main/java/androidx/camera/core/Preview.java
index fd52b2c..062cdea 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/Preview.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/Preview.java
@@ -95,8 +95,8 @@
 import androidx.camera.core.processing.Node;
 import androidx.camera.core.processing.SettableSurface;
 import androidx.camera.core.processing.SurfaceEdge;
-import androidx.camera.core.processing.SurfaceEffectInternal;
-import androidx.camera.core.processing.SurfaceEffectNode;
+import androidx.camera.core.processing.SurfaceProcessorInternal;
+import androidx.camera.core.processing.SurfaceProcessorNode;
 import androidx.core.util.Consumer;
 import androidx.core.util.Preconditions;
 import androidx.lifecycle.LifecycleOwner;
@@ -194,10 +194,10 @@
     private Size mSurfaceSize;
 
     @Nullable
-    private SurfaceEffectInternal mSurfaceEffect;
+    private SurfaceProcessorInternal mSurfaceProcessor;
 
     @Nullable
-    private SurfaceEffectNode mNode;
+    private SurfaceProcessorNode mNode;
 
     /**
      * Creates a new preview use case from the given configuration.
@@ -214,9 +214,9 @@
     @SuppressWarnings("WeakerAccess") /* synthetic accessor */
     SessionConfig.Builder createPipeline(@NonNull String cameraId, @NonNull PreviewConfig config,
             @NonNull Size resolution) {
-        // Build pipeline with node if effect is set. Eventually we will move all the code to
+        // Build pipeline with node if processor is set. Eventually we will move all the code to
         // createPipelineWithNode.
-        if (mSurfaceEffect != null) {
+        if (mSurfaceProcessor != null) {
             return createPipelineWithNode(cameraId, config, resolution);
         }
 
@@ -303,16 +303,16 @@
             @NonNull Size resolution) {
         // Check arguments
         Threads.checkMainThread();
-        Preconditions.checkNotNull(mSurfaceEffect);
+        Preconditions.checkNotNull(mSurfaceProcessor);
         CameraInternal camera = getCamera();
         Preconditions.checkNotNull(camera);
 
         clearPipeline();
 
         // Create nodes and edges.
-        mNode = new SurfaceEffectNode(camera, USE_SURFACE_TEXTURE_TRANSFORM, mSurfaceEffect);
+        mNode = new SurfaceProcessorNode(camera, USE_SURFACE_TEXTURE_TRANSFORM, mSurfaceProcessor);
         SettableSurface cameraSurface = new SettableSurface(
-                SurfaceEffect.PREVIEW,
+                SurfaceProcessor.PREVIEW,
                 resolution,
                 ImageFormat.PRIVATE,
                 new Matrix(),
@@ -339,7 +339,7 @@
     }
 
     /**
-     * Sets a {@link SurfaceEffectInternal}.
+     * Sets a {@link SurfaceProcessorInternal}.
      *
      * <p>Internal API invoked by {@link CameraUseCaseAdapter}. {@link #createPipeline} uses the
      * value to setup post-processing pipeline.
@@ -347,20 +347,20 @@
      * @hide
      */
     @RestrictTo(Scope.LIBRARY_GROUP)
-    public void setEffect(@Nullable SurfaceEffectInternal surfaceEffect) {
-        mSurfaceEffect = surfaceEffect;
+    public void setProcessor(@Nullable SurfaceProcessorInternal surfaceProcessor) {
+        mSurfaceProcessor = surfaceProcessor;
     }
 
     /**
-     * Gets the {@link SurfaceEffectInternal} for testing.
+     * Gets the {@link SurfaceProcessorInternal} for testing.
      *
      * @hide
      */
     @Nullable
     @VisibleForTesting
     @RestrictTo(Scope.LIBRARY_GROUP)
-    public SurfaceEffectInternal getEffect() {
-        return mSurfaceEffect;
+    public SurfaceProcessorInternal getProcessor() {
+        return mSurfaceProcessor;
     }
 
     /**
@@ -372,7 +372,7 @@
             cameraSurface.close();
             mSessionDeferrableSurface = null;
         }
-        SurfaceEffectNode node = mNode;
+        SurfaceProcessorNode node = mNode;
         if (node != null) {
             node.release();
             mNode = null;
@@ -390,7 +390,7 @@
 
         // Not to add deferrable surface if the surface provider is not set, as that means the
         // surface will never be provided. For simplicity, the same rule also applies to
-        // SurfaceEffectNode and CaptureProcessor cases, since no surface provider also means no
+        // SurfaceProcessorNode and CaptureProcessor cases, since no surface provider also means no
         // output target for these two cases.
         if (mSurfaceProvider != null) {
             sessionConfigBuilder.addSurface(mSessionDeferrableSurface);
@@ -447,7 +447,7 @@
         SurfaceRequest surfaceRequest = mCurrentSurfaceRequest;
         if (cameraInternal != null && surfaceProvider != null && cropRect != null
                 && surfaceRequest != null) {
-            // TODO: when SurfaceEffectNode exists, use SettableSurface.setRotationDegrees(int)
+            // TODO: when SurfaceProcessorNode exists, use SettableSurface.setRotationDegrees(int)
             //  instead. However, this requires PreviewView to rely on relative rotation but not
             //  target rotation.
             surfaceRequest.updateTransformationInfo(SurfaceRequest.TransformationInfo.of(cropRect,
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/SurfaceOutput.java b/camera/camera-core/src/main/java/androidx/camera/core/SurfaceOutput.java
index 9930739..6bf27c5 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/SurfaceOutput.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/SurfaceOutput.java
@@ -38,7 +38,7 @@
  * lifecycle of the {@link Surface}.
  *
  * @hide
- * @see SurfaceEffect#onOutputSurface(SurfaceOutput)
+ * @see SurfaceProcessor#onOutputSurface(SurfaceOutput)
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
 public interface SurfaceOutput {
@@ -63,10 +63,10 @@
      * This field indicates that what purpose the {@link Surface} will be used for.
      *
      * <ul>
-     * <li>{@link SurfaceEffect#PREVIEW} if the {@link Surface} will be used for {@link Preview}.
-     * <li>{@link SurfaceEffect#VIDEO_CAPTURE} if the {@link Surface} will be used for video
+     * <li>{@link SurfaceProcessor#PREVIEW} if the {@link Surface} will be used for {@link Preview}.
+     * <li>{@link SurfaceProcessor#VIDEO_CAPTURE} if the {@link Surface} will be used for video
      * capture.
-     * <li>{@link SurfaceEffect#PREVIEW} | {@link SurfaceEffect#VIDEO_CAPTURE} if the output
+     * <li>{@link SurfaceProcessor#PREVIEW} | {@link SurfaceProcessor#VIDEO_CAPTURE} if the output
      * {@link Surface} will be used for sharing a single stream for both preview and video capture.
      * </ul>
      */
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/SurfaceEffect.java b/camera/camera-core/src/main/java/androidx/camera/core/SurfaceProcessor.java
similarity index 98%
rename from camera/camera-core/src/main/java/androidx/camera/core/SurfaceEffect.java
rename to camera/camera-core/src/main/java/androidx/camera/core/SurfaceProcessor.java
index 5367124..fd55b33 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/SurfaceEffect.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/SurfaceProcessor.java
@@ -34,7 +34,7 @@
  * @hide
  */
 @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
-public interface SurfaceEffect extends CameraEffect {
+public interface SurfaceProcessor extends CameraEffect {
 
     /**
      * Bitmask option to indicate that CameraX applies this effect to {@link Preview}.
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/UseCaseGroup.java b/camera/camera-core/src/main/java/androidx/camera/core/UseCaseGroup.java
index 44c76b4..d5a76f2 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/UseCaseGroup.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/UseCaseGroup.java
@@ -109,7 +109,7 @@
         /**
          * Sets the {@link EffectBundle} for the {@link UseCase}s.
          *
-         * <p>Once set, CameraX will use the {@link SurfaceEffect}s to process the outputs of
+         * <p>Once set, CameraX will use the {@link SurfaceProcessor}s to process the outputs of
          * the {@link UseCase}s.
          *
          * @hide
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/ProcessingNode.java b/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/ProcessingNode.java
index abcad71..5e12339 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/ProcessingNode.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/ProcessingNode.java
@@ -76,7 +76,13 @@
     public Void transform(@NonNull ProcessingNode.In inputEdge) {
         // Listen to the input edge.
         inputEdge.getEdge().setListener(
-                inputPacket -> mBlockingExecutor.execute(() -> processInputPacket(inputPacket)));
+                inputPacket -> {
+                    if (inputPacket.getProcessingRequest().isAborted()) {
+                        // No-ops if the request is aborted.
+                        return;
+                    }
+                    mBlockingExecutor.execute(() -> processInputPacket(inputPacket));
+                });
 
         mInput2Packet = new ProcessingInput2Packet();
         mImage2JpegBytes = new Image2JpegBytes();
@@ -123,7 +129,7 @@
             throws ImageCaptureException {
         ProcessingRequest request = inputPacket.getProcessingRequest();
         Packet<ImageProxy> originalImage = mInput2Packet.apply(inputPacket);
-        Packet<byte[]> jpegBytes =  mImage2JpegBytes.apply(
+        Packet<byte[]> jpegBytes = mImage2JpegBytes.apply(
                 Image2JpegBytes.In.of(originalImage, request.getJpegQuality()));
         if (jpegBytes.hasCropping()) {
             Packet<Bitmap> croppedBitmap = mJpegBytes2CroppedBitmap.apply(jpegBytes);
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/ProcessingRequest.java b/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/ProcessingRequest.java
index 4b2b914..33241aa 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/ProcessingRequest.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/ProcessingRequest.java
@@ -145,4 +145,11 @@
     void onProcessFailure(@NonNull ImageCaptureException imageCaptureException) {
         mCallback.onProcessFailure(imageCaptureException);
     }
+
+    /**
+     * Returns true if the request has been aborted by the app/lifecycle.
+     */
+    boolean isAborted() {
+        return mCallback.isAborted();
+    }
 }
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/RequestWithCallback.java b/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/RequestWithCallback.java
index cc897c5..e9af56a 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/RequestWithCallback.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/RequestWithCallback.java
@@ -46,6 +46,9 @@
     private CallbackToFutureAdapter.Completer<Void> mCaptureCompleter;
     // Tombstone flag that indicates that this callback should not be invoked anymore.
     private boolean mIsComplete = false;
+    // Flag tracks if the request has been aborted by the UseCase. Once aborted, this class stops
+    // propagating callbacks to the app.
+    private boolean mIsAborted = false;
 
     RequestWithCallback(@NonNull TakePictureRequest takePictureRequest) {
         mTakePictureRequest = takePictureRequest;
@@ -60,6 +63,10 @@
     @Override
     public void onImageCaptured() {
         checkMainThread();
+        if (mIsAborted) {
+            // Ignore. mCaptureFuture should have been completed by the #abort() call.
+            return;
+        }
         mCaptureCompleter.set(null);
         // TODO: send early callback to app.
     }
@@ -68,6 +75,11 @@
     @Override
     public void onFinalResult(@NonNull ImageCapture.OutputFileResults outputFileResults) {
         checkMainThread();
+        if (mIsAborted) {
+            // Do not deliver result if the request has been aborted.
+            // TODO: delete the saved file when the request is aborted.
+            return;
+        }
         checkOnImageCaptured();
         markComplete();
         mTakePictureRequest.onResult(outputFileResults);
@@ -77,6 +89,10 @@
     @Override
     public void onFinalResult(@NonNull ImageProxy imageProxy) {
         checkMainThread();
+        if (mIsAborted) {
+            // Do not deliver result if the request has been aborted.
+            return;
+        }
         checkOnImageCaptured();
         markComplete();
         mTakePictureRequest.onResult(imageProxy);
@@ -87,15 +103,28 @@
     @Override
     public void onProcessFailure(@NonNull ImageCaptureException imageCaptureException) {
         checkMainThread();
+        if (mIsAborted) {
+            // Fail silently if the request has been aborted.
+            return;
+        }
         checkOnImageCaptured();
         markComplete();
         onFailure(imageCaptureException);
     }
 
+    @Override
+    public boolean isAborted() {
+        return mIsAborted;
+    }
+
     @MainThread
     @Override
     public void onCaptureFailure(@NonNull ImageCaptureException imageCaptureException) {
         checkMainThread();
+        if (mIsAborted) {
+            // Fail silently if the request has been aborted.
+            return;
+        }
         markComplete();
         mCaptureCompleter.set(null);
 
@@ -103,6 +132,14 @@
         onFailure(imageCaptureException);
     }
 
+    @MainThread
+    void abort(@NonNull ImageCaptureException imageCaptureException) {
+        checkMainThread();
+        mIsAborted = true;
+        mCaptureCompleter.set(null);
+        onFailure(imageCaptureException);
+    }
+
     /**
      * Gets a {@link ListenableFuture} that finishes when the capture is completed by camera.
      *
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/TakePictureCallback.java b/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/TakePictureCallback.java
index a4b7be9..0d9f4e2 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/TakePictureCallback.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/TakePictureCallback.java
@@ -28,7 +28,7 @@
  * <p>This is an internal callback that loosely maps to
  * {@link ImageCapture.OnImageCapturedCallback} or {@link ImageCapture.OnImageSavedCallback}.
  */
-public interface TakePictureCallback {
+interface TakePictureCallback {
 
     /**
      * Invoked when the capture is complete..
@@ -72,4 +72,9 @@
      */
     @MainThread
     void onProcessFailure(@NonNull ImageCaptureException imageCaptureException);
+
+    /**
+     * Returns true if the request has been aborted.
+     */
+    boolean isAborted();
 }
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/TakePictureManager.java b/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/TakePictureManager.java
index 8601276..87953af 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/TakePictureManager.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/imagecapture/TakePictureManager.java
@@ -16,6 +16,7 @@
 
 package androidx.camera.core.imagecapture;
 
+import static androidx.camera.core.ImageCapture.ERROR_CAMERA_CLOSED;
 import static androidx.camera.core.ImageCapture.ERROR_CAPTURE_FAILED;
 import static androidx.camera.core.impl.utils.Threads.checkMainThread;
 import static androidx.camera.core.impl.utils.executor.CameraXExecutors.directExecutor;
@@ -126,9 +127,22 @@
      * Clears the requests queue.
      */
     @MainThread
-    public void cancelUnsentRequests() {
+    public void abortRequests() {
         checkMainThread();
+        ImageCaptureException exception =
+                new ImageCaptureException(ERROR_CAMERA_CLOSED, "Camera is closed.", null);
+
+        // Clear pending request first so aborting in-flight request won't trigger another capture.
+        for (TakePictureRequest request : mNewRequests) {
+            request.onError(exception);
+        }
         mNewRequests.clear();
+
+        // Abort the in-flight request after clearing the pending requests.
+        if (mInFlightRequest != null) {
+            // TODO: optimize the performance by aborting early in CaptureNode and BundlingNode
+            mInFlightRequest.abort(exception);
+        }
     }
 
     /**
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/internal/CameraUseCaseAdapter.java b/camera/camera-core/src/main/java/androidx/camera/core/internal/CameraUseCaseAdapter.java
index eeb89fd..a19cccb 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/internal/CameraUseCaseAdapter.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/internal/CameraUseCaseAdapter.java
@@ -37,7 +37,7 @@
 import androidx.camera.core.ImageCapture;
 import androidx.camera.core.Logger;
 import androidx.camera.core.Preview;
-import androidx.camera.core.SurfaceEffect;
+import androidx.camera.core.SurfaceProcessor;
 import androidx.camera.core.UseCase;
 import androidx.camera.core.ViewPort;
 import androidx.camera.core.impl.AttachedSurfaceInfo;
@@ -52,8 +52,8 @@
 import androidx.camera.core.impl.UseCaseConfig;
 import androidx.camera.core.impl.UseCaseConfigFactory;
 import androidx.camera.core.impl.utils.executor.CameraXExecutors;
-import androidx.camera.core.processing.SurfaceEffectInternal;
-import androidx.camera.core.processing.SurfaceEffectWithExecutor;
+import androidx.camera.core.processing.SurfaceProcessorInternal;
+import androidx.camera.core.processing.SurfaceProcessorWithExecutor;
 import androidx.core.util.Preconditions;
 
 import java.util.ArrayList;
@@ -451,17 +451,18 @@
             for (Map.Entry<Integer, CameraEffect> entry : effectBundle.getEffects().entrySet()) {
                 CameraEffect effect = entry.getValue();
                 int targets = entry.getKey();
-                if (effect instanceof SurfaceEffect) {
-                    effectsWithExecutors.put(targets, new SurfaceEffectWithExecutor(
-                            (SurfaceEffect) effect, executor));
+                if (effect instanceof SurfaceProcessor) {
+                    effectsWithExecutors.put(targets, new SurfaceProcessorWithExecutor(
+                            (SurfaceProcessor) effect, executor));
                 }
             }
         }
         // Set effects on the UseCases. This also removes existing effects if necessary.
         for (UseCase useCase : useCases) {
             if (useCase instanceof Preview) {
-                ((Preview) useCase).setEffect(
-                        (SurfaceEffectInternal) effectsWithExecutors.get(SurfaceEffect.PREVIEW));
+                ((Preview) useCase).setProcessor(
+                        (SurfaceProcessorInternal) effectsWithExecutors.get(
+                                SurfaceProcessor.PREVIEW));
             }
         }
     }
@@ -470,8 +471,17 @@
             @NonNull Collection<UseCase> useCases) {
         synchronized (mLock) {
             if (mViewPort != null) {
-                boolean isFrontCamera = mCameraInternal.getCameraInfoInternal().getLensFacing()
-                        == CameraSelector.LENS_FACING_FRONT;
+                Integer lensFacing = mCameraInternal.getCameraInfoInternal().getLensFacing();
+                boolean isFrontCamera;
+                if (lensFacing == null) {
+                    // TODO(b/122975195): If the lens facing is null, it's probably an external
+                    //  camera. We treat it as like a front camera with unverified behaviors. Will
+                    //  have to define this later.
+                    Logger.w(TAG, "The lens facing is null, probably an external.");
+                    isFrontCamera = true;
+                } else {
+                    isFrontCamera = lensFacing == CameraSelector.LENS_FACING_FRONT;
+                }
                 // Calculate crop rect if view port is provided.
                 Map<UseCase, Rect> cropRectMap = ViewPorts.calculateViewPortRects(
                         mCameraInternal.getCameraControlInternal().getSensorRect(),
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/processing/DefaultSurfaceEffect.java b/camera/camera-core/src/main/java/androidx/camera/core/processing/DefaultSurfaceProcessor.java
similarity index 92%
rename from camera/camera-core/src/main/java/androidx/camera/core/processing/DefaultSurfaceEffect.java
rename to camera/camera-core/src/main/java/androidx/camera/core/processing/DefaultSurfaceProcessor.java
index 7d127aa..8be1285 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/processing/DefaultSurfaceEffect.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/processing/DefaultSurfaceProcessor.java
@@ -25,8 +25,8 @@
 import androidx.annotation.RequiresApi;
 import androidx.annotation.VisibleForTesting;
 import androidx.annotation.WorkerThread;
-import androidx.camera.core.SurfaceEffect;
 import androidx.camera.core.SurfaceOutput;
+import androidx.camera.core.SurfaceProcessor;
 import androidx.camera.core.SurfaceRequest;
 import androidx.camera.core.impl.utils.executor.CameraXExecutors;
 import androidx.concurrent.futures.CallbackToFutureAdapter;
@@ -40,13 +40,13 @@
 import java.util.concurrent.atomic.AtomicBoolean;
 
 /**
- * A default implementation of {@link SurfaceEffect}.
+ * A default implementation of {@link SurfaceProcessor}.
  *
  * <p> This implementation simply copies the frame from the source to the destination with the
  * transformation defined in {@link SurfaceOutput#updateTransformMatrix}.
  */
 @RequiresApi(21)
-public class DefaultSurfaceEffect implements SurfaceEffectInternal,
+public class DefaultSurfaceProcessor implements SurfaceProcessorInternal,
         SurfaceTexture.OnFrameAvailableListener {
     private final OpenGlRenderer mGlRenderer;
     @VisibleForTesting
@@ -64,18 +64,18 @@
     // Only access this on GL thread.
     private int mInputSurfaceCount = 0;
 
-    /** Constructs DefaultSurfaceEffect */
-    public DefaultSurfaceEffect() {
+    /** Constructs {@link DefaultSurfaceProcessor} with default shaders. */
+    public DefaultSurfaceProcessor() {
         this(ShaderProvider.DEFAULT);
     }
 
     /**
-     * Constructs DefaultSurfaceEffect
+     * Constructs {@link DefaultSurfaceProcessor} with custom shaders.
      *
      * @param shaderProvider custom shader provider for OpenGL rendering.
      * @throws IllegalArgumentException if the shaderProvider provides invalid shader.
      */
-    public DefaultSurfaceEffect(@NonNull ShaderProvider shaderProvider) {
+    public DefaultSurfaceProcessor(@NonNull ShaderProvider shaderProvider) {
         mGlThread = new HandlerThread("GL Thread");
         mGlThread.start();
         mGlHandler = new Handler(mGlThread.getLooper());
@@ -133,7 +133,7 @@
     }
 
     /**
-     * Release the DefaultSurfaceEffect
+     * Release the {@link DefaultSurfaceProcessor}.
      */
     @Override
     public void release() {
@@ -199,7 +199,7 @@
             if (cause instanceof RuntimeException) {
                 throw (RuntimeException) cause;
             } else {
-                throw new IllegalStateException("Failed to create DefaultSurfaceEffect", cause);
+                throw new IllegalStateException("Failed to create DefaultSurfaceProcessor", cause);
             }
         }
     }
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/processing/SettableSurface.java b/camera/camera-core/src/main/java/androidx/camera/core/processing/SettableSurface.java
index 7fe2ce6..dad0080 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/processing/SettableSurface.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/processing/SettableSurface.java
@@ -36,9 +36,9 @@
 import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
 import androidx.camera.core.CameraEffect;
-import androidx.camera.core.SurfaceEffect;
 import androidx.camera.core.SurfaceOutput;
 import androidx.camera.core.SurfaceOutput.GlTransformOptions;
+import androidx.camera.core.SurfaceProcessor;
 import androidx.camera.core.SurfaceRequest;
 import androidx.camera.core.SurfaceRequest.TransformationInfo;
 import androidx.camera.core.UseCase;
@@ -61,7 +61,7 @@
  * an external surface consumer:
  * <pre>
  * {@code PreviewView}(surface provider) <--> {@link SurfaceRequest} <--> {@link SettableSurface}
- *     <--> {@link SurfaceOutput} --> {@link SurfaceEffect}(surface consumer)
+ *     <--> {@link SurfaceOutput} --> {@link SurfaceProcessor}(surface consumer)
  * </pre>
  *
  * <p>For the full workflow, please see {@code SettableSurfaceTest
@@ -240,7 +240,7 @@
      * Creates a {@link SurfaceOutput} that is linked to this {@link SettableSurface}.
      *
      * <p>The {@link SurfaceOutput} is for providing a surface to an external target such
-     * as {@link SurfaceEffect}.
+     * as {@link SurfaceProcessor}.
      *
      * <p>This method returns a {@link ListenableFuture} that completes when the
      * {@link SettableSurface#getSurface()} completes. The {@link SurfaceOutput} contains the
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/processing/ShaderProvider.java b/camera/camera-core/src/main/java/androidx/camera/core/processing/ShaderProvider.java
index 3edf244..cc64c21 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/processing/ShaderProvider.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/processing/ShaderProvider.java
@@ -59,7 +59,7 @@
         return null;
     }
 
-    /** A default provider that will use the default shader code without any effect. */
+    /** A default provider that will use the default shader code without any post-processing. */
     ShaderProvider DEFAULT = new ShaderProvider() {
         // Use default implementation.
     };
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/processing/SurfaceEffectInternal.java b/camera/camera-core/src/main/java/androidx/camera/core/processing/SurfaceEffectInternal.java
deleted file mode 100644
index ea3640d1..0000000
--- a/camera/camera-core/src/main/java/androidx/camera/core/processing/SurfaceEffectInternal.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 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 androidx.camera.core.processing;
-
-import androidx.camera.core.SurfaceEffect;
-
-/**
- * An internal {@link SurfaceEffect} that is releasable.
- *
- * <p>Note: the implementation of this interface must be thread-safe. e.g. methods can be
- * safely invoked on any thread.
- */
-public interface SurfaceEffectInternal extends SurfaceEffect {
-
-    /**
-     * Releases all the resources allocated by the effect.
-     *
-     * <p>An effect created by CameraX should be released by CameraX when it's no longer needed.
-     * On the other hand, an external effect should not be released by CameraX, because CameraX
-     * not does know if the effect will be needed again. In that case, the app is responsible for
-     * releasing the effect. It should be able to keep the effect alive across multiple
-     * attach/detach cycles if it's necessary.
-     *
-     * @see Node#release()
-     */
-    void release();
-}
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/processing/SurfaceEffectWithExecutor.java b/camera/camera-core/src/main/java/androidx/camera/core/processing/SurfaceEffectWithExecutor.java
deleted file mode 100644
index c3113f2..0000000
--- a/camera/camera-core/src/main/java/androidx/camera/core/processing/SurfaceEffectWithExecutor.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright 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 androidx.camera.core.processing;
-
-import static androidx.core.util.Preconditions.checkState;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.VisibleForTesting;
-import androidx.camera.core.SurfaceEffect;
-import androidx.camera.core.SurfaceOutput;
-import androidx.camera.core.SurfaceRequest;
-
-import java.util.concurrent.Executor;
-
-/**
- * A wrapper of a pair of {@link SurfaceEffect} and {@link Executor}.
- *
- * <p> Wraps the external {@link SurfaceEffect} and {@link Executor} provided by the app. It
- * makes sure that CameraX always invoke the {@link SurfaceEffect} on the correct {@link Executor}.
- */
-public class SurfaceEffectWithExecutor implements SurfaceEffectInternal {
-
-    @NonNull
-    private final SurfaceEffect mSurfaceEffect;
-    @NonNull
-    private final Executor mExecutor;
-
-    public SurfaceEffectWithExecutor(
-            @NonNull SurfaceEffect surfaceEffect,
-            @NonNull Executor executor) {
-        checkState(!(surfaceEffect instanceof SurfaceEffectInternal),
-                "SurfaceEffectInternal should always be thread safe. Do not wrap.");
-        mSurfaceEffect = surfaceEffect;
-        mExecutor = executor;
-    }
-
-    @NonNull
-    @VisibleForTesting
-    public SurfaceEffect getSurfaceEffect() {
-        return mSurfaceEffect;
-    }
-
-    @NonNull
-    @VisibleForTesting
-    public Executor getExecutor() {
-        return mExecutor;
-    }
-
-    @Override
-    public void onInputSurface(@NonNull SurfaceRequest request) {
-        mExecutor.execute(() -> mSurfaceEffect.onInputSurface(request));
-    }
-
-    @Override
-    public void onOutputSurface(@NonNull SurfaceOutput surfaceOutput) {
-        mExecutor.execute(() -> mSurfaceEffect.onOutputSurface(surfaceOutput));
-    }
-
-    @Override
-    public void release() {
-        // No-op. External SurfaceEffect should not be released by CameraX.
-    }
-}
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/processing/SurfaceOutputImpl.java b/camera/camera-core/src/main/java/androidx/camera/core/processing/SurfaceOutputImpl.java
index e5dd98b..6a2894a 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/processing/SurfaceOutputImpl.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/processing/SurfaceOutputImpl.java
@@ -36,8 +36,8 @@
 import androidx.annotation.RequiresApi;
 import androidx.annotation.RestrictTo;
 import androidx.camera.core.Logger;
-import androidx.camera.core.SurfaceEffect;
 import androidx.camera.core.SurfaceOutput;
+import androidx.camera.core.SurfaceProcessor;
 import androidx.concurrent.futures.CallbackToFutureAdapter;
 import androidx.core.util.Consumer;
 
@@ -144,7 +144,7 @@
     }
 
     /**
-     * Asks the {@link SurfaceEffect} implementation to stopping writing to the {@link Surface}.
+     * Asks the {@link SurfaceProcessor} implementation to stopping writing to the {@link Surface}.
      */
     public void requestClose() {
         AtomicReference<Consumer<Event>> eventListenerRef = new AtomicReference<>();
@@ -168,7 +168,7 @@
                 // The executor might be invoked after the SurfaceOutputImpl is closed. This
                 // happens if the #close() is called after the synchronized block above but
                 // before the line below.
-                Logger.d(TAG, "Effect executor closed. Close request not posted.", e);
+                Logger.d(TAG, "Processor executor closed. Close request not posted.", e);
             }
         }
     }
@@ -207,7 +207,7 @@
     }
 
     /**
-     * This method can be invoked by the effect implementation on any thread.
+     * This method can be invoked by the processor implementation on any thread.
      *
      * @inheritDoc
      */
@@ -243,7 +243,7 @@
     }
 
     /**
-     * This method can be invoked by the effect implementation on any thread.
+     * This method can be invoked by the processor implementation on any thread.
      */
     @AnyThread
     @Override
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/processing/SurfaceProcessorInternal.java b/camera/camera-core/src/main/java/androidx/camera/core/processing/SurfaceProcessorInternal.java
new file mode 100644
index 0000000..47cbe62
--- /dev/null
+++ b/camera/camera-core/src/main/java/androidx/camera/core/processing/SurfaceProcessorInternal.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 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 androidx.camera.core.processing;
+
+import androidx.camera.core.SurfaceProcessor;
+
+/**
+ * An internal {@link SurfaceProcessor} that is releasable.
+ *
+ * <p>Note: the implementation of this interface must be thread-safe. e.g. methods can be
+ * safely invoked on any thread.
+ */
+public interface SurfaceProcessorInternal extends SurfaceProcessor {
+
+    /**
+     * Releases all the resources allocated by the processor.
+     *
+     * <p>An processor created by CameraX should be released by CameraX when it's no longer needed.
+     * On the other hand, an external processor should not be released by CameraX, because CameraX
+     * not does know if the processor will be needed again. In that case, the app is responsible for
+     * releasing the processor. It should be able to keep the processor alive across multiple
+     * attach/detach cycles if it's necessary.
+     *
+     * @see Node#release()
+     */
+    void release();
+}
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/processing/SurfaceEffectNode.java b/camera/camera-core/src/main/java/androidx/camera/core/processing/SurfaceProcessorNode.java
similarity index 87%
rename from camera/camera-core/src/main/java/androidx/camera/core/processing/SurfaceEffectNode.java
rename to camera/camera-core/src/main/java/androidx/camera/core/processing/SurfaceProcessorNode.java
index 90ceb7a..fd1e4bcf8 100644
--- a/camera/camera-core/src/main/java/androidx/camera/core/processing/SurfaceEffectNode.java
+++ b/camera/camera-core/src/main/java/androidx/camera/core/processing/SurfaceProcessorNode.java
@@ -35,9 +35,9 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
-import androidx.camera.core.SurfaceEffect;
 import androidx.camera.core.SurfaceOutput;
 import androidx.camera.core.SurfaceOutput.GlTransformOptions;
+import androidx.camera.core.SurfaceProcessor;
 import androidx.camera.core.SurfaceRequest;
 import androidx.camera.core.impl.CameraInternal;
 import androidx.camera.core.impl.utils.Threads;
@@ -46,11 +46,11 @@
 import androidx.core.util.Preconditions;
 
 /**
- * A {@link Node} implementation that wraps around the public {@link SurfaceEffect} interface.
+ * A {@link Node} implementation that wraps around the public {@link SurfaceProcessor} interface.
  *
  * <p>Responsibilities:
  * <ul>
- * <li>Calculating transformation and passing it to the {@link SurfaceEffect}.
+ * <li>Calculating transformation and passing it to the {@link SurfaceProcessor}.
  * <li>Tracking the state of previously calculate specification and only recreate the pipeline
  * when necessary.
  * </ul>
@@ -58,11 +58,11 @@
 @RequiresApi(api = 21)
 // TODO(b/233627260): remove once implemented.
 @SuppressWarnings("UnusedVariable")
-public class SurfaceEffectNode implements Node<SurfaceEdge, SurfaceEdge> {
+public class SurfaceProcessorNode implements Node<SurfaceEdge, SurfaceEdge> {
 
     private final GlTransformOptions mGlTransformOptions;
     @NonNull
-    final SurfaceEffectInternal mSurfaceEffect;
+    final SurfaceProcessorInternal mSurfaceProcessor;
     @NonNull
     final CameraInternal mCameraInternal;
     // Guarded by main thread.
@@ -72,18 +72,18 @@
     private SurfaceEdge mInputEdge;
 
     /**
-     * Constructs the surface effect node
+     * Constructs the {@link SurfaceProcessorNode}.
      *
      * @param cameraInternal     the associated camera instance.
      * @param glTransformOptions the OpenGL transformation options.
-     * @param surfaceEffect      the interface to wrap around.
+     * @param surfaceProcessor   the interface to wrap around.
      */
-    public SurfaceEffectNode(@NonNull CameraInternal cameraInternal,
+    public SurfaceProcessorNode(@NonNull CameraInternal cameraInternal,
             @NonNull GlTransformOptions glTransformOptions,
-            @NonNull SurfaceEffectInternal surfaceEffect) {
+            @NonNull SurfaceProcessorInternal surfaceProcessor) {
         mCameraInternal = cameraInternal;
         mGlTransformOptions = glTransformOptions;
-        mSurfaceEffect = surfaceEffect;
+        mSurfaceProcessor = surfaceProcessor;
     }
 
     /**
@@ -99,7 +99,7 @@
         mInputEdge = inputEdge;
         SettableSurface inputSurface = inputEdge.getSurfaces().get(0);
         SettableSurface outputSurface = createOutputSurface(inputSurface);
-        sendSurfacesToEffectWhenReady(inputSurface, outputSurface);
+        sendSurfacesToProcessorWhenReady(inputSurface, outputSurface);
         mOutputEdge = SurfaceEdge.create(singletonList(outputSurface));
         return mOutputEdge;
     }
@@ -156,7 +156,7 @@
         return outputSurface;
     }
 
-    private void sendSurfacesToEffectWhenReady(@NonNull SettableSurface input,
+    private void sendSurfacesToProcessorWhenReady(@NonNull SettableSurface input,
             @NonNull SettableSurface output) {
         SurfaceRequest surfaceRequest = input.createSurfaceRequest(mCameraInternal);
         Futures.addCallback(output.createSurfaceOutputFuture(mGlTransformOptions,
@@ -166,16 +166,16 @@
                     @Override
                     public void onSuccess(@Nullable SurfaceOutput surfaceOutput) {
                         Preconditions.checkNotNull(surfaceOutput);
-                        mSurfaceEffect.onOutputSurface(surfaceOutput);
-                        mSurfaceEffect.onInputSurface(surfaceRequest);
+                        mSurfaceProcessor.onOutputSurface(surfaceOutput);
+                        mSurfaceProcessor.onInputSurface(surfaceRequest);
                         setupSurfaceUpdatePipeline(input, surfaceRequest, output, surfaceOutput);
                     }
 
                     @Override
                     public void onFailure(@NonNull Throwable t) {
-                        // Do not send surfaces to effect if the downstream provider (e.g. the app)
-                        // fails to provide a Surface. Instead, notify the consumer that the
-                        // Surface will not be provided.
+                        // Do not send surfaces to the processor if the downstream provider (e.g.
+                        // the app) fails to provide a Surface. Instead, notify the consumer that
+                        // the Surface will not be provided.
                         surfaceRequest.willNotProvideSurface();
                     }
                 }, mainThreadExecutor());
@@ -201,11 +201,11 @@
      */
     @Override
     public void release() {
-        mSurfaceEffect.release();
+        mSurfaceProcessor.release();
         mainThreadExecutor().execute(() -> {
             if (mOutputEdge != null) {
                 for (SettableSurface surface : mOutputEdge.getSurfaces()) {
-                    // The output DeferrableSurface will later be terminated by the effect.
+                    // The output DeferrableSurface will later be terminated by the processor.
                     surface.close();
                 }
             }
diff --git a/camera/camera-core/src/main/java/androidx/camera/core/processing/SurfaceProcessorWithExecutor.java b/camera/camera-core/src/main/java/androidx/camera/core/processing/SurfaceProcessorWithExecutor.java
new file mode 100644
index 0000000..87a8644
--- /dev/null
+++ b/camera/camera-core/src/main/java/androidx/camera/core/processing/SurfaceProcessorWithExecutor.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 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 androidx.camera.core.processing;
+
+import static androidx.core.util.Preconditions.checkState;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.VisibleForTesting;
+import androidx.camera.core.SurfaceOutput;
+import androidx.camera.core.SurfaceProcessor;
+import androidx.camera.core.SurfaceRequest;
+
+import java.util.concurrent.Executor;
+
+/**
+ * A wrapper of a pair of {@link SurfaceProcessor} and {@link Executor}.
+ *
+ * <p> Wraps the external {@link SurfaceProcessor} and {@link Executor} provided by the app. It
+ * makes sure that CameraX always invoke the {@link SurfaceProcessor} on the correct
+ * {@link Executor}.
+ */
+public class SurfaceProcessorWithExecutor implements SurfaceProcessorInternal {
+
+    @NonNull
+    private final SurfaceProcessor mSurfaceProcessor;
+    @NonNull
+    private final Executor mExecutor;
+
+    public SurfaceProcessorWithExecutor(
+            @NonNull SurfaceProcessor surfaceProcessor,
+            @NonNull Executor executor) {
+        checkState(!(surfaceProcessor instanceof SurfaceProcessorInternal),
+                "SurfaceProcessorInternal should always be thread safe. Do not wrap.");
+        mSurfaceProcessor = surfaceProcessor;
+        mExecutor = executor;
+    }
+
+    @NonNull
+    @VisibleForTesting
+    public SurfaceProcessor getProcessor() {
+        return mSurfaceProcessor;
+    }
+
+    @NonNull
+    @VisibleForTesting
+    public Executor getExecutor() {
+        return mExecutor;
+    }
+
+    @Override
+    public void onInputSurface(@NonNull SurfaceRequest request) {
+        mExecutor.execute(() -> mSurfaceProcessor.onInputSurface(request));
+    }
+
+    @Override
+    public void onOutputSurface(@NonNull SurfaceOutput surfaceOutput) {
+        mExecutor.execute(() -> mSurfaceProcessor.onOutputSurface(surfaceOutput));
+    }
+
+    @Override
+    public void release() {
+        // No-op. External SurfaceProcessor should not be released by CameraX.
+    }
+}
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/CameraSelectorTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/CameraSelectorTest.kt
index f23fbd7..621932c 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/CameraSelectorTest.kt
+++ b/camera/camera-core/src/test/java/androidx/camera/core/CameraSelectorTest.kt
@@ -23,6 +23,7 @@
 import androidx.camera.testing.fakes.FakeCameraFactory
 import androidx.camera.testing.fakes.FakeCameraInfoInternal
 import com.google.common.truth.Truth.assertThat
+import java.util.concurrent.ExecutionException
 import org.junit.Before
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -30,8 +31,6 @@
 import org.robolectric.RobolectricTestRunner
 import org.robolectric.annotation.Config
 import org.robolectric.annotation.internal.DoNotInstrument
-import java.util.LinkedHashSet
-import java.util.concurrent.ExecutionException
 
 @RunWith(RobolectricTestRunner::class)
 @DoNotInstrument
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/EffectBundleTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/EffectBundleTest.kt
index 616fb90..de2b346 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/EffectBundleTest.kt
+++ b/camera/camera-core/src/test/java/androidx/camera/core/EffectBundleTest.kt
@@ -17,9 +17,9 @@
 package androidx.camera.core
 
 import android.os.Build
-import androidx.camera.core.SurfaceEffect.PREVIEW
+import androidx.camera.core.SurfaceProcessor.PREVIEW
 import androidx.camera.core.impl.utils.executor.CameraXExecutors.mainThreadExecutor
-import androidx.camera.testing.fakes.FakeSurfaceEffect
+import androidx.camera.testing.fakes.FakeSurfaceProcessor
 import com.google.common.truth.Truth.assertThat
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -42,21 +42,24 @@
 
     @Test(expected = IllegalArgumentException::class)
     fun addMoreThanOnePreviewEffect_throwsException() {
-        val surfaceEffect = FakeSurfaceEffect(mainThreadExecutor())
+        val surfaceProcessor = FakeSurfaceProcessor(mainThreadExecutor())
         EffectBundle.Builder(mainThreadExecutor())
-            .addEffect(PREVIEW, surfaceEffect)
-            .addEffect(PREVIEW, surfaceEffect)
+            .addEffect(PREVIEW, surfaceProcessor)
+            .addEffect(PREVIEW, surfaceProcessor)
     }
 
     @Test
     fun addPreviewEffect_hasPreviewEffect() {
         // Arrange.
-        val surfaceEffect = FakeSurfaceEffect(mainThreadExecutor())
+        val surfaceProcessor =
+            FakeSurfaceProcessor(mainThreadExecutor())
         // Act.
         val effectBundle = EffectBundle.Builder(mainThreadExecutor())
-            .addEffect(PREVIEW, surfaceEffect)
+            .addEffect(PREVIEW, surfaceProcessor)
             .build()
         // Assert.
-        assertThat(effectBundle.effects.values.first() as SurfaceEffect).isEqualTo(surfaceEffect)
+        assertThat(effectBundle.effects.values.first() as SurfaceProcessor).isEqualTo(
+            surfaceProcessor
+        )
     }
 }
\ No newline at end of file
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/PreviewTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/PreviewTest.kt
index 06db2e8..5f64956 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/PreviewTest.kt
+++ b/camera/camera-core/src/test/java/androidx/camera/core/PreviewTest.kt
@@ -35,14 +35,14 @@
 import androidx.camera.core.impl.utils.executor.CameraXExecutors
 import androidx.camera.core.impl.utils.executor.CameraXExecutors.mainThreadExecutor
 import androidx.camera.core.internal.CameraUseCaseAdapter
-import androidx.camera.core.processing.SurfaceEffectInternal
+import androidx.camera.core.processing.SurfaceProcessorInternal
 import androidx.camera.testing.CameraUtil
 import androidx.camera.testing.CameraXUtil
 import androidx.camera.testing.fakes.FakeAppConfig
 import androidx.camera.testing.fakes.FakeCamera
 import androidx.camera.testing.fakes.FakeCameraDeviceSurfaceManager
 import androidx.camera.testing.fakes.FakeCameraFactory
-import androidx.camera.testing.fakes.FakeSurfaceEffectInternal
+import androidx.camera.testing.fakes.FakeSurfaceProcessorInternal
 import androidx.camera.testing.fakes.FakeUseCase
 import androidx.test.core.app.ApplicationProvider
 import com.google.common.truth.Truth.assertThat
@@ -217,10 +217,13 @@
     @Test
     fun bindAndUnbindPreview_surfacesPropagated() {
         // Arrange.
-        val effect = FakeSurfaceEffectInternal(mainThreadExecutor(), false)
+        val processor = FakeSurfaceProcessorInternal(
+            mainThreadExecutor(),
+            false
+        )
 
         // Act: create pipeline in Preview and provide Surface.
-        val preview = createPreviewPipelineAndAttachEffect(effect)
+        val preview = createPreviewPipelineAndAttachProcessor(processor)
         val surfaceRequest = preview.mCurrentSurfaceRequest!!
         var appSurfaceReadyToRelease = false
         surfaceRequest.provideSurface(appSurface, mainThreadExecutor()) {
@@ -229,26 +232,27 @@
         shadowOf(getMainLooper()).idle()
 
         // Assert: surfaceOutput received.
-        assertThat(effect.surfaceOutput).isNotNull()
-        assertThat(effect.isReleased).isFalse()
-        assertThat(effect.isOutputSurfaceRequestedToClose).isFalse()
-        assertThat(effect.isInputSurfaceReleased).isFalse()
+        assertThat(processor.surfaceOutput).isNotNull()
+        assertThat(processor.isReleased).isFalse()
+        assertThat(processor.isOutputSurfaceRequestedToClose).isFalse()
+        assertThat(processor.isInputSurfaceReleased).isFalse()
         assertThat(appSurfaceReadyToRelease).isFalse()
-        // effect surface is provided to camera.
-        assertThat(preview.sessionConfig.surfaces[0].surface.get()).isEqualTo(effect.inputSurface)
+        // processor surface is provided to camera.
+        assertThat(preview.sessionConfig.surfaces[0].surface.get())
+            .isEqualTo(processor.inputSurface)
 
         // Act: unbind Preview.
         preview.onDetached()
         shadowOf(getMainLooper()).idle()
 
-        // Assert: effect and effect surface is released.
-        assertThat(effect.isReleased).isTrue()
-        assertThat(effect.isOutputSurfaceRequestedToClose).isTrue()
-        assertThat(effect.isInputSurfaceReleased).isTrue()
+        // Assert: processor and processor surface is released.
+        assertThat(processor.isReleased).isTrue()
+        assertThat(processor.isOutputSurfaceRequestedToClose).isTrue()
+        assertThat(processor.isInputSurfaceReleased).isTrue()
         assertThat(appSurfaceReadyToRelease).isFalse()
 
         // Act: close SurfaceOutput
-        effect.surfaceOutput!!.close()
+        processor.surfaceOutput!!.close()
         shadowOf(getMainLooper()).idle()
         assertThat(appSurfaceReadyToRelease).isTrue()
     }
@@ -256,8 +260,10 @@
     @Test
     fun invokedErrorListener_recreatePipeline() {
         // Arrange: create pipeline and get a reference of the SessionConfig.
-        val effect = FakeSurfaceEffectInternal(mainThreadExecutor())
-        val preview = createPreviewPipelineAndAttachEffect(effect)
+        val processor = FakeSurfaceProcessorInternal(
+            mainThreadExecutor()
+        )
+        val preview = createPreviewPipelineAndAttachProcessor(processor)
         val originalSessionConfig = preview.sessionConfig
 
         // Act: invoke the error listener.
@@ -432,13 +438,13 @@
         return Pair(surfaceRequest!!, transformationInfo!!)
     }
 
-    private fun createPreviewPipelineAndAttachEffect(
-        surfaceEffect: SurfaceEffectInternal?
+    private fun createPreviewPipelineAndAttachProcessor(
+        surfaceProcessor: SurfaceProcessorInternal?
     ): Preview {
         val preview = Preview.Builder()
             .setTargetRotation(Surface.ROTATION_0)
             .build()
-        preview.effect = surfaceEffect
+        preview.processor = surfaceProcessor
         preview.setSurfaceProvider(CameraXExecutors.directExecutor()) {}
         val previewConfig = PreviewConfig(
             cameraXConfig.getUseCaseConfigFactoryProvider(null)!!.newInstance(context).getConfig(
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/VideoCaptureTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/VideoCaptureTest.kt
index 27af2cf..7c67cdd 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/VideoCaptureTest.kt
+++ b/camera/camera-core/src/test/java/androidx/camera/core/VideoCaptureTest.kt
@@ -26,6 +26,7 @@
 import androidx.camera.testing.fakes.FakeCamera
 import androidx.camera.testing.fakes.FakeCameraFactory
 import androidx.test.core.app.ApplicationProvider
+import java.io.File
 import org.junit.After
 import org.junit.Before
 import org.junit.Test
@@ -39,7 +40,6 @@
 import org.robolectric.Shadows.shadowOf
 import org.robolectric.annotation.Config
 import org.robolectric.annotation.internal.DoNotInstrument
-import java.io.File
 
 @RunWith(RobolectricTestRunner::class)
 @DoNotInstrument
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/imagecapture/FakeTakePictureCallback.kt b/camera/camera-core/src/test/java/androidx/camera/core/imagecapture/FakeTakePictureCallback.kt
index 9f525f0..6f17fe5 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/imagecapture/FakeTakePictureCallback.kt
+++ b/camera/camera-core/src/test/java/androidx/camera/core/imagecapture/FakeTakePictureCallback.kt
@@ -30,6 +30,7 @@
     var captureFailure: ImageCaptureException? = null
     var processFailure: ImageCaptureException? = null
     var onDiskResult: OutputFileResults? = null
+    var aborted = false
 
     override fun onImageCaptured() {
         onImageCapturedCalled = true
@@ -50,4 +51,8 @@
     override fun onProcessFailure(imageCaptureException: ImageCaptureException) {
         processFailure = imageCaptureException
     }
+
+    override fun isAborted(): Boolean {
+        return aborted
+    }
 }
\ No newline at end of file
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/imagecapture/ProcessingNodeTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/imagecapture/ProcessingNodeTest.kt
index 61d1c56..b46c79e 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/imagecapture/ProcessingNodeTest.kt
+++ b/camera/camera-core/src/test/java/androidx/camera/core/imagecapture/ProcessingNodeTest.kt
@@ -70,6 +70,31 @@
     }
 
     @Test
+    fun processAbortedRequest_noOps() {
+        // Arrange: create a request with aborted callback.
+        val callback = FakeTakePictureCallback()
+        callback.aborted = true
+        val request = ProcessingRequest(
+            { listOf() },
+            OUTPUT_FILE_OPTIONS,
+            Rect(0, 0, WIDTH, HEIGHT),
+            ROTATION_DEGREES,
+            /*jpegQuality=*/100,
+            SENSOR_TO_BUFFER,
+            callback
+        )
+
+        // Act: process the request.
+        val jpegBytes = createJpegBytes(WIDTH, HEIGHT)
+        val image = createJpegFakeImageProxy(jpegBytes)
+        processingNodeIn.edge.accept(ProcessingNode.InputPacket.of(request, image))
+        shadowOf(getMainLooper()).idle()
+
+        // Assert: the image is not saved.
+        assertThat(callback.onDiskResult).isNull()
+    }
+
+    @Test
     fun cropRectEqualsImageRect_croppingNotInvoked() {
         // Arrange: create a request with no cropping
         val callback = FakeTakePictureCallback()
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/imagecapture/RequestWithCallbackTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/imagecapture/RequestWithCallbackTest.kt
new file mode 100644
index 0000000..8789904
--- /dev/null
+++ b/camera/camera-core/src/test/java/androidx/camera/core/imagecapture/RequestWithCallbackTest.kt
@@ -0,0 +1,123 @@
+/*
+ * Copyright 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 androidx.camera.core.imagecapture
+
+import android.os.Build
+import android.os.Looper.getMainLooper
+import androidx.camera.core.ImageCapture
+import androidx.camera.core.ImageCapture.ERROR_CAMERA_CLOSED
+import androidx.camera.core.ImageCapture.ERROR_CAPTURE_FAILED
+import androidx.camera.core.ImageCaptureException
+import androidx.camera.core.ImageProxy
+import androidx.camera.testing.fakes.FakeImageInfo
+import androidx.camera.testing.fakes.FakeImageProxy
+import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+import org.robolectric.Shadows.shadowOf
+import org.robolectric.annotation.Config
+import org.robolectric.annotation.internal.DoNotInstrument
+
+/**
+ * Unit tests for [RequestWithCallback]
+ */
+@RunWith(RobolectricTestRunner::class)
+@DoNotInstrument
+@Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
+class RequestWithCallbackTest {
+
+    private lateinit var abortError: ImageCaptureException
+    private lateinit var otherError: ImageCaptureException
+    private lateinit var imageResult: ImageProxy
+    private lateinit var fileResult: ImageCapture.OutputFileResults
+
+    @Before
+    fun setUp() {
+        abortError = ImageCaptureException(ERROR_CAMERA_CLOSED, "", null)
+        otherError = ImageCaptureException(ERROR_CAPTURE_FAILED, "", null)
+        imageResult = FakeImageProxy(FakeImageInfo())
+        fileResult = ImageCapture.OutputFileResults(null)
+    }
+
+    @Test
+    fun abortRequestThenSendOtherErrors_receiveAbortError() {
+        // Arrange.
+        val request = FakeTakePictureRequest(FakeTakePictureRequest.Type.IN_MEMORY)
+        val callback = RequestWithCallback(request)
+        // Act.
+        callback.abort(abortError)
+        callback.onCaptureFailure(otherError)
+        callback.onProcessFailure(otherError)
+        shadowOf(getMainLooper()).idle()
+        // Assert.
+        assertThat(request.exceptionReceived).isEqualTo(abortError)
+    }
+
+    @Test
+    fun sendInMemoryResult_receiveResult() {
+        // Arrange.
+        val request = FakeTakePictureRequest(FakeTakePictureRequest.Type.IN_MEMORY)
+        val callback = RequestWithCallback(request)
+        // Act.
+        callback.onImageCaptured()
+        callback.onFinalResult(imageResult)
+        shadowOf(getMainLooper()).idle()
+        // Assert.
+        assertThat(request.imageReceived).isEqualTo(imageResult)
+    }
+
+    @Test
+    fun abortRequestAndSendInMemoryResult_doNotReceiveResult() {
+        // Arrange.
+        val request = FakeTakePictureRequest(FakeTakePictureRequest.Type.IN_MEMORY)
+        val callback = RequestWithCallback(request)
+        // Act.
+        callback.abort(abortError)
+        callback.onFinalResult(imageResult)
+        shadowOf(getMainLooper()).idle()
+        // Assert.
+        assertThat(request.imageReceived).isNull()
+    }
+
+    @Test
+    fun sendOnDiskResult_receiveResult() {
+        // Arrange.
+        val request = FakeTakePictureRequest(FakeTakePictureRequest.Type.ON_DISK)
+        val callback = RequestWithCallback(request)
+        // Act.
+        callback.onImageCaptured()
+        callback.onFinalResult(fileResult)
+        shadowOf(getMainLooper()).idle()
+        // Assert.
+        assertThat(request.fileReceived).isEqualTo(fileResult)
+    }
+
+    @Test
+    fun abortRequestAndSendOnDiskResult_doNotReceiveResult() {
+        // Arrange.
+        val request = FakeTakePictureRequest(FakeTakePictureRequest.Type.ON_DISK)
+        val callback = RequestWithCallback(request)
+        // Act.
+        callback.abort(abortError)
+        callback.onFinalResult(imageResult)
+        shadowOf(getMainLooper()).idle()
+        // Assert.
+        assertThat(request.imageReceived).isNull()
+    }
+}
\ No newline at end of file
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/imagecapture/TakePictureManagerTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/imagecapture/TakePictureManagerTest.kt
index ccd2d63..1a068e8 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/imagecapture/TakePictureManagerTest.kt
+++ b/camera/camera-core/src/test/java/androidx/camera/core/imagecapture/TakePictureManagerTest.kt
@@ -53,6 +53,36 @@
         imagePipeline.close()
     }
 
+    @Test
+    fun abortRequests_receiveErrorCallback() {
+        // Arrange: send 2 request.
+        val request1 = FakeTakePictureRequest(FakeTakePictureRequest.Type.IN_MEMORY)
+        val request2 = FakeTakePictureRequest(FakeTakePictureRequest.Type.IN_MEMORY)
+        takePictureManager.offerRequest(request1)
+        takePictureManager.offerRequest(request2)
+
+        // Act: ab the manage and finish the 1st request.
+        takePictureManager.abortRequests()
+        // Camera returns the image, but it should be ignored.
+        val processingRequest = imagePipeline.getProcessingRequest(request1)
+        processingRequest.onImageCaptured()
+        processingRequest.onFinalResult(FakeImageProxy(FakeImageInfo()))
+        shadowOf(getMainLooper()).idle()
+
+        // Assert: one request is sent.
+        assertThat(imageCaptureControl.actions).containsExactly(
+            FakeImageCaptureControl.Action.LOCK_FLASH,
+            FakeImageCaptureControl.Action.SUBMIT_REQUESTS,
+            FakeImageCaptureControl.Action.UNLOCK_FLASH,
+        ).inOrder()
+        // Both request are aborted.
+        assertThat((request1.exceptionReceived as ImageCaptureException).imageCaptureError)
+            .isEqualTo(ERROR_CAMERA_CLOSED)
+        assertThat((request2.exceptionReceived as ImageCaptureException).imageCaptureError)
+            .isEqualTo(ERROR_CAMERA_CLOSED)
+        assertThat(takePictureManager.mNewRequests).isEmpty()
+    }
+
     @Test(expected = IllegalStateException::class)
     fun callOnFailureTwice_throwsException() {
         // Arrange.
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/impl/utils/ExifDataTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/impl/utils/ExifDataTest.kt
index ac6541c..01bd6ee 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/impl/utils/ExifDataTest.kt
+++ b/camera/camera-core/src/test/java/androidx/camera/core/impl/utils/ExifDataTest.kt
@@ -22,12 +22,12 @@
 import androidx.exifinterface.media.ExifInterface.FLAG_FLASH_FIRED
 import androidx.exifinterface.media.ExifInterface.FLAG_FLASH_NO_FLASH_FUNCTION
 import com.google.common.truth.Truth.assertThat
+import java.util.concurrent.TimeUnit
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.robolectric.RobolectricTestRunner
 import org.robolectric.annotation.Config
 import org.robolectric.annotation.internal.DoNotInstrument
-import java.util.concurrent.TimeUnit
 
 @RunWith(RobolectricTestRunner::class)
 @DoNotInstrument
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/internal/CameraUseCaseAdapterTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/internal/CameraUseCaseAdapterTest.kt
index c3e5bda..bd9048e 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/internal/CameraUseCaseAdapterTest.kt
+++ b/camera/camera-core/src/test/java/androidx/camera/core/internal/CameraUseCaseAdapterTest.kt
@@ -25,7 +25,7 @@
 import androidx.camera.core.EffectBundle
 import androidx.camera.core.ImageCapture
 import androidx.camera.core.Preview
-import androidx.camera.core.SurfaceEffect.PREVIEW
+import androidx.camera.core.SurfaceProcessor.PREVIEW
 import androidx.camera.core.UseCase
 import androidx.camera.core.ViewPort
 import androidx.camera.core.impl.CameraConfig
@@ -36,10 +36,10 @@
 import androidx.camera.core.impl.OptionsBundle
 import androidx.camera.core.impl.UseCaseConfigFactory
 import androidx.camera.core.impl.utils.executor.CameraXExecutors.mainThreadExecutor
-import androidx.camera.core.processing.SurfaceEffectWithExecutor
+import androidx.camera.core.processing.SurfaceProcessorWithExecutor
 import androidx.camera.testing.fakes.FakeCamera
 import androidx.camera.testing.fakes.FakeCameraDeviceSurfaceManager
-import androidx.camera.testing.fakes.FakeSurfaceEffect
+import androidx.camera.testing.fakes.FakeSurfaceProcessor
 import androidx.camera.testing.fakes.FakeUseCase
 import androidx.camera.testing.fakes.FakeUseCaseConfig
 import androidx.camera.testing.fakes.FakeUseCaseConfigFactory
@@ -69,7 +69,7 @@
 @org.robolectric.annotation.Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
 class CameraUseCaseAdapterTest {
 
-    private lateinit var surfaceEffect: FakeSurfaceEffect
+    private lateinit var surfaceProcessor: FakeSurfaceProcessor
     private lateinit var effectBundle: EffectBundle
     private lateinit var executor: ExecutorService
 
@@ -84,14 +84,14 @@
         fakeCamera = FakeCamera(CAMERA_ID)
         useCaseConfigFactory = FakeUseCaseConfigFactory()
         fakeCameraSet.add(fakeCamera)
-        surfaceEffect = FakeSurfaceEffect(mainThreadExecutor())
+        surfaceProcessor = FakeSurfaceProcessor(mainThreadExecutor())
         executor = Executors.newSingleThreadExecutor()
-        effectBundle = EffectBundle.Builder(executor).addEffect(PREVIEW, surfaceEffect).build()
+        effectBundle = EffectBundle.Builder(executor).addEffect(PREVIEW, surfaceProcessor).build()
     }
 
     @After
     fun tearDown() {
-        surfaceEffect.cleanUp()
+        surfaceProcessor.cleanUp()
         executor.shutdown()
     }
 
@@ -619,14 +619,14 @@
         val preview = Preview.Builder().setSessionOptionUnpacker { _, _ -> }.build()
         // Act: update use cases with effects bundle
         CameraUseCaseAdapter.updateEffects(effectBundle, listOf(preview))
-        // Assert: preview has effect wrapped with the right executor.
-        val previewEffect = preview.effect as SurfaceEffectWithExecutor
-        assertThat(previewEffect.surfaceEffect).isEqualTo(surfaceEffect)
-        assertThat(previewEffect.executor).isEqualTo(executor)
+        // Assert: preview has processor wrapped with the right executor.
+        val previewProcessor = preview.processor as SurfaceProcessorWithExecutor
+        assertThat(previewProcessor.processor).isEqualTo(surfaceProcessor)
+        assertThat(previewProcessor.executor).isEqualTo(executor)
         // Act: update again with null effects bundle
         CameraUseCaseAdapter.updateEffects(null, listOf(preview))
-        // Assert: preview no longer has effects.
-        assertThat(preview.effect).isNull()
+        // Assert: preview no longer has processors.
+        assertThat(preview.processor).isNull()
     }
 
     private fun createCoexistingRequiredRuleCameraConfig(): CameraConfig {
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/processing/SettableSurfaceTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/processing/SettableSurfaceTest.kt
index 1514784..a409ec67 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/processing/SettableSurfaceTest.kt
+++ b/camera/camera-core/src/test/java/androidx/camera/core/processing/SettableSurfaceTest.kt
@@ -24,12 +24,12 @@
 import android.os.Looper.getMainLooper
 import android.util.Size
 import android.view.Surface
-import androidx.camera.core.SurfaceEffect
 import androidx.camera.core.SurfaceOutput
 import androidx.camera.core.SurfaceOutput.GlTransformOptions.USE_SURFACE_TEXTURE_TRANSFORM
+import androidx.camera.core.SurfaceProcessor
 import androidx.camera.core.SurfaceRequest
-import androidx.camera.core.SurfaceRequest.TransformationInfo
 import androidx.camera.core.SurfaceRequest.Result.RESULT_REQUEST_CANCELLED
+import androidx.camera.core.SurfaceRequest.TransformationInfo
 import androidx.camera.core.impl.DeferrableSurface.SurfaceClosedException
 import androidx.camera.core.impl.DeferrableSurface.SurfaceUnavailableException
 import androidx.camera.core.impl.ImmediateSurface
@@ -70,7 +70,7 @@
     @Before
     fun setUp() {
         settableSurface = SettableSurface(
-            SurfaceEffect.PREVIEW, Size(640, 480), ImageFormat.PRIVATE,
+            SurfaceProcessor.PREVIEW, Size(640, 480), ImageFormat.PRIVATE,
             Matrix(), true, Rect(), 0, false
         )
         fakeSurfaceTexture = SurfaceTexture(0)
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/processing/SurfaceOutputImplTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/processing/SurfaceOutputImplTest.kt
index f056808..e6d0b85 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/processing/SurfaceOutputImplTest.kt
+++ b/camera/camera-core/src/test/java/androidx/camera/core/processing/SurfaceOutputImplTest.kt
@@ -22,9 +22,9 @@
 import android.os.Looper
 import android.util.Size
 import android.view.Surface
-import androidx.camera.core.SurfaceEffect
 import androidx.camera.core.SurfaceOutput.GlTransformOptions
 import androidx.camera.core.SurfaceOutput.GlTransformOptions.USE_SURFACE_TEXTURE_TRANSFORM
+import androidx.camera.core.SurfaceProcessor
 import androidx.camera.core.impl.utils.TransformUtils.sizeToRect
 import androidx.camera.core.impl.utils.executor.CameraXExecutors.mainThreadExecutor
 import com.google.common.truth.Truth.assertThat
@@ -46,7 +46,7 @@
 class SurfaceOutputImplTest {
 
     companion object {
-        private const val TARGET = SurfaceEffect.PREVIEW
+        private const val TARGET = SurfaceProcessor.PREVIEW
         private const val FORMAT = PixelFormat.RGBA_8888
         private val OUTPUT_SIZE = Size(640, 480)
         private val INPUT_SIZE = Size(640, 480)
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/processing/SurfaceEffectNodeTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/processing/SurfaceProcessorNodeTest.kt
similarity index 83%
rename from camera/camera-core/src/test/java/androidx/camera/core/processing/SurfaceEffectNodeTest.kt
rename to camera/camera-core/src/test/java/androidx/camera/core/processing/SurfaceProcessorNodeTest.kt
index dea1462..abbbda5 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/processing/SurfaceEffectNodeTest.kt
+++ b/camera/camera-core/src/test/java/androidx/camera/core/processing/SurfaceProcessorNodeTest.kt
@@ -23,10 +23,10 @@
 import android.os.Looper.getMainLooper
 import android.util.Size
 import android.view.Surface
-import androidx.camera.core.SurfaceEffect.PREVIEW
 import androidx.camera.core.SurfaceOutput.GlTransformOptions
 import androidx.camera.core.SurfaceOutput.GlTransformOptions.APPLY_CROP_ROTATE_AND_MIRRORING
 import androidx.camera.core.SurfaceOutput.GlTransformOptions.USE_SURFACE_TEXTURE_TRANSFORM
+import androidx.camera.core.SurfaceProcessor.PREVIEW
 import androidx.camera.core.SurfaceRequest
 import androidx.camera.core.SurfaceRequest.TransformationInfo
 import androidx.camera.core.impl.utils.TransformUtils.is90or270
@@ -34,7 +34,7 @@
 import androidx.camera.core.impl.utils.executor.CameraXExecutors.mainThreadExecutor
 import androidx.camera.core.impl.utils.futures.Futures
 import androidx.camera.testing.fakes.FakeCamera
-import androidx.camera.testing.fakes.FakeSurfaceEffectInternal
+import androidx.camera.testing.fakes.FakeSurfaceProcessorInternal
 import com.google.common.truth.Truth.assertThat
 import org.junit.After
 import org.junit.Before
@@ -46,12 +46,12 @@
 import org.robolectric.annotation.internal.DoNotInstrument
 
 /**
- * Unit tests for [SurfaceEffectNode].
+ * Unit tests for [SurfaceProcessorNode].
  */
 @RunWith(RobolectricTestRunner::class)
 @DoNotInstrument
 @Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
-class SurfaceEffectNodeTest {
+class SurfaceProcessorNodeTest {
 
     companion object {
         private const val TARGET = PREVIEW
@@ -61,10 +61,10 @@
         private val CROP_RECT = Rect(0, 0, 600, 400)
     }
 
-    private lateinit var surfaceEffectInternal: FakeSurfaceEffectInternal
+    private lateinit var surfaceProcessorInternal: FakeSurfaceProcessorInternal
     private lateinit var appSurface: Surface
     private lateinit var appSurfaceTexture: SurfaceTexture
-    private lateinit var node: SurfaceEffectNode
+    private lateinit var node: SurfaceProcessorNode
     private lateinit var inputEdge: SurfaceEdge
     private lateinit var outputSurfaceRequest: SurfaceRequest
     private var outputTransformInfo: TransformationInfo? = null
@@ -73,14 +73,14 @@
     fun setup() {
         appSurfaceTexture = SurfaceTexture(0)
         appSurface = Surface(appSurfaceTexture)
-        surfaceEffectInternal = FakeSurfaceEffectInternal(mainThreadExecutor())
+        surfaceProcessorInternal = FakeSurfaceProcessorInternal(mainThreadExecutor())
     }
 
     @After
     fun tearDown() {
         appSurfaceTexture.release()
         appSurface.release()
-        surfaceEffectInternal.release()
+        surfaceProcessorInternal.release()
         if (::node.isInitialized) {
             node.release()
         }
@@ -96,7 +96,7 @@
     @Test
     fun transformInput_useSurfaceTextureTransform_outputHasTheSameProperty() {
         // Arrange.
-        createSurfaceEffectNode()
+        createSurfaceProcessorNode()
         createInputEdge()
         val inputSurface = inputEdge.surfaces[0]
 
@@ -120,7 +120,7 @@
         val cropRect = Rect(200, 100, 600, 400)
         for (rotationDegrees in arrayOf(0, 90, 180, 270)) {
             // Arrange.
-            createSurfaceEffectNode(APPLY_CROP_ROTATE_AND_MIRRORING)
+            createSurfaceProcessorNode(APPLY_CROP_ROTATE_AND_MIRRORING)
             createInputEdge(
                 size = rectToSize(cropRect),
                 cropRect = cropRect,
@@ -153,7 +153,7 @@
     fun transformInput_applyCropRotateAndMirroring_outputHasNoMirroring() {
         for (mirroring in arrayOf(false, true)) {
             // Arrange.
-            createSurfaceEffectNode(APPLY_CROP_ROTATE_AND_MIRRORING)
+            createSurfaceProcessorNode(APPLY_CROP_ROTATE_AND_MIRRORING)
             createInputEdge(mirroring = mirroring)
 
             // Act.
@@ -173,7 +173,7 @@
     @Test
     fun transformInput_applyCropRotateAndMirroring_initialTransformInfoIsPropagated() {
         // Arrange.
-        createSurfaceEffectNode(APPLY_CROP_ROTATE_AND_MIRRORING)
+        createSurfaceProcessorNode(APPLY_CROP_ROTATE_AND_MIRRORING)
         createInputEdge(rotationDegrees = 90, cropRect = Rect(0, 0, 600, 400))
 
         // Act.
@@ -182,9 +182,9 @@
         createOutputSurfaceRequestAndProvideSurface(outputSurface)
         shadowOf(getMainLooper()).idle()
 
-        // Assert: surfaceOutput of SurfaceEffect will consume the initial rotation degrees and
+        // Assert: surfaceOutput of SurfaceProcessor will consume the initial rotation degrees and
         // output surface will receive 0 degrees.
-        assertThat(surfaceEffectInternal.surfaceOutput!!.rotationDegrees).isEqualTo(90)
+        assertThat(surfaceProcessorInternal.surfaceOutput!!.rotationDegrees).isEqualTo(90)
         assertThat(outputTransformInfo!!.rotationDegrees).isEqualTo(0)
         assertThat(outputTransformInfo!!.cropRect).isEqualTo(Rect(0, 0, 400, 600))
     }
@@ -192,7 +192,7 @@
     @Test
     fun setRotationToInput_applyCropRotateAndMirroring_rotationIsPropagated() {
         // Arrange.
-        createSurfaceEffectNode(APPLY_CROP_ROTATE_AND_MIRRORING)
+        createSurfaceProcessorNode(APPLY_CROP_ROTATE_AND_MIRRORING)
         createInputEdge(rotationDegrees = 90)
         val inputSurface = inputEdge.surfaces[0]
         val outputEdge = node.transform(inputEdge)
@@ -204,16 +204,16 @@
         inputSurface.rotationDegrees = 270
         shadowOf(getMainLooper()).idle()
 
-        // Assert: surfaceOutput of SurfaceEffect will consume the initial rotation degrees and
+        // Assert: surfaceOutput of SurfaceProcessor will consume the initial rotation degrees and
         // output surface will receive the remaining degrees.
-        assertThat(surfaceEffectInternal.surfaceOutput!!.rotationDegrees).isEqualTo(90)
+        assertThat(surfaceProcessorInternal.surfaceOutput!!.rotationDegrees).isEqualTo(90)
         assertThat(outputTransformInfo!!.rotationDegrees).isEqualTo(180)
     }
 
     @Test
     fun provideSurfaceToOutput_surfaceIsPropagatedE2E() {
         // Arrange.
-        createSurfaceEffectNode()
+        createSurfaceProcessorNode()
         createInputEdge()
         val inputSurface = inputEdge.surfaces[0]
         val outputEdge = node.transform(inputEdge)
@@ -223,15 +223,15 @@
         outputSurface.setProvider(Futures.immediateFuture(appSurface))
         shadowOf(getMainLooper()).idle()
 
-        // Assert: effect receives app Surface. CameraX receives effect Surface.
-        assertThat(surfaceEffectInternal.outputSurface).isEqualTo(appSurface)
-        assertThat(inputSurface.surface.get()).isEqualTo(surfaceEffectInternal.inputSurface)
+        // Assert: processor receives app Surface. CameraX receives processor Surface.
+        assertThat(surfaceProcessorInternal.outputSurface).isEqualTo(appSurface)
+        assertThat(inputSurface.surface.get()).isEqualTo(surfaceProcessorInternal.inputSurface)
     }
 
     @Test
-    fun releaseNode_effectIsReleased() {
+    fun releaseNode_processorIsReleased() {
         // Arrange.
-        createSurfaceEffectNode()
+        createSurfaceProcessorNode()
         createInputEdge()
         val outputSurface = node.transform(inputEdge).surfaces[0]
         outputSurface.setProvider(Futures.immediateFuture(appSurface))
@@ -241,9 +241,9 @@
         node.release()
         shadowOf(getMainLooper()).idle()
 
-        // Assert: effect is released and has requested effect to close the SurfaceOutput
-        assertThat(surfaceEffectInternal.isReleased).isTrue()
-        assertThat(surfaceEffectInternal.isOutputSurfaceRequestedToClose).isTrue()
+        // Assert: processor is released and has requested processor to close the SurfaceOutput
+        assertThat(surfaceProcessorInternal.isReleased).isTrue()
+        assertThat(surfaceProcessorInternal.isOutputSurfaceRequestedToClose).isTrue()
     }
 
     private fun createInputEdge(
@@ -269,10 +269,14 @@
         inputEdge = SurfaceEdge.create(listOf(surface))
     }
 
-    private fun createSurfaceEffectNode(
+    private fun createSurfaceProcessorNode(
         glTransformOptions: GlTransformOptions = USE_SURFACE_TEXTURE_TRANSFORM
     ) {
-        node = SurfaceEffectNode(FakeCamera(), glTransformOptions, surfaceEffectInternal)
+        node = SurfaceProcessorNode(
+            FakeCamera(),
+            glTransformOptions,
+            surfaceProcessorInternal
+        )
     }
 
     private fun createOutputSurfaceRequestAndProvideSurface(
diff --git a/camera/camera-core/src/test/java/androidx/camera/core/processing/SurfaceEffectWithExecutorTest.kt b/camera/camera-core/src/test/java/androidx/camera/core/processing/SurfaceProcessorWithExecutorTest.kt
similarity index 71%
rename from camera/camera-core/src/test/java/androidx/camera/core/processing/SurfaceEffectWithExecutorTest.kt
rename to camera/camera-core/src/test/java/androidx/camera/core/processing/SurfaceProcessorWithExecutorTest.kt
index 6a33afe..b07183a 100644
--- a/camera/camera-core/src/test/java/androidx/camera/core/processing/SurfaceEffectWithExecutorTest.kt
+++ b/camera/camera-core/src/test/java/androidx/camera/core/processing/SurfaceProcessorWithExecutorTest.kt
@@ -21,13 +21,13 @@
 import android.os.HandlerThread
 import android.os.Looper.getMainLooper
 import android.util.Size
-import androidx.camera.core.SurfaceEffect
 import androidx.camera.core.SurfaceOutput
+import androidx.camera.core.SurfaceProcessor
 import androidx.camera.core.SurfaceRequest
 import androidx.camera.core.impl.utils.executor.CameraXExecutors
 import androidx.camera.core.impl.utils.executor.CameraXExecutors.mainThreadExecutor
 import androidx.camera.testing.fakes.FakeCamera
-import androidx.camera.testing.fakes.FakeSurfaceEffectInternal
+import androidx.camera.testing.fakes.FakeSurfaceProcessorInternal
 import com.google.common.truth.Truth.assertThat
 import java.lang.Thread.currentThread
 import java.util.concurrent.Executor
@@ -42,12 +42,12 @@
 import org.robolectric.annotation.internal.DoNotInstrument
 
 /**
- * Unit tests for [SurfaceEffectWithExecutor].
+ * Unit tests for [SurfaceProcessorWithExecutor].
  */
 @RunWith(RobolectricTestRunner::class)
 @DoNotInstrument
 @Config(minSdk = Build.VERSION_CODES.LOLLIPOP)
-class SurfaceEffectWithExecutorTest {
+class SurfaceProcessorWithExecutorTest {
 
     companion object {
         private val SIZE = Size(640, 480)
@@ -69,30 +69,32 @@
     }
 
     @Test(expected = IllegalStateException::class)
-    fun initWithSurfaceEffectInternal_throwsException() {
-        SurfaceEffectWithExecutor(
-            FakeSurfaceEffectInternal(mainThreadExecutor()),
+    fun initWithSurfaceProcessorInternal_throwsException() {
+        SurfaceProcessorWithExecutor(
+            FakeSurfaceProcessorInternal(mainThreadExecutor()),
             mainThreadExecutor()
         )
     }
 
     @Test
-    fun invokeEffect_invokedOnEffectExecutor() {
+    fun invokeProcessor_invokedOnProcessorExecutor() {
         // Arrange: track which thread the methods are invoked on.
         var onInputSurfaceInvokedThread: Thread? = null
         var onOutputSurfaceInvokedThread: Thread? = null
-        val effectWithExecutor = SurfaceEffectWithExecutor(object : SurfaceEffect {
-            override fun onInputSurface(request: SurfaceRequest) {
-                onInputSurfaceInvokedThread = currentThread()
-            }
+        val processorWithExecutor =
+            SurfaceProcessorWithExecutor(object :
+                SurfaceProcessor {
+                override fun onInputSurface(request: SurfaceRequest) {
+                    onInputSurfaceInvokedThread = currentThread()
+                }
 
-            override fun onOutputSurface(surfaceOutput: SurfaceOutput) {
-                onOutputSurfaceInvokedThread = currentThread()
-            }
-        }, executor)
+                override fun onOutputSurface(surfaceOutput: SurfaceOutput) {
+                    onOutputSurfaceInvokedThread = currentThread()
+                }
+            }, executor)
         // Act: invoke methods.
-        effectWithExecutor.onInputSurface(SurfaceRequest(SIZE, FakeCamera(), false))
-        effectWithExecutor.onOutputSurface(mock(SurfaceOutput::class.java))
+        processorWithExecutor.onInputSurface(SurfaceRequest(SIZE, FakeCamera(), false))
+        processorWithExecutor.onOutputSurface(mock(SurfaceOutput::class.java))
         shadowOf(getMainLooper()).idle()
         shadowOf(executorThread.looper).idle()
         // Assert: it's the executor thread.
diff --git a/camera/camera-lifecycle/src/androidTest/java/androidx/camera/lifecycle/ProcessCameraProviderTest.kt b/camera/camera-lifecycle/src/androidTest/java/androidx/camera/lifecycle/ProcessCameraProviderTest.kt
index 35e8e77..0bb2cbe 100644
--- a/camera/camera-lifecycle/src/androidTest/java/androidx/camera/lifecycle/ProcessCameraProviderTest.kt
+++ b/camera/camera-lifecycle/src/androidTest/java/androidx/camera/lifecycle/ProcessCameraProviderTest.kt
@@ -26,18 +26,18 @@
 import androidx.camera.core.CameraXConfig
 import androidx.camera.core.EffectBundle
 import androidx.camera.core.Preview
-import androidx.camera.core.SurfaceEffect.PREVIEW
+import androidx.camera.core.SurfaceProcessor.PREVIEW
 import androidx.camera.core.UseCaseGroup
 import androidx.camera.core.impl.CameraFactory
 import androidx.camera.core.impl.utils.executor.CameraXExecutors.mainThreadExecutor
-import androidx.camera.core.processing.SurfaceEffectWithExecutor
+import androidx.camera.core.processing.SurfaceProcessorWithExecutor
 import androidx.camera.testing.fakes.FakeAppConfig
 import androidx.camera.testing.fakes.FakeCamera
 import androidx.camera.testing.fakes.FakeCameraDeviceSurfaceManager
 import androidx.camera.testing.fakes.FakeCameraFactory
 import androidx.camera.testing.fakes.FakeCameraInfoInternal
 import androidx.camera.testing.fakes.FakeLifecycleOwner
-import androidx.camera.testing.fakes.FakeSurfaceEffect
+import androidx.camera.testing.fakes.FakeSurfaceProcessor
 import androidx.camera.testing.fakes.FakeUseCaseConfigFactory
 import androidx.concurrent.futures.await
 import androidx.test.core.app.ApplicationProvider
@@ -79,9 +79,9 @@
     fun bindUseCaseGroupWithEffect_effectIsSetOnUseCase() {
         // Arrange.
         ProcessCameraProvider.configureInstance(FakeAppConfig.create())
-        val surfaceEffect = FakeSurfaceEffect(mainThreadExecutor())
+        val surfaceProcessor = FakeSurfaceProcessor(mainThreadExecutor())
         val effectBundle =
-            EffectBundle.Builder(mainThreadExecutor()).addEffect(PREVIEW, surfaceEffect).build()
+            EffectBundle.Builder(mainThreadExecutor()).addEffect(PREVIEW, surfaceProcessor).build()
         val preview = Preview.Builder().setSessionOptionUnpacker { _, _ -> }.build()
         val useCaseGroup = UseCaseGroup.Builder().addUseCase(preview)
             .setEffectBundle(effectBundle).build()
@@ -95,8 +95,8 @@
             )
 
             // Assert.
-            val useCaseEffect = (preview.effect as SurfaceEffectWithExecutor).surfaceEffect
-            assertThat(useCaseEffect).isEqualTo(surfaceEffect)
+            val useCaseProcessor = (preview.processor as SurfaceProcessorWithExecutor).processor
+            assertThat(useCaseProcessor).isEqualTo(surfaceProcessor)
         }
     }
 
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraInfoInternal.java b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraInfoInternal.java
index c2dba9a..ecf59053 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraInfoInternal.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeCameraInfoInternal.java
@@ -114,7 +114,9 @@
         // Currently this assumes that a back-facing camera is always opposite to the screen.
         // This may not be the case for all devices, so in the future we may need to handle that
         // scenario.
-        boolean isOppositeFacingScreen = (CameraSelector.LENS_FACING_BACK == getLensFacing());
+        Integer lensFacing = getLensFacing();
+        boolean isOppositeFacingScreen =
+                lensFacing != null && (CameraSelector.LENS_FACING_BACK == getLensFacing());
         return CameraOrientationUtil.getRelativeImageRotation(
                 relativeRotationDegrees,
                 mSensorRotation,
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeSurfaceEffect.java b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeSurfaceProcessor.java
similarity index 90%
rename from camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeSurfaceEffect.java
rename to camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeSurfaceProcessor.java
index 8a3d05d..b8d6e160 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeSurfaceEffect.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeSurfaceProcessor.java
@@ -23,18 +23,18 @@
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RequiresApi;
-import androidx.camera.core.SurfaceEffect;
 import androidx.camera.core.SurfaceOutput;
+import androidx.camera.core.SurfaceProcessor;
 import androidx.camera.core.SurfaceRequest;
 import androidx.camera.core.impl.DeferrableSurface;
 
 import java.util.concurrent.Executor;
 
 /**
- * Fake {@link SurfaceEffect} used in tests.
+ * Fake {@link SurfaceProcessor} used in tests.
  */
 @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
-public class FakeSurfaceEffect implements SurfaceEffect {
+public class FakeSurfaceProcessor implements SurfaceProcessor {
 
     final SurfaceTexture mSurfaceTexture;
     final Surface mInputSurface;
@@ -52,9 +52,9 @@
     Surface mOutputSurface;
 
     /**
-     * Creates a {@link SurfaceEffect} that closes the {@link SurfaceOutput} automatically.
+     * Creates a {@link SurfaceProcessor} that closes the {@link SurfaceOutput} automatically.
      */
-    public FakeSurfaceEffect(@NonNull Executor executor) {
+    public FakeSurfaceProcessor(@NonNull Executor executor) {
         this(executor, true);
     }
 
@@ -65,7 +65,7 @@
      *                               {@link SurfaceOutput#close()} to avoid the "Completer GCed"
      *                               error in {@link DeferrableSurface}.
      */
-    FakeSurfaceEffect(@NonNull Executor executor, boolean autoCloseSurfaceOutput) {
+    FakeSurfaceProcessor(@NonNull Executor executor, boolean autoCloseSurfaceOutput) {
         mSurfaceTexture = new SurfaceTexture(0);
         mInputSurface = new Surface(mSurfaceTexture);
         mExecutor = executor;
diff --git a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeSurfaceEffectInternal.java b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeSurfaceProcessorInternal.java
similarity index 74%
rename from camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeSurfaceEffectInternal.java
rename to camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeSurfaceProcessorInternal.java
index 933db05..d1a7e5c 100644
--- a/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeSurfaceEffectInternal.java
+++ b/camera/camera-testing/src/main/java/androidx/camera/testing/fakes/FakeSurfaceProcessorInternal.java
@@ -20,29 +20,31 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.RequiresApi;
-import androidx.camera.core.processing.SurfaceEffectInternal;
+import androidx.camera.core.processing.SurfaceProcessorInternal;
 
 import java.util.concurrent.Executor;
 
 /**
- * Fake {@link SurfaceEffectInternal} used in tests.
+ * Fake {@link SurfaceProcessorInternal} used in tests.
  */
 @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
-public class FakeSurfaceEffectInternal extends FakeSurfaceEffect implements SurfaceEffectInternal {
+public class FakeSurfaceProcessorInternal extends FakeSurfaceProcessor implements
+        SurfaceProcessorInternal {
 
     private boolean mIsReleased;
 
     /**
      * {@inheritDoc}
      */
-    public FakeSurfaceEffectInternal(@NonNull Executor executor) {
+    public FakeSurfaceProcessorInternal(@NonNull Executor executor) {
         this(executor, true);
     }
 
     /**
      * {@inheritDoc}
      */
-    public FakeSurfaceEffectInternal(@NonNull Executor executor, boolean autoCloseSurfaceOutput) {
+    public FakeSurfaceProcessorInternal(@NonNull Executor executor,
+            boolean autoCloseSurfaceOutput) {
         super(executor, autoCloseSurfaceOutput);
         mIsReleased = false;
     }
diff --git a/camera/camera-video/src/androidTest/java/androidx/camera/video/OutputOptionsTest.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/OutputOptionsTest.kt
index 9c73beb..10e77fd 100644
--- a/camera/camera-video/src/androidTest/java/androidx/camera/video/OutputOptionsTest.kt
+++ b/camera/camera-video/src/androidTest/java/androidx/camera/video/OutputOptionsTest.kt
@@ -29,9 +29,9 @@
 import androidx.testutils.assertThrows
 import com.google.common.truth.Truth.assertThat
 import com.google.common.truth.Truth.assertWithMessage
+import java.io.File
 import org.junit.Test
 import org.junit.runner.RunWith
-import java.io.File
 
 @SmallTest
 @RunWith(AndroidJUnit4::class)
diff --git a/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/AudioSourceTest.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/AudioSourceTest.kt
index b0406800..5c7b847 100644
--- a/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/AudioSourceTest.kt
+++ b/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/AudioSourceTest.kt
@@ -26,6 +26,7 @@
 import androidx.test.filters.LargeTest
 import androidx.test.filters.SdkSuppress
 import androidx.test.rule.GrantPermissionRule
+import java.util.concurrent.Callable
 import org.junit.After
 import org.junit.Assume.assumeTrue
 import org.junit.Before
@@ -35,7 +36,6 @@
 import org.mockito.Mockito.mock
 import org.mockito.Mockito.timeout
 import org.mockito.Mockito.verify
-import java.util.concurrent.Callable
 
 @LargeTest
 @RunWith(AndroidJUnit4::class)
diff --git a/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/SharedByteBufferTest.kt b/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/SharedByteBufferTest.kt
index 45ae669..af3ed21 100644
--- a/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/SharedByteBufferTest.kt
+++ b/camera/camera-video/src/androidTest/java/androidx/camera/video/internal/SharedByteBufferTest.kt
@@ -24,6 +24,9 @@
 import androidx.test.filters.SmallTest
 import androidx.testutils.assertThrows
 import com.google.common.truth.Truth.assertThat
+import java.lang.ref.PhantomReference
+import java.lang.ref.ReferenceQueue
+import java.nio.ByteBuffer
 import kotlinx.coroutines.CompletableDeferred
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.delay
@@ -34,9 +37,6 @@
 import kotlinx.coroutines.withTimeout
 import org.junit.Test
 import org.junit.runner.RunWith
-import java.lang.ref.PhantomReference
-import java.lang.ref.ReferenceQueue
-import java.nio.ByteBuffer
 
 @RunWith(AndroidJUnit4::class)
 @SmallTest
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/VideoCapture.java b/camera/camera-video/src/main/java/androidx/camera/video/VideoCapture.java
index 9f9d5b3..b23e20e 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/VideoCapture.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/VideoCapture.java
@@ -65,7 +65,7 @@
 import androidx.camera.core.CameraSelector;
 import androidx.camera.core.ImageCapture;
 import androidx.camera.core.Logger;
-import androidx.camera.core.SurfaceEffect;
+import androidx.camera.core.SurfaceProcessor;
 import androidx.camera.core.SurfaceRequest;
 import androidx.camera.core.UseCase;
 import androidx.camera.core.ViewPort;
@@ -94,14 +94,15 @@
 import androidx.camera.core.impl.utils.futures.FutureCallback;
 import androidx.camera.core.impl.utils.futures.Futures;
 import androidx.camera.core.internal.ThreadConfig;
-import androidx.camera.core.processing.DefaultSurfaceEffect;
+import androidx.camera.core.processing.DefaultSurfaceProcessor;
 import androidx.camera.core.processing.SettableSurface;
 import androidx.camera.core.processing.SurfaceEdge;
-import androidx.camera.core.processing.SurfaceEffectInternal;
-import androidx.camera.core.processing.SurfaceEffectNode;
+import androidx.camera.core.processing.SurfaceProcessorInternal;
+import androidx.camera.core.processing.SurfaceProcessorNode;
 import androidx.camera.video.StreamInfo.StreamState;
 import androidx.camera.video.impl.VideoCaptureConfig;
 import androidx.camera.video.internal.compat.quirk.DeviceQuirks;
+import androidx.camera.video.internal.compat.quirk.ImageCaptureFailedWhenVideoCaptureIsBoundQuirk;
 import androidx.camera.video.internal.compat.quirk.PreviewDelayWhenVideoCaptureIsBoundQuirk;
 import androidx.camera.video.internal.compat.quirk.PreviewStretchWhenVideoCaptureIsBoundQuirk;
 import androidx.camera.video.internal.config.MimeInfo;
@@ -154,23 +155,25 @@
             DeviceQuirks.get(PreviewStretchWhenVideoCaptureIsBoundQuirk.class) != null;
     private static final boolean HAS_PREVIEW_DELAY_QUIRK =
             DeviceQuirks.get(PreviewDelayWhenVideoCaptureIsBoundQuirk.class) != null;
+    private static final boolean HAS_IMAGE_CAPTURE_QUIRK =
+            DeviceQuirks.get(ImageCaptureFailedWhenVideoCaptureIsBoundQuirk.class) != null;
 
-    @SuppressWarnings("WeakerAccess") /* synthetic accessor */
+    @SuppressWarnings("WeakerAccess") // Synthetic access
     DeferrableSurface mDeferrableSurface;
-    @SuppressWarnings("WeakerAccess") /* synthetic accessor */
+    @SuppressWarnings("WeakerAccess") // Synthetic access
     StreamInfo mStreamInfo = StreamInfo.STREAM_INFO_ANY_INACTIVE;
-    @SuppressWarnings("WeakerAccess") /* synthetic accessor */
+    @SuppressWarnings("WeakerAccess") // Synthetic access
     @NonNull
     SessionConfig.Builder mSessionConfigBuilder = new SessionConfig.Builder();
-    @SuppressWarnings("WeakerAccess") /* synthetic accessor */
+    @SuppressWarnings("WeakerAccess") // Synthetic access
     ListenableFuture<Void> mSurfaceUpdateFuture = null;
     private SurfaceRequest mSurfaceRequest;
-    @SuppressWarnings("WeakerAccess") /* synthetic accessor */
+    @SuppressWarnings("WeakerAccess") // Synthetic access
     VideoOutput.SourceState mSourceState = VideoOutput.SourceState.INACTIVE;
     @Nullable
-    private SurfaceEffectInternal mSurfaceEffect;
+    private SurfaceProcessorInternal mSurfaceProcessor;
     @Nullable
-    private SurfaceEffectNode mNode;
+    private SurfaceProcessorNode mNode;
     @Nullable
     private VideoEncoderInfo mVideoEncoderInfo;
 
@@ -214,7 +217,6 @@
      * has been attached to a camera.
      *
      * @return The rotation of the intended target.
-     *
      * @hide
      */
     @RestrictTo(Scope.LIBRARY_GROUP)
@@ -326,9 +328,9 @@
     }
 
     /**
-     * Sets a {@link SurfaceEffectInternal}.
+     * Sets a {@link SurfaceProcessorInternal}.
      *
-     * <p>The effect is used to setup post-processing pipeline.
+     * <p>The processor is used to setup post-processing pipeline.
      *
      * <p>Note: the value will only be used when VideoCapture is bound. Calling this method after
      * VideoCapture is bound takes no effect until VideoCapture is rebound.
@@ -336,8 +338,8 @@
      * @hide
      */
     @RestrictTo(Scope.LIBRARY_GROUP)
-    public void setEffect(@Nullable SurfaceEffectInternal surfaceEffect) {
-        mSurfaceEffect = surfaceEffect;
+    public void setProcessor(@Nullable SurfaceProcessorInternal surfaceProcessor) {
+        mSurfaceProcessor = surfaceProcessor;
     }
 
     /**
@@ -499,7 +501,7 @@
                             VideoCapabilities.from(camera.getCameraInfo()), timebase, mediaSpec,
                             resolution, targetFpsRange));
             SettableSurface cameraSurface = new SettableSurface(
-                    SurfaceEffect.VIDEO_CAPTURE,
+                    SurfaceProcessor.VIDEO_CAPTURE,
                     resolution,
                     ImageFormat.PRIVATE,
                     getSensorToBufferTransformMatrix(),
@@ -532,7 +534,7 @@
         SessionConfig.Builder sessionConfigBuilder = SessionConfig.Builder.createFrom(config);
         sessionConfigBuilder.addErrorListener(
                 (sessionConfig, error) -> resetPipeline(cameraId, config, resolution));
-        if (HAS_PREVIEW_STRETCH_QUIRK || HAS_PREVIEW_DELAY_QUIRK) {
+        if (HAS_PREVIEW_STRETCH_QUIRK || HAS_PREVIEW_DELAY_QUIRK || HAS_IMAGE_CAPTURE_QUIRK) {
             sessionConfigBuilder.setTemplateType(CameraDevice.TEMPLATE_PREVIEW);
         }
 
@@ -694,19 +696,19 @@
     }
 
     @Nullable
-    private SurfaceEffectNode createNodeIfNeeded() {
-        if (mSurfaceEffect != null || HAS_PREVIEW_DELAY_QUIRK) {
+    private SurfaceProcessorNode createNodeIfNeeded() {
+        if (mSurfaceProcessor != null || HAS_PREVIEW_DELAY_QUIRK || HAS_IMAGE_CAPTURE_QUIRK) {
             Logger.d(TAG, "SurfaceEffect is enabled.");
-            return new SurfaceEffectNode(requireNonNull(getCamera()),
+            return new SurfaceProcessorNode(requireNonNull(getCamera()),
                     APPLY_CROP_ROTATE_AND_MIRRORING,
-                    mSurfaceEffect != null ? mSurfaceEffect : new DefaultSurfaceEffect());
+                    mSurfaceProcessor != null ? mSurfaceProcessor : new DefaultSurfaceProcessor());
         }
         return null;
     }
 
     @VisibleForTesting
     @Nullable
-    SurfaceEffectNode getNode() {
+    SurfaceProcessorNode getNode() {
         return mNode;
     }
 
@@ -999,7 +1001,7 @@
      * by the {@link QualitySelector} in VideoOutput.
      *
      * @throws IllegalArgumentException if not able to find a resolution by the QualitySelector
-     * in VideoOutput.
+     *                                  in VideoOutput.
      */
     private void updateSupportedResolutionsByQuality(@NonNull CameraInfoInternal cameraInfo,
             @NonNull UseCaseConfig.Builder<?, ?, ?> builder) throws IllegalArgumentException {
@@ -1085,9 +1087,9 @@
      * will never return a {@code null} value. The observable could contain exact {@code null}
      * value.
      *
-     * @param observable the observable
+     * @param observable     the observable
      * @param valueIfMissing if the observable doesn't contain value.
-     * @param <T> the value type
+     * @param <T>            the value type
      * @return the snapshot value of the given {@link Observable}.
      */
     @Nullable
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/DeviceQuirksLoader.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/DeviceQuirksLoader.java
index 7670a3f..41b0c0e 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/DeviceQuirksLoader.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/DeviceQuirksLoader.java
@@ -86,6 +86,9 @@
         if (AudioTimestampFramePositionIncorrectQuirk.load()) {
             quirks.add(new AudioTimestampFramePositionIncorrectQuirk());
         }
+        if (ImageCaptureFailedWhenVideoCaptureIsBoundQuirk.load()) {
+            quirks.add(new ImageCaptureFailedWhenVideoCaptureIsBoundQuirk());
+        }
 
         return quirks;
     }
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/ImageCaptureFailedWhenVideoCaptureIsBoundQuirk.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/ImageCaptureFailedWhenVideoCaptureIsBoundQuirk.java
new file mode 100644
index 0000000..a72f29f
--- /dev/null
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/ImageCaptureFailedWhenVideoCaptureIsBoundQuirk.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 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 androidx.camera.video.internal.compat.quirk;
+
+import android.os.Build;
+
+import androidx.annotation.RequiresApi;
+import androidx.camera.core.impl.Quirk;
+
+/**
+ * <p>QuirkSummary
+ *     Bug Id: b/239369953
+ *     Description: When taking image with VideoCapture is bound, the capture result is returned
+ *                  but the resulting image can not be obtained.
+ *     Device(s): BLU Studio X10, Itel w6004, and Vivo 1805.
+ */
+@RequiresApi(21) // TODO(b/200306659): Remove and replace with annotation on package-info.java
+public class ImageCaptureFailedWhenVideoCaptureIsBoundQuirk implements Quirk {
+
+    static boolean load() {
+        return isBluStudioX10() || isItelW6004() || isVivo1805();
+    }
+
+    public static boolean isBluStudioX10() {
+        return "blu".equalsIgnoreCase(Build.BRAND) && "studio x10".equalsIgnoreCase(Build.MODEL);
+    }
+
+    public static boolean isItelW6004() {
+        return "itel".equalsIgnoreCase(Build.BRAND) && "itel w6004".equalsIgnoreCase(Build.MODEL);
+    }
+
+    public static boolean isVivo1805() {
+        return "vivo".equalsIgnoreCase(Build.BRAND) && "vivo 1805".equalsIgnoreCase(Build.MODEL);
+    }
+}
diff --git a/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/PreviewDelayWhenVideoCaptureIsBoundQuirk.java b/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/PreviewDelayWhenVideoCaptureIsBoundQuirk.java
index 6847b67..efffa0c 100644
--- a/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/PreviewDelayWhenVideoCaptureIsBoundQuirk.java
+++ b/camera/camera-video/src/main/java/androidx/camera/video/internal/compat/quirk/PreviewDelayWhenVideoCaptureIsBoundQuirk.java
@@ -38,6 +38,7 @@
 
     private static final Set<String> HUAWEI_DEVICE_LIST = new HashSet<>(Arrays.asList(
             "HWELE",  // P30
+            "HW-02L", // P30 Pro
             "HWVOG",  // P30 Pro
             "HWYAL",  // Nova 5T
             "HWLYA",  // Mate 20 Pro
@@ -45,8 +46,13 @@
             "HWPAR"   // Nova 3
     ));
 
+    private static final Set<String> HUAWEI_MODEL_LIST = new HashSet<>(Arrays.asList(
+            "ELS-AN00", "ELS-TN00", "ELS-NX9", "ELS-N04"  // P40 Pro
+    ));
+
     static boolean load() {
         return "Huawei".equalsIgnoreCase(Build.MANUFACTURER)
-                && HUAWEI_DEVICE_LIST.contains(Build.DEVICE.toUpperCase(Locale.US));
+                && (HUAWEI_DEVICE_LIST.contains(Build.DEVICE.toUpperCase(Locale.US))
+                || HUAWEI_MODEL_LIST.contains(Build.MODEL.toUpperCase(Locale.US)));
     }
 }
diff --git a/camera/camera-video/src/test/java/androidx/camera/video/FileOutputOptionsTest.kt b/camera/camera-video/src/test/java/androidx/camera/video/FileOutputOptionsTest.kt
index a7940f6..a1c7f27 100644
--- a/camera/camera-video/src/test/java/androidx/camera/video/FileOutputOptionsTest.kt
+++ b/camera/camera-video/src/test/java/androidx/camera/video/FileOutputOptionsTest.kt
@@ -18,12 +18,12 @@
 
 import android.os.Build
 import com.google.common.truth.Truth.assertThat
+import java.io.File
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.robolectric.RobolectricTestRunner
 import org.robolectric.annotation.Config
 import org.robolectric.annotation.internal.DoNotInstrument
-import java.io.File
 
 @RunWith(RobolectricTestRunner::class)
 @DoNotInstrument
diff --git a/camera/camera-video/src/test/java/androidx/camera/video/VideoCaptureTest.kt b/camera/camera-video/src/test/java/androidx/camera/video/VideoCaptureTest.kt
index a2d7fc1..af83bd4 100644
--- a/camera/camera-video/src/test/java/androidx/camera/video/VideoCaptureTest.kt
+++ b/camera/camera-video/src/test/java/androidx/camera/video/VideoCaptureTest.kt
@@ -40,7 +40,7 @@
 import androidx.camera.core.impl.utils.TransformUtils.rotateSize
 import androidx.camera.core.impl.utils.executor.CameraXExecutors
 import androidx.camera.core.internal.CameraUseCaseAdapter
-import androidx.camera.core.processing.SurfaceEffectInternal
+import androidx.camera.core.processing.SurfaceProcessorInternal
 import androidx.camera.testing.CamcorderProfileUtil
 import androidx.camera.testing.CamcorderProfileUtil.PROFILE_1080P
 import androidx.camera.testing.CamcorderProfileUtil.PROFILE_2160P
@@ -58,7 +58,7 @@
 import androidx.camera.testing.fakes.FakeCameraDeviceSurfaceManager
 import androidx.camera.testing.fakes.FakeCameraFactory
 import androidx.camera.testing.fakes.FakeCameraInfoInternal
-import androidx.camera.testing.fakes.FakeSurfaceEffectInternal
+import androidx.camera.testing.fakes.FakeSurfaceProcessorInternal
 import androidx.camera.video.StreamInfo.StreamState
 import androidx.camera.video.impl.VideoCaptureConfig
 import androidx.camera.video.internal.encoder.FakeVideoEncoderInfo
@@ -142,40 +142,48 @@
     }
 
     @Test
-    fun enableEffect_sensorRotationIs0AndSetTargetRotation_sendCorrectResolution() {
+    fun enableProcessor_sensorRotationIs0AndSetTargetRotation_sendCorrectResolution() {
         testSetRotationWillSendCorrectResolution(
             sensorRotation = 0,
-            effect = FakeSurfaceEffectInternal(CameraXExecutors.mainThreadExecutor())
+            processor = FakeSurfaceProcessorInternal(
+                CameraXExecutors.mainThreadExecutor()
+            )
         )
     }
 
     @Test
-    fun enableEffect_sensorRotationIs90AndSetTargetRotation_sendCorrectResolution() {
+    fun enableProcessor_sensorRotationIs90AndSetTargetRotation_sendCorrectResolution() {
         testSetRotationWillSendCorrectResolution(
             sensorRotation = 90,
-            effect = FakeSurfaceEffectInternal(CameraXExecutors.mainThreadExecutor())
+            processor = FakeSurfaceProcessorInternal(
+                CameraXExecutors.mainThreadExecutor()
+            )
         )
     }
 
     @Test
-    fun enableEffect_sensorRotationIs180AndSetTargetRotation_sendCorrectResolution() {
+    fun enableProcessor_sensorRotationIs180AndSetTargetRotation_sendCorrectResolution() {
         testSetRotationWillSendCorrectResolution(
             sensorRotation = 180,
-            effect = FakeSurfaceEffectInternal(CameraXExecutors.mainThreadExecutor())
+            processor = FakeSurfaceProcessorInternal(
+                CameraXExecutors.mainThreadExecutor()
+            )
         )
     }
 
     @Test
-    fun enableEffect_sensorRotationIs270AndSetTargetRotation_sendCorrectResolution() {
+    fun enableProcessor_sensorRotationIs270AndSetTargetRotation_sendCorrectResolution() {
         testSetRotationWillSendCorrectResolution(
             sensorRotation = 270,
-            effect = FakeSurfaceEffectInternal(CameraXExecutors.mainThreadExecutor())
+            processor = FakeSurfaceProcessorInternal(
+                CameraXExecutors.mainThreadExecutor()
+            )
         )
     }
 
     private fun testSetRotationWillSendCorrectResolution(
         sensorRotation: Int = 0,
-        effect: SurfaceEffectInternal? = null
+        processor: SurfaceProcessorInternal? = null
     ) {
         setupCamera(sensorRotation = sensorRotation)
         createCameraUseCaseAdapter()
@@ -196,14 +204,14 @@
                     surfaceRequest = request
                 })
             val videoCapture = createVideoCapture(videoOutput)
-            effect?.let { videoCapture.setEffect(it) }
+            processor?.let { videoCapture.setProcessor(it) }
             videoCapture.targetRotation = targetRotation
 
             // Act.
             addAndAttachUseCases(videoCapture)
 
             // Assert.
-            val expectedResolution = if (effect != null) {
+            val expectedResolution = if (processor != null) {
                 rotateSize(RESOLUTION_720P, cameraInfo.getSensorRotationDegrees(targetRotation))
             } else {
                 RESOLUTION_720P
@@ -227,25 +235,29 @@
     }
 
     @Test
-    fun addUseCasesWithSurfaceEffect_cameraIsUptime_requestIsUptime() {
+    fun addUseCasesWithSurfaceProcessor_cameraIsUptime_requestIsUptime() {
         testTimebase(
-            effect = FakeSurfaceEffectInternal(CameraXExecutors.mainThreadExecutor()),
+            processor = FakeSurfaceProcessorInternal(
+                CameraXExecutors.mainThreadExecutor()
+            ),
             cameraTimebase = Timebase.UPTIME,
             expectedTimebase = Timebase.UPTIME
         )
     }
 
     @Test
-    fun addUseCasesWithSurfaceEffect_cameraIsRealtime_requestIsRealtime() {
+    fun addUseCasesWithSurfaceProcessor_cameraIsRealtime_requestIsRealtime() {
         testTimebase(
-            effect = FakeSurfaceEffectInternal(CameraXExecutors.mainThreadExecutor()),
+            processor = FakeSurfaceProcessorInternal(
+                CameraXExecutors.mainThreadExecutor()
+            ),
             cameraTimebase = Timebase.REALTIME,
             expectedTimebase = Timebase.REALTIME
         )
     }
 
     private fun testTimebase(
-        effect: SurfaceEffectInternal? = null,
+        processor: SurfaceProcessorInternal? = null,
         cameraTimebase: Timebase,
         expectedTimebase: Timebase
     ) {
@@ -260,7 +272,7 @@
         val videoCapture = VideoCapture.Builder(videoOutput)
             .setSessionOptionUnpacker { _, _ -> }
             .build()
-        effect?.let { videoCapture.setEffect(it) }
+        processor?.let { videoCapture.setProcessor(it) }
 
         // Act.
         addAndAttachUseCases(videoCapture)
@@ -551,7 +563,10 @@
         // Arrange.
         setupCamera()
         createCameraUseCaseAdapter()
-        val effect = FakeSurfaceEffectInternal(CameraXExecutors.mainThreadExecutor(), false)
+        val processor = FakeSurfaceProcessorInternal(
+            CameraXExecutors.mainThreadExecutor(),
+            false
+        )
         var appSurfaceReadyToRelease = false
         val videoOutput = createVideoOutput(surfaceRequestListener = { surfaceRequest, _ ->
             surfaceRequest.provideSurface(
@@ -564,30 +579,30 @@
         val videoCapture = createVideoCapture(videoOutput)
 
         // Act: bind and provide Surface.
-        videoCapture.setEffect(effect)
+        videoCapture.setProcessor(processor)
         addAndAttachUseCases(videoCapture)
 
         // Assert: surfaceOutput received.
-        assertThat(effect.surfaceOutput).isNotNull()
-        assertThat(effect.isReleased).isFalse()
-        assertThat(effect.isOutputSurfaceRequestedToClose).isFalse()
-        assertThat(effect.isInputSurfaceReleased).isFalse()
+        assertThat(processor.surfaceOutput).isNotNull()
+        assertThat(processor.isReleased).isFalse()
+        assertThat(processor.isOutputSurfaceRequestedToClose).isFalse()
+        assertThat(processor.isInputSurfaceReleased).isFalse()
         assertThat(appSurfaceReadyToRelease).isFalse()
-        // effect surface is provided to camera.
+        // processor surface is provided to camera.
         assertThat(videoCapture.sessionConfig.surfaces[0].surface.get())
-            .isEqualTo(effect.inputSurface)
+            .isEqualTo(processor.inputSurface)
 
         // Act: unbind.
         detachAndRemoveUseCases(videoCapture)
 
-        // Assert: effect and effect surface is released.
-        assertThat(effect.isReleased).isTrue()
-        assertThat(effect.isOutputSurfaceRequestedToClose).isTrue()
-        assertThat(effect.isInputSurfaceReleased).isTrue()
+        // Assert: processor and processor surface is released.
+        assertThat(processor.isReleased).isTrue()
+        assertThat(processor.isOutputSurfaceRequestedToClose).isTrue()
+        assertThat(processor.isInputSurfaceReleased).isTrue()
         assertThat(appSurfaceReadyToRelease).isFalse()
 
         // Act: close SurfaceOutput
-        effect.surfaceOutput!!.close()
+        processor.surfaceOutput!!.close()
         shadowOf(Looper.getMainLooper()).idle()
         assertThat(appSurfaceReadyToRelease).isTrue()
     }
@@ -680,8 +695,10 @@
         val videoCapture = createVideoCapture(
             videoOutput, videoEncoderInfoFinder = { videoEncoderInfo }
         )
-        val effect = FakeSurfaceEffectInternal(CameraXExecutors.mainThreadExecutor())
-        videoCapture.setEffect(effect)
+        val processor = FakeSurfaceProcessorInternal(
+            CameraXExecutors.mainThreadExecutor()
+        )
+        videoCapture.setProcessor(processor)
         videoCapture.setViewPortCropRect(cropRect)
 
         // Act.
diff --git a/camera/camera-video/src/test/java/androidx/camera/video/VideoRecordEventTest.kt b/camera/camera-video/src/test/java/androidx/camera/video/VideoRecordEventTest.kt
index 8fa89c7..33cc6eb 100644
--- a/camera/camera-video/src/test/java/androidx/camera/video/VideoRecordEventTest.kt
+++ b/camera/camera-video/src/test/java/androidx/camera/video/VideoRecordEventTest.kt
@@ -21,13 +21,13 @@
 import androidx.camera.video.VideoRecordEvent.Finalize.ERROR_NONE
 import androidx.camera.video.VideoRecordEvent.Finalize.ERROR_UNKNOWN
 import com.google.common.truth.Truth.assertThat
+import java.io.File
 import org.junit.Assert
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.robolectric.RobolectricTestRunner
 import org.robolectric.annotation.Config
 import org.robolectric.annotation.internal.DoNotInstrument
-import java.io.File
 
 private const val INVALID_FILE_PATH = "/invalid/file/path"
 private val TEST_OUTPUT_OPTION = FileOutputOptions.Builder(File(INVALID_FILE_PATH)).build()
diff --git a/camera/camera-view/src/androidTest/java/androidx/camera/view/CameraControllerDeviceTest.kt b/camera/camera-view/src/androidTest/java/androidx/camera/view/CameraControllerDeviceTest.kt
index 43a0597..8abbab7 100644
--- a/camera/camera-view/src/androidTest/java/androidx/camera/view/CameraControllerDeviceTest.kt
+++ b/camera/camera-view/src/androidTest/java/androidx/camera/view/CameraControllerDeviceTest.kt
@@ -28,7 +28,7 @@
 import androidx.camera.core.CameraXConfig
 import androidx.camera.core.EffectBundle
 import androidx.camera.core.ImageCapture
-import androidx.camera.core.SurfaceEffect.PREVIEW
+import androidx.camera.core.SurfaceProcessor.PREVIEW
 import androidx.camera.core.impl.utils.executor.CameraXExecutors.mainThreadExecutor
 import androidx.camera.lifecycle.ProcessCameraProvider
 import androidx.camera.testing.CameraPipeConfigTestRule
@@ -37,7 +37,7 @@
 import androidx.camera.testing.CoreAppTestUtil
 import androidx.camera.testing.fakes.FakeActivity
 import androidx.camera.testing.fakes.FakeLifecycleOwner
-import androidx.camera.testing.fakes.FakeSurfaceEffect
+import androidx.camera.testing.fakes.FakeSurfaceProcessor
 import androidx.test.core.app.ActivityScenario
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.filters.LargeTest
@@ -131,13 +131,17 @@
         instrumentation.runOnMainSync {
             controller!!.setEffectBundle(
                 EffectBundle.Builder(mainThreadExecutor())
-                    .addEffect(PREVIEW, FakeSurfaceEffect(mainThreadExecutor()))
+                    .addEffect(PREVIEW,
+                        FakeSurfaceProcessor(
+                            mainThreadExecutor()
+                        )
+                    )
                     .build()
             )
         }
 
         // Assert: preview has effect
-        assertThat(controller!!.mPreview.effect).isNotNull()
+        assertThat(controller!!.mPreview.processor).isNotNull()
 
         // Act: clear the EffectBundle
         instrumentation.runOnMainSync {
@@ -145,7 +149,7 @@
         }
 
         // Assert: preview no longer has the effect.
-        assertThat(controller!!.mPreview.effect).isNull()
+        assertThat(controller!!.mPreview.processor).isNull()
     }
 
     @Test
diff --git a/camera/camera-view/src/main/java/androidx/camera/view/PreviewView.java b/camera/camera-view/src/main/java/androidx/camera/view/PreviewView.java
index a46b7cb..b97c25b 100644
--- a/camera/camera-view/src/main/java/androidx/camera/view/PreviewView.java
+++ b/camera/camera-view/src/main/java/androidx/camera/view/PreviewView.java
@@ -209,9 +209,17 @@
                                 "Preview transformation info updated. " + transformationInfo);
                         // TODO(b/159127402): maybe switch to COMPATIBLE mode if target
                         //  rotation is not display rotation.
-                        boolean isFrontCamera =
-                                camera.getCameraInfoInternal().getLensFacing()
-                                        == CameraSelector.LENS_FACING_FRONT;
+                        Integer lensFacing = camera.getCameraInfoInternal().getLensFacing();
+                        boolean isFrontCamera;
+                        if (lensFacing == null) {
+                            // TODO(b/122975195): If the lens facing is null, it's probably an
+                            //  external camera. We treat it as like a front camera with
+                            //  unverified behaviors. Will have to define this later.
+                            Logger.w(TAG, "The lens facing is null, probably an external.");
+                            isFrontCamera = true;
+                        } else {
+                            isFrontCamera = lensFacing == CameraSelector.LENS_FACING_FRONT;
+                        }
                         mPreviewTransform.setTransformationInfo(transformationInfo,
                                 surfaceRequest.getResolution(), isFrontCamera);
 
diff --git a/camera/integration-tests/coretestapp/src/main/AndroidManifest.xml b/camera/integration-tests/coretestapp/src/main/AndroidManifest.xml
index 1c8e0e8..5de58b5 100644
--- a/camera/integration-tests/coretestapp/src/main/AndroidManifest.xml
+++ b/camera/integration-tests/coretestapp/src/main/AndroidManifest.xml
@@ -15,7 +15,8 @@
 -->
 <manifest xmlns:android="http://schemas.android.com/apk/res/android">
     <uses-permission android:name="android.permission.CAMERA" />
-    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
+        android:maxSdkVersion="32"/>
     <uses-permission android:name="android.permission.RECORD_AUDIO" />
 
     <uses-feature android:name="android.hardware.camera" />
diff --git a/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXActivity.java b/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXActivity.java
index b9f5851..773eb0e 100644
--- a/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXActivity.java
+++ b/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXActivity.java
@@ -41,6 +41,7 @@
 import android.hardware.display.DisplayManager;
 import android.media.MediaScannerConnection;
 import android.net.Uri;
+import android.os.Build;
 import android.os.Bundle;
 import android.os.Environment;
 import android.os.Handler;
@@ -154,12 +155,25 @@
  */
 public class CameraXActivity extends AppCompatActivity {
     private static final String TAG = "CameraXActivity";
-    private static final String[] REQUIRED_PERMISSIONS =
-            new String[]{
+    private static final String[] REQUIRED_PERMISSIONS;
+
+    static {
+
+        //WRITE_EXTERNAL_STORAGE permission is not needed for SDK 33 or later to store media
+        if (Build.VERSION.SDK_INT >= 33) {
+            REQUIRED_PERMISSIONS = new String[]{
+                    Manifest.permission.CAMERA,
+                    Manifest.permission.RECORD_AUDIO
+            };
+        } else {
+            REQUIRED_PERMISSIONS = new String[]{
                     Manifest.permission.CAMERA,
                     Manifest.permission.RECORD_AUDIO,
                     Manifest.permission.WRITE_EXTERNAL_STORAGE
             };
+        }
+    }
+
     // Possible values for this intent key: "backward" or "forward".
     private static final String INTENT_EXTRA_CAMERA_DIRECTION = "camera_direction";
     // Possible values for this intent key: "switch_test_case", "preview_test_case" or
@@ -632,7 +646,7 @@
                     } else if (outputOptions instanceof FileOutputOptions) {
                         videoFilePath = ((FileOutputOptions) outputOptions).getFile().getPath();
                         MediaScannerConnection.scanFile(this,
-                                new String[] { videoFilePath }, null,
+                                new String[]{videoFilePath}, null,
                                 (path, uri1) -> {
                                     Log.i(TAG, "Scanned " + path + " -> uri= " + uri1);
                                     updateVideoSavedSessionData(uri1);
@@ -1395,8 +1409,8 @@
                                 for (String permission : REQUIRED_PERMISSIONS) {
                                     if (!Objects.requireNonNull(result.get(permission))) {
                                         Toast.makeText(getApplicationContext(),
-                                                "Camera permission denied.",
-                                                Toast.LENGTH_SHORT)
+                                                        "Camera permission denied.",
+                                                        Toast.LENGTH_SHORT)
                                                 .show();
                                         finish();
                                         return;
@@ -1581,10 +1595,10 @@
         cameraInfo.getZoomState().removeObservers(this);
         cameraInfo.getZoomState().observe(this,
                 state -> {
-                String str = String.format("%.2fx", state.getZoomRatio());
-                mZoomRatioLabel.setText(str);
-                mZoomSeekBar.setProgress((int) (MAX_SEEKBAR_VALUE * state.getLinearZoom()));
-            });
+                    String str = String.format("%.2fx", state.getZoomRatio());
+                    mZoomRatioLabel.setText(str);
+                    mZoomSeekBar.setProgress((int) (MAX_SEEKBAR_VALUE * state.getLinearZoom()));
+                });
     }
 
     private boolean is2XZoomSupported() {
diff --git a/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXViewModel.java b/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXViewModel.java
index 5d55d14..60d7ed6 100644
--- a/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXViewModel.java
+++ b/camera/integration-tests/coretestapp/src/main/java/androidx/camera/integration/core/CameraXViewModel.java
@@ -124,7 +124,7 @@
                         ProcessCameraProvider.configureInstance(Camera2Config.defaultConfig());
                     } else if (cameraImplementation.equals(CAMERA_PIPE_IMPLEMENTATION_OPTION)) {
                         ProcessCameraProvider.configureInstance(
-                                CameraPipeConfig.INSTANCE.defaultConfig());
+                                CameraPipeConfig.defaultConfig());
                     } else {
                         throw new IllegalArgumentException("Failed to configure the CameraProvider "
                                 + "using unknown " + cameraImplementation
diff --git a/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/compose/ComposeCameraAppTest.kt b/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/compose/ComposeCameraAppTest.kt
index 1c5b3c1..319a54b 100644
--- a/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/compose/ComposeCameraAppTest.kt
+++ b/camera/integration-tests/uiwidgetstestapp/src/androidTest/java/androidx/camera/integration/uiwidgets/compose/ComposeCameraAppTest.kt
@@ -18,6 +18,7 @@
 
 import android.os.Build
 import androidx.camera.integration.uiwidgets.compose.ui.navigation.ComposeCameraScreen
+import androidx.camera.testing.LabTestRule
 import androidx.camera.view.PreviewView
 import androidx.compose.ui.semantics.Role
 import androidx.compose.ui.semantics.SemanticsProperties
@@ -50,6 +51,9 @@
     @get: Rule
     val androidComposeTestRule = createAndroidComposeRule<ComposeCameraActivity>()
 
+    @get:Rule
+    val labTest: LabTestRule = LabTestRule()
+
     @get: Rule
     val repeatRule = RepeatRule()
 
@@ -80,6 +84,7 @@
     // Navigating from ImageCapture to VideoCapture screen
     // Ensure that VideoCapture screen's PreviewView is streaming properly
     @Test
+    @LabTestRule.LabTestOnly
     @RepeatRule.Repeat(times = 10)
     fun testPreviewViewStreamStateOnNavigation() {
 
diff --git a/camera/integration-tests/viewtestapp/src/androidTest/java/androidx/camera/integration/view/CameraControllerFragmentTest.kt b/camera/integration-tests/viewtestapp/src/androidTest/java/androidx/camera/integration/view/CameraControllerFragmentTest.kt
index 5519596..f949eb5 100644
--- a/camera/integration-tests/viewtestapp/src/androidTest/java/androidx/camera/integration/view/CameraControllerFragmentTest.kt
+++ b/camera/integration-tests/viewtestapp/src/androidTest/java/androidx/camera/integration/view/CameraControllerFragmentTest.kt
@@ -134,7 +134,7 @@
     fun enableEffect_effectIsEnabled() {
         // Arrange: launch app and verify effect is inactive.
         fragment.assertPreviewIsStreaming()
-        assertThat(fragment.mSurfaceEffect.isSurfaceRequestedAndProvided()).isFalse()
+        assertThat(fragment.mSurfaceProcessor.isSurfaceRequestedAndProvided()).isFalse()
 
         // Act: turn on effect.
         val effectToggleId = "androidx.camera.integration.view:id/effect_toggle"
@@ -142,7 +142,7 @@
         instrumentation.waitForIdleSync()
 
         // Assert: verify that effect is active.
-        assertThat(fragment.mSurfaceEffect.isSurfaceRequestedAndProvided()).isTrue()
+        assertThat(fragment.mSurfaceProcessor.isSurfaceRequestedAndProvided()).isTrue()
     }
 
     @Test
diff --git a/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/CameraControllerFragment.java b/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/CameraControllerFragment.java
index d558b58..97a9bde 100644
--- a/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/CameraControllerFragment.java
+++ b/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/CameraControllerFragment.java
@@ -60,7 +60,7 @@
 import androidx.camera.core.ImageCaptureException;
 import androidx.camera.core.ImageProxy;
 import androidx.camera.core.Logger;
-import androidx.camera.core.SurfaceEffect;
+import androidx.camera.core.SurfaceProcessor;
 import androidx.camera.core.ZoomState;
 import androidx.camera.core.impl.utils.futures.FutureCallback;
 import androidx.camera.core.impl.utils.futures.Futures;
@@ -126,7 +126,7 @@
     private ImageAnalysis.Analyzer mWrappedAnalyzer;
 
     @VisibleForTesting
-    ToneMappingSurfaceEffect mSurfaceEffect;
+    ToneMappingSurfaceProcessor mSurfaceProcessor;
 
     private final ImageAnalysis.Analyzer mAnalyzer = image -> {
         byte[] bytes = new byte[image.getPlanes()[0].getBuffer().remaining()];
@@ -182,7 +182,7 @@
         });
 
         // Set up post-processing effects.
-        mSurfaceEffect = new ToneMappingSurfaceEffect();
+        mSurfaceProcessor = new ToneMappingSurfaceProcessor();
         mEffectToggle = view.findViewById(R.id.effect_toggle);
         mEffectToggle.setOnCheckedChangeListener((compoundButton, isChecked) -> onEffectsToggled());
         onEffectsToggled();
@@ -352,15 +352,15 @@
             mExecutorService.shutdown();
         }
         mRotationProvider.removeListener(mRotationListener);
-        mSurfaceEffect.release();
+        mSurfaceProcessor.release();
     }
 
     private void onEffectsToggled() {
         if (mEffectToggle.isChecked()) {
             mCameraController.setEffectBundle(new EffectBundle.Builder(mainThreadExecutor())
-                    .addEffect(SurfaceEffect.PREVIEW, mSurfaceEffect)
+                    .addEffect(SurfaceProcessor.PREVIEW, mSurfaceProcessor)
                     .build());
-        } else if (mSurfaceEffect != null) {
+        } else if (mSurfaceProcessor != null) {
             mCameraController.setEffectBundle(null);
         }
     }
diff --git a/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/MainActivity.java b/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/MainActivity.java
index 7959e0f..b164c35 100644
--- a/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/MainActivity.java
+++ b/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/MainActivity.java
@@ -107,7 +107,7 @@
                     sCameraImplementationType = cameraImplementation;
                 } else if (cameraImplementation.equals(CAMERA_PIPE_IMPLEMENTATION_OPTION)) {
                     ProcessCameraProvider.configureInstance(
-                            CameraPipeConfig.INSTANCE.defaultConfig());
+                            CameraPipeConfig.defaultConfig());
                     sCameraImplementationType = cameraImplementation;
                 } else {
                     throw new IllegalArgumentException("Failed to configure the CameraProvider "
diff --git a/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/ToneMappingSurfaceEffect.kt b/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/ToneMappingSurfaceProcessor.kt
similarity index 96%
rename from camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/ToneMappingSurfaceEffect.kt
rename to camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/ToneMappingSurfaceProcessor.kt
index 2ed13ae..e70fb20 100644
--- a/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/ToneMappingSurfaceEffect.kt
+++ b/camera/integration-tests/viewtestapp/src/main/java/androidx/camera/integration/view/ToneMappingSurfaceProcessor.kt
@@ -22,8 +22,8 @@
 import android.os.Looper
 import android.view.Surface
 import androidx.annotation.VisibleForTesting
-import androidx.camera.core.SurfaceEffect
 import androidx.camera.core.SurfaceOutput
+import androidx.camera.core.SurfaceProcessor
 import androidx.camera.core.SurfaceRequest
 import androidx.camera.core.impl.utils.Threads.checkMainThread
 import androidx.camera.core.impl.utils.executor.CameraXExecutors.mainThreadExecutor
@@ -31,11 +31,11 @@
 import androidx.camera.core.processing.ShaderProvider
 
 /**
- * A effect that applies tone mapping on camera output.
+ * A processor that applies tone mapping on camera output.
  *
  * <p>The thread safety is guaranteed by using the main thread.
  */
-class ToneMappingSurfaceEffect : SurfaceEffect, OnFrameAvailableListener {
+class ToneMappingSurfaceProcessor : SurfaceProcessor, OnFrameAvailableListener {
 
     companion object {
         // A fragment shader that applies a yellow hue.
diff --git a/car/app/app-automotive/lint-baseline.xml b/car/app/app-automotive/lint-baseline.xml
new file mode 100644
index 0000000..5840334
--- /dev/null
+++ b/car/app/app-automotive/lint-baseline.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
+
+    <issue
+        id="SupportAnnotationUsage"
+        message="This annotation does not apply for type com.google.common.collect.ImmutableMap&lt;java.util.Set&lt;androidx.car.app.hardware.common.CarZone>,java.util.Set&lt;java.lang.Integer>>; expected int"
+        errorLine1="    @HvacFanDirection"
+        errorLine2="    ~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/car/app/hardware/common/CarPropertyProfile.java"/>
+    </issue>
+
+</issues>
diff --git a/car/app/app-automotive/src/main/java/androidx/car/app/media/AutomotiveCarAudioRecord.java b/car/app/app-automotive/src/main/java/androidx/car/app/media/AutomotiveCarAudioRecord.java
index da88bc2..f22d30f 100644
--- a/car/app/app-automotive/src/main/java/androidx/car/app/media/AutomotiveCarAudioRecord.java
+++ b/car/app/app-automotive/src/main/java/androidx/car/app/media/AutomotiveCarAudioRecord.java
@@ -24,10 +24,12 @@
 import android.media.AudioRecord;
 import android.media.MediaRecorder;
 
+import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.RequiresPermission;
 import androidx.annotation.RestrictTo;
 import androidx.car.app.CarContext;
+import androidx.car.app.annotations.CarProtocol;
 
 /**
  * A {@link CarAudioRecord} for automotive OS.
@@ -35,6 +37,8 @@
  * @hide
  */
 @RestrictTo(LIBRARY_GROUP)
+@Keep
+@CarProtocol
 public class AutomotiveCarAudioRecord extends CarAudioRecord {
     /**
      * Only used for Automotive, as the car microphone is the device microphone.
diff --git a/car/app/app-automotive/src/main/res/values-ro/strings.xml b/car/app/app-automotive/src/main/res/values-ro/strings.xml
index 1ee3508..82e43b1 100644
--- a/car/app/app-automotive/src/main/res/values-ro/strings.xml
+++ b/car/app/app-automotive/src/main/res/values-ro/strings.xml
@@ -27,5 +27,5 @@
     <string name="error_message_host_incompatible" msgid="160406216155183851">"Sistemul trebuie actualizat"</string>
     <string name="error_message_multiple_hosts" msgid="2591031904206928207">"Sistem incompatibil"</string>
     <string name="error_message_unknown_error" msgid="1918523834689044166">"Eroare necunoscută"</string>
-    <string name="error_message_no_vending" msgid="5866202078252905802">"Contactați echipa de asistență auto"</string>
+    <string name="error_message_no_vending" msgid="5866202078252905802">"Contactează echipa de asistență auto"</string>
 </resources>
diff --git a/car/app/app-projected/src/main/java/androidx/car/app/media/ProjectedCarAudioRecord.java b/car/app/app-projected/src/main/java/androidx/car/app/media/ProjectedCarAudioRecord.java
index 38a98ba..b55a5c2 100644
--- a/car/app/app-projected/src/main/java/androidx/car/app/media/ProjectedCarAudioRecord.java
+++ b/car/app/app-projected/src/main/java/androidx/car/app/media/ProjectedCarAudioRecord.java
@@ -23,11 +23,13 @@
 
 import android.util.Log;
 
+import androidx.annotation.Keep;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 import androidx.annotation.RequiresPermission;
 import androidx.annotation.RestrictTo;
 import androidx.car.app.CarContext;
+import androidx.car.app.annotations.CarProtocol;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -38,6 +40,8 @@
  * @hide
  */
 @RestrictTo(LIBRARY_GROUP)
+@Keep
+@CarProtocol
 public class ProjectedCarAudioRecord extends CarAudioRecord {
     @Nullable
     private InputStream mInputStream;
diff --git a/car/app/app-samples/navigation/common/lint-baseline.xml b/car/app/app-samples/navigation/common/lint-baseline.xml
index f493425..bbc7529 100644
--- a/car/app/app-samples/navigation/common/lint-baseline.xml
+++ b/car/app/app-samples/navigation/common/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="cli" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
+<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
 
     <issue
         id="ClassVerificationFailure"
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/ShowcaseService.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/ShowcaseService.java
index c8d4a62..a054acf 100644
--- a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/ShowcaseService.java
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/ShowcaseService.java
@@ -35,6 +35,7 @@
 public final class ShowcaseService extends CarAppService {
     public static final String SHARED_PREF_KEY = "ShowcasePrefs";
     public static final String PRE_SEED_KEY = "PreSeed";
+    public static final String LOADING_KEY = "LoadingKey";
 
     // Intent actions for notification actions in car and phone
     public static final String INTENT_ACTION_NAVIGATE =
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/SettingsScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/SettingsScreen.java
new file mode 100644
index 0000000..0d321708
--- /dev/null
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/SettingsScreen.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright 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 androidx.car.app.sample.showcase.common.screens;
+
+import static androidx.car.app.CarToast.LENGTH_LONG;
+import static androidx.car.app.model.Action.BACK;
+
+import android.content.Context;
+
+import androidx.annotation.NonNull;
+import androidx.car.app.CarContext;
+import androidx.car.app.CarToast;
+import androidx.car.app.Screen;
+import androidx.car.app.model.ItemList;
+import androidx.car.app.model.ListTemplate;
+import androidx.car.app.model.Row;
+import androidx.car.app.model.Template;
+import androidx.car.app.model.Toggle;
+import androidx.car.app.sample.showcase.common.R;
+import androidx.car.app.sample.showcase.common.ShowcaseService;
+import androidx.car.app.sample.showcase.common.ShowcaseSession;
+import androidx.car.app.sample.showcase.common.screens.settings.CarHardwareDemoScreen;
+import androidx.car.app.sample.showcase.common.screens.settings.ContentLimitsDemoScreen;
+import androidx.car.app.sample.showcase.common.screens.settings.LatestFeatures;
+import androidx.car.app.sample.showcase.common.screens.settings.ParkedVsDrivingDemoScreen;
+
+/** A screen demonstrating selectable lists. */
+public final class SettingsScreen extends Screen {
+
+    private boolean mLoadingToggleState;
+
+    @NonNull
+    private final ShowcaseSession mShowcaseSession;
+
+    public SettingsScreen(@NonNull CarContext carContext,
+            @NonNull ShowcaseSession showcaseSession) {
+        super(carContext);
+        mShowcaseSession = showcaseSession;
+    }
+
+    @NonNull
+    @Override
+    public Template onGetTemplate() {
+        Toggle mLoadingToggle = new Toggle.Builder((checked) -> {
+            if (checked) {
+                makeCarToast(R.string.loading_toggle_enabled);
+                setLoadingKeyValue(true);
+            } else {
+                makeCarToast(R.string.loading_toggle_disabled);
+                setLoadingKeyValue(false);
+            }
+            mLoadingToggleState = !mLoadingToggleState;
+        }).setChecked(mLoadingToggleState).build();
+
+        ItemList.Builder listBuilder = new ItemList.Builder();
+
+        listBuilder.addItem(buildRowForTemplate(new LatestFeatures(getCarContext()),
+                R.string.latest_feature_title));
+
+        listBuilder.addItem(buildRowForTemplate(R.string.loading_demo_title, mLoadingToggle));
+
+        listBuilder.addItem(buildRowForTemplate(new ContentLimitsDemoScreen(getCarContext()),
+                R.string.content_limits_demo_title));
+
+        listBuilder.addItem(buildRowForTemplate(new ParkedVsDrivingDemoScreen(getCarContext()),
+                R.string.parking_vs_driving_demo_title));
+
+        listBuilder.addItem(buildRowForTemplate(new CarHardwareDemoScreen(getCarContext(),
+                mShowcaseSession), R.string.car_hardware_demo_title));
+
+        return new ListTemplate.Builder()
+                .setSingleList(listBuilder.build())
+                .setTitle(getCarContext().getString(R.string.settings_action_title) + " ("
+                        + getCarContext().getString(R.string.cal_api_level_prefix,
+                        getCarContext().getCarAppApiLevel()) + ")")
+                .setHeaderAction(BACK)
+                .build();
+    }
+
+    private Row buildRowForTemplate(Screen screen, int title) {
+        return new Row.Builder()
+                .setTitle(getCarContext().getString(title))
+                .setOnClickListener(() -> getScreenManager().push(screen))
+                .setBrowsable(true)
+                .build();
+    }
+
+    private Row buildRowForTemplate(int title, Toggle toggle) {
+        return new Row.Builder()
+                .setTitle(getCarContext().getString(title))
+                .setToggle(toggle)
+                .build();
+    }
+
+    private void makeCarToast(int toastText) {
+        CarToast.makeText(getCarContext(), toastText,
+                LENGTH_LONG).show();
+    }
+
+    private void setLoadingKeyValue(boolean val) {
+        getCarContext()
+                .getSharedPreferences(
+                        ShowcaseService.SHARED_PREF_KEY,
+                        Context.MODE_PRIVATE)
+                .edit()
+                .putBoolean(
+                        ShowcaseService.LOADING_KEY, val)
+                .apply();
+    }
+}
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/TemplateLayoutsDemoScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/TemplateLayoutsDemoScreen.java
new file mode 100644
index 0000000..76ab41e
--- /dev/null
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/TemplateLayoutsDemoScreen.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 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 androidx.car.app.sample.showcase.common.screens;
+
+import static androidx.car.app.model.Action.BACK;
+
+import androidx.annotation.NonNull;
+import androidx.car.app.CarContext;
+import androidx.car.app.Screen;
+import androidx.car.app.model.ItemList;
+import androidx.car.app.model.ListTemplate;
+import androidx.car.app.model.Row;
+import androidx.car.app.model.Template;
+import androidx.car.app.sample.showcase.common.R;
+import androidx.car.app.sample.showcase.common.screens.templatelayouts.GridTemplateMenuDemoScreen;
+import androidx.car.app.sample.showcase.common.screens.templatelayouts.ListTemplateDemoScreen;
+import androidx.car.app.sample.showcase.common.screens.templatelayouts.MessageTemplateDemoScreen;
+import androidx.car.app.sample.showcase.common.screens.templatelayouts.PaneTemplateDemoScreen;
+import androidx.car.app.sample.showcase.common.screens.templatelayouts.SearchTemplateDemoScreen;
+import androidx.car.app.sample.showcase.common.screens.templatelayouts.SignInTemplateDemoScreen;
+
+/** A screen demonstrating different template layouts. */
+public final class TemplateLayoutsDemoScreen extends Screen {
+
+    public TemplateLayoutsDemoScreen(@NonNull CarContext carContext) {
+        super(carContext);
+    }
+
+    @NonNull
+    @Override
+    public Template onGetTemplate() {
+        ItemList.Builder listBuilder = new ItemList.Builder();
+
+        listBuilder.addItem(buildRowForTemplate(new ListTemplateDemoScreen(getCarContext()),
+                R.string.list_template_demo_title));
+        listBuilder.addItem(buildRowForTemplate(new GridTemplateMenuDemoScreen(getCarContext()),
+                R.string.grid_template_menu_demo_title));
+        listBuilder.addItem(buildRowForTemplate(new MessageTemplateDemoScreen(getCarContext()),
+                R.string.msg_template_demo_title));
+        listBuilder.addItem(buildRowForTemplate(new PaneTemplateDemoScreen(getCarContext()),
+                R.string.pane_template_demo_title));
+        listBuilder.addItem(buildRowForTemplate(new SearchTemplateDemoScreen(getCarContext()),
+                R.string.search_template_demo_title));
+        listBuilder.addItem(buildRowForTemplate(new SignInTemplateDemoScreen(getCarContext()),
+                R.string.sign_in_template_demo_title));
+
+        return new ListTemplate.Builder()
+                .setSingleList(listBuilder.build())
+                .setTitle(getCarContext().getString(R.string.template_layouts_demo_title))
+                .setHeaderAction(BACK)
+                .build();
+    }
+
+    private Row buildRowForTemplate(Screen screen, int title) {
+        return new Row.Builder()
+                .setTitle(getCarContext().getString(title))
+                .setOnClickListener(() -> getScreenManager().push(screen))
+                .setBrowsable(true)
+                .build();
+    }
+}
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/settings/CarHardwareDemoScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/settings/CarHardwareDemoScreen.java
new file mode 100644
index 0000000..f7b6614
--- /dev/null
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/settings/CarHardwareDemoScreen.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright 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 androidx.car.app.sample.showcase.common.screens.settings;
+
+import androidx.annotation.NonNull;
+import androidx.car.app.CarContext;
+import androidx.car.app.Screen;
+import androidx.car.app.model.Action;
+import androidx.car.app.model.ActionStrip;
+import androidx.car.app.model.CarIcon;
+import androidx.car.app.model.Template;
+import androidx.car.app.navigation.model.NavigationTemplate;
+import androidx.car.app.sample.showcase.common.R;
+import androidx.car.app.sample.showcase.common.ShowcaseSession;
+import androidx.car.app.sample.showcase.common.renderer.CarHardwareRenderer;
+import androidx.core.graphics.drawable.IconCompat;
+import androidx.lifecycle.DefaultLifecycleObserver;
+import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.LifecycleOwner;
+
+/** Simple demo of how access car hardware information. */
+public final class CarHardwareDemoScreen extends Screen {
+
+    // Package private for inner class reference
+    final CarHardwareRenderer mCarHardwareRenderer;
+
+    public CarHardwareDemoScreen(@NonNull CarContext carContext,
+            @NonNull ShowcaseSession showcaseSession) {
+        super(carContext);
+        mCarHardwareRenderer = new CarHardwareRenderer(carContext);
+        Lifecycle lifecycle = getLifecycle();
+        lifecycle.addObserver(new DefaultLifecycleObserver() {
+
+            @NonNull
+            final ShowcaseSession mShowcaseSession = showcaseSession;
+
+            @Override
+            public void onResume(@NonNull LifecycleOwner owner) {
+                // When this screen is visible set the SurfaceRenderer to show
+                // CarHardware information.
+                mShowcaseSession.overrideRenderer(mCarHardwareRenderer);
+            }
+
+            @Override
+            public void onPause(@NonNull LifecycleOwner owner) {
+                // When this screen is hidden set the SurfaceRenderer to show
+                // CarHardware information.
+                mShowcaseSession.overrideRenderer(null);
+            }
+        });
+    }
+
+    @NonNull
+    @Override
+    public Template onGetTemplate() {
+        ActionStrip actionStrip =
+                new ActionStrip.Builder()
+                        // Add a Button to show the CarHardware info screen
+                        .addAction(new Action.Builder()
+                                .setIcon(
+                                        new CarIcon.Builder(
+                                                IconCompat.createWithResource(
+                                                        getCarContext(),
+                                                        R.drawable.info_gm_grey_24dp))
+                                                .build())
+                                .setOnClickListener(() -> getScreenManager().push(
+                                        new CarHardwareInfoScreen(getCarContext())))
+                                .build())
+                        .addAction(
+                                new Action.Builder()
+                                        .setTitle(getCarContext()
+                                                .getString(R.string.back_caps_action_title))
+                                        .setOnClickListener(this::finish)
+                                        .build())
+                        .build();
+
+        return new NavigationTemplate.Builder().setActionStrip(actionStrip).build();
+    }
+}
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/settings/CarHardwareInfoScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/settings/CarHardwareInfoScreen.java
new file mode 100644
index 0000000..8a14d77
--- /dev/null
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/settings/CarHardwareInfoScreen.java
@@ -0,0 +1,290 @@
+/*
+ * Copyright 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 androidx.car.app.sample.showcase.common.screens.settings;
+
+import android.util.Log;
+
+import androidx.annotation.GuardedBy;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.car.app.CarContext;
+import androidx.car.app.Screen;
+import androidx.car.app.hardware.CarHardwareManager;
+import androidx.car.app.hardware.common.CarValue;
+import androidx.car.app.hardware.common.OnCarDataAvailableListener;
+import androidx.car.app.hardware.info.CarInfo;
+import androidx.car.app.hardware.info.EnergyProfile;
+import androidx.car.app.hardware.info.Model;
+import androidx.car.app.model.Action;
+import androidx.car.app.model.Pane;
+import androidx.car.app.model.PaneTemplate;
+import androidx.car.app.model.Row;
+import androidx.car.app.model.Template;
+import androidx.car.app.sample.showcase.common.R;
+import androidx.core.content.ContextCompat;
+import androidx.lifecycle.DefaultLifecycleObserver;
+import androidx.lifecycle.Lifecycle;
+import androidx.lifecycle.LifecycleOwner;
+
+import java.util.concurrent.Executor;
+
+/**
+ * Creates a screen that show the static information (such as model and energy profile) available
+ * via CarHardware interfaces.
+ */
+public final class CarHardwareInfoScreen extends Screen {
+    private static final String TAG = "showcase";
+
+    // Package private for inner class reference
+    boolean mHasModelPermission;
+    boolean mHasEnergyProfilePermission;
+    final Executor mCarHardwareExecutor;
+
+    /**
+     * Value fetched from CarHardwareManager containing model information.
+     *
+     * <p>It is requested asynchronously and can be {@code null} until the response is
+     * received.
+     */
+    @Nullable
+    @GuardedBy("this")
+    Model mModel;
+
+    /**
+     * Value fetched from CarHardwareManager containing what type of fuel/ports the car has.
+     *
+     * <p>It is requested asynchronously and can be {@code null} until the response is
+     * received.
+     */
+    @Nullable
+    @GuardedBy("this")
+    EnergyProfile mEnergyProfile;
+
+    OnCarDataAvailableListener<Model> mModelListener = data -> {
+        synchronized (this) {
+            Log.i(TAG, "Received model information: " + data);
+            mModel = data;
+            invalidate();
+        }
+    };
+
+    OnCarDataAvailableListener<EnergyProfile> mEnergyProfileListener = data -> {
+        synchronized (this) {
+            Log.i(TAG, "Received energy profile information: " + data);
+            mEnergyProfile = data;
+            invalidate();
+        }
+    };
+
+    public CarHardwareInfoScreen(@NonNull CarContext carContext) {
+        super(carContext);
+        mCarHardwareExecutor = ContextCompat.getMainExecutor(getCarContext());
+        Lifecycle lifecycle = getLifecycle();
+        lifecycle.addObserver(new DefaultLifecycleObserver() {
+
+            @Override
+            public void onCreate(@NonNull LifecycleOwner owner) {
+                CarHardwareManager carHardwareManager =
+                        getCarContext().getCarService(CarHardwareManager.class);
+                CarInfo carInfo = carHardwareManager.getCarInfo();
+
+                // Request any single shot values.
+                synchronized (CarHardwareInfoScreen.this) {
+                    mModel = null;
+
+                    try {
+                        carInfo.fetchModel(mCarHardwareExecutor, mModelListener);
+                        mHasModelPermission = true;
+                    } catch (SecurityException e) {
+                        mHasModelPermission = false;
+                    }
+
+                    mEnergyProfile = null;
+                    try {
+                        carInfo.fetchEnergyProfile(mCarHardwareExecutor, mEnergyProfileListener);
+                        mHasEnergyProfilePermission = true;
+                    } catch (SecurityException e) {
+                        mHasEnergyProfilePermission = false;
+                    }
+                }
+            }
+
+        });
+    }
+
+    @NonNull
+    @Override
+    public Template onGetTemplate() {
+        Pane.Builder paneBuilder = new Pane.Builder();
+        if (allInfoAvailable()) {
+            Row.Builder modelRowBuilder = new Row.Builder()
+                    .setTitle(getCarContext().getString(R.string.model_info));
+            if (!mHasModelPermission) {
+                modelRowBuilder.addText(getCarContext().getString(R.string.no_model_permission));
+            } else {
+                StringBuilder info = new StringBuilder();
+                synchronized (CarHardwareInfoScreen.this) {
+                    if (mModel.getManufacturer().getStatus() != CarValue.STATUS_SUCCESS) {
+                        info.append(getCarContext().getString(R.string.manufacturer_unavailable));
+                        info.append(", ");
+                    } else {
+                        info.append(mModel.getManufacturer().getValue());
+                        info.append(", ");
+                    }
+                    if (mModel.getName().getStatus() != CarValue.STATUS_SUCCESS) {
+                        info.append(getCarContext().getString(R.string.model_unavailable));
+                        info.append(", ");
+                    } else {
+                        info.append(mModel.getName().getValue());
+                        info.append(", ");
+                    }
+                    if (mModel.getYear().getStatus() != CarValue.STATUS_SUCCESS) {
+                        info.append(getCarContext().getString(R.string.year_unavailable));
+                    } else {
+                        info.append(mModel.getYear().getValue());
+                    }
+                }
+                modelRowBuilder.addText(info);
+            }
+            paneBuilder.addRow(modelRowBuilder.build());
+
+            Row.Builder energyProfileRowBuilder = new Row.Builder()
+                    .setTitle(getCarContext().getString(R.string.energy_profile));
+            if (!mHasEnergyProfilePermission) {
+                energyProfileRowBuilder.addText(getCarContext()
+                        .getString(R.string.no_energy_profile_permission));
+            } else {
+                StringBuilder fuelInfo = new StringBuilder();
+
+                synchronized (this) {
+                    if (mEnergyProfile.getFuelTypes().getStatus() != CarValue.STATUS_SUCCESS) {
+                        fuelInfo.append(getCarContext().getString(R.string.fuel_types));
+                        fuelInfo.append(": ");
+                        fuelInfo.append(getCarContext().getString(R.string.unavailable));
+                    } else {
+                        fuelInfo.append(getCarContext().getString(R.string.fuel_types));
+                        fuelInfo.append(": ");
+                        for (int fuelType : mEnergyProfile.getFuelTypes().getValue()) {
+                            fuelInfo.append(fuelTypeAsString(fuelType));
+                            fuelInfo.append(" ");
+                        }
+                    }
+                    energyProfileRowBuilder.addText(fuelInfo);
+                    StringBuilder evInfo = new StringBuilder();
+                    if (mEnergyProfile.getEvConnectorTypes().getStatus()
+                            != CarValue.STATUS_SUCCESS) {
+                        evInfo.append(" ");
+                        evInfo.append(getCarContext().getString(R.string.ev_connector_types));
+                        evInfo.append(": ");
+                        evInfo.append(getCarContext().getString(R.string.unavailable));
+                    } else {
+                        evInfo.append(getCarContext().getString(R.string.ev_connector_types));
+                        evInfo.append(": ");
+                        for (int connectorType : mEnergyProfile.getEvConnectorTypes().getValue()) {
+                            evInfo.append(evConnectorAsString(connectorType));
+                            evInfo.append(" ");
+                        }
+                    }
+                    energyProfileRowBuilder.addText(evInfo);
+                }
+            }
+            paneBuilder.addRow(energyProfileRowBuilder.build());
+        } else {
+            paneBuilder.setLoading(true);
+        }
+        return new PaneTemplate.Builder(paneBuilder.build())
+                .setHeaderAction(Action.BACK)
+                .setTitle(getCarContext().getString(R.string.car_hardware_info))
+                .build();
+    }
+
+    private boolean allInfoAvailable() {
+        synchronized (this) {
+            if (mHasModelPermission && mModel == null) {
+                return false;
+            }
+            if (mHasEnergyProfilePermission && mEnergyProfile == null) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    private String fuelTypeAsString(int fuelType) {
+        switch (fuelType) {
+            case EnergyProfile.FUEL_TYPE_UNLEADED:
+                return "UNLEADED";
+            case EnergyProfile.FUEL_TYPE_LEADED:
+                return "LEADED";
+            case EnergyProfile.FUEL_TYPE_DIESEL_1:
+                return "DIESEL_1";
+            case EnergyProfile.FUEL_TYPE_DIESEL_2:
+                return "DIESEL_2";
+            case EnergyProfile.FUEL_TYPE_BIODIESEL:
+                return "BIODIESEL";
+            case EnergyProfile.FUEL_TYPE_E85:
+                return "E85";
+            case EnergyProfile.FUEL_TYPE_LPG:
+                return "LPG";
+            case EnergyProfile.FUEL_TYPE_CNG:
+                return "CNG";
+            case EnergyProfile.FUEL_TYPE_LNG:
+                return "LNG";
+            case EnergyProfile.FUEL_TYPE_ELECTRIC:
+                return "ELECTRIC";
+            case EnergyProfile.FUEL_TYPE_HYDROGEN:
+                return "HYDROGEN";
+            case EnergyProfile.FUEL_TYPE_OTHER:
+                return "OTHER";
+            case EnergyProfile.FUEL_TYPE_UNKNOWN:
+            default:
+                return "UNKNOWN";
+        }
+    }
+
+    private String evConnectorAsString(int evConnectorType) {
+        switch (evConnectorType) {
+            case EnergyProfile.EVCONNECTOR_TYPE_J1772:
+                return "J1772";
+            case EnergyProfile.EVCONNECTOR_TYPE_MENNEKES:
+                return "MENNEKES";
+            case EnergyProfile.EVCONNECTOR_TYPE_CHADEMO:
+                return "CHADEMO";
+            case EnergyProfile.EVCONNECTOR_TYPE_COMBO_1:
+                return "COMBO_1";
+            case EnergyProfile.EVCONNECTOR_TYPE_COMBO_2:
+                return "COMBO_2";
+            case EnergyProfile.EVCONNECTOR_TYPE_TESLA_ROADSTER:
+                return "TESLA_ROADSTER";
+            case EnergyProfile.EVCONNECTOR_TYPE_TESLA_HPWC:
+                return "TESLA_HPWC";
+            case EnergyProfile.EVCONNECTOR_TYPE_TESLA_SUPERCHARGER:
+                return "TESLA_SUPERCHARGER";
+            case EnergyProfile.EVCONNECTOR_TYPE_GBT:
+                return "GBT";
+            case EnergyProfile.EVCONNECTOR_TYPE_GBT_DC:
+                return "GBT_DC";
+            case EnergyProfile.EVCONNECTOR_TYPE_SCAME:
+                return "SCAME";
+            case EnergyProfile.EVCONNECTOR_TYPE_OTHER:
+                return "OTHER";
+            case EnergyProfile.EVCONNECTOR_TYPE_UNKNOWN:
+            default:
+                return "UNKNOWN";
+        }
+    }
+}
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/settings/ContentLimitsDemoScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/settings/ContentLimitsDemoScreen.java
new file mode 100644
index 0000000..8a728b4
--- /dev/null
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/settings/ContentLimitsDemoScreen.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright 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 androidx.car.app.sample.showcase.common.screens.settings;
+
+import static androidx.car.app.model.Action.BACK;
+import static androidx.car.app.sample.showcase.common.screens.settings.LoadingScreen.loadingScreenTemplate;
+
+import android.content.Context;
+import android.os.Handler;
+import android.os.Looper;
+
+import androidx.annotation.NonNull;
+import androidx.car.app.CarContext;
+import androidx.car.app.Screen;
+import androidx.car.app.constraints.ConstraintManager;
+import androidx.car.app.model.ItemList;
+import androidx.car.app.model.ListTemplate;
+import androidx.car.app.model.Row;
+import androidx.car.app.model.Template;
+import androidx.car.app.sample.showcase.common.R;
+import androidx.car.app.sample.showcase.common.ShowcaseService;
+import androidx.lifecycle.DefaultLifecycleObserver;
+import androidx.lifecycle.LifecycleOwner;
+
+/**
+ * A {@link Screen} that shows examples on how to query for various content limits via the
+ * {@lnk ConstraintManager} API.
+ */
+public class ContentLimitsDemoScreen extends Screen implements DefaultLifecycleObserver {
+
+    // Loading State parameters
+    private static final int LOADING_TIME_MILLIS = 1000;
+    private boolean mIsFinishedLoading;
+    private final Handler mHandler = new Handler(Looper.getMainLooper());
+    private boolean mShouldLoadScreens;
+
+    public ContentLimitsDemoScreen(@NonNull CarContext carContext) {
+        super(carContext);
+        getLifecycle().addObserver(this);
+    }
+
+    @Override
+    @SuppressWarnings({"FutureReturnValueIgnored"})
+    public void onStart(@NonNull LifecycleOwner owner) {
+        mShouldLoadScreens =
+                getCarContext()
+                        .getSharedPreferences(ShowcaseService.SHARED_PREF_KEY, Context.MODE_PRIVATE)
+                        .getBoolean(ShowcaseService.LOADING_KEY, false);
+        if (mShouldLoadScreens) {
+            // Post a message that finishes loading the template after some time.
+            mHandler.postDelayed(
+                    () -> {
+                        mIsFinishedLoading = true;
+                        invalidate();
+                    },
+                    LOADING_TIME_MILLIS);
+        }
+    }
+
+    @NonNull
+    @Override
+    public Template onGetTemplate() {
+
+        if (!mIsFinishedLoading && mShouldLoadScreens) {
+            return loadingScreenTemplate(getCarContext());
+        }
+
+        ItemList.Builder listBuilder = new ItemList.Builder();
+
+        listBuilder.addItem(buildRowForTemplate(R.string.list_limit,
+                ConstraintManager.CONTENT_LIMIT_TYPE_LIST));
+
+        listBuilder.addItem(buildRowForTemplate(R.string.grid_limit,
+                ConstraintManager.CONTENT_LIMIT_TYPE_GRID));
+
+        listBuilder.addItem(buildRowForTemplate(R.string.pane_limit,
+                ConstraintManager.CONTENT_LIMIT_TYPE_PANE));
+
+        listBuilder.addItem(buildRowForTemplate(R.string.place_list_limit,
+                ConstraintManager.CONTENT_LIMIT_TYPE_PLACE_LIST));
+
+        listBuilder.addItem(buildRowForTemplate(R.string.route_list_limit,
+                ConstraintManager.CONTENT_LIMIT_TYPE_ROUTE_LIST));
+
+        return new ListTemplate.Builder()
+                .setSingleList(listBuilder.build())
+                .setTitle(getCarContext().getString(R.string.content_limits))
+                .setHeaderAction(BACK)
+                .build();
+    }
+
+    private Row buildRowForTemplate(int title, int contentLimitType) {
+        return new Row.Builder()
+                .setTitle(getCarContext().getString(title))
+                .addText(Integer.toString(getCarContext()
+                        .getCarService(ConstraintManager.class)
+                        .getContentLimit(contentLimitType)))
+                .build();
+    }
+}
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/settings/LatestFeatures.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/settings/LatestFeatures.java
new file mode 100644
index 0000000..26b7a6e
--- /dev/null
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/settings/LatestFeatures.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 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 androidx.car.app.sample.showcase.common.screens.settings;
+
+
+import static androidx.car.app.sample.showcase.common.screens.settings.LoadingScreen.loadingScreenTemplate;
+
+import android.content.Context;
+import android.os.Handler;
+import android.os.Looper;
+
+import androidx.annotation.NonNull;
+import androidx.car.app.CarContext;
+import androidx.car.app.Screen;
+import androidx.car.app.model.Action;
+import androidx.car.app.model.MessageTemplate;
+import androidx.car.app.model.Template;
+import androidx.car.app.sample.showcase.common.R;
+import androidx.car.app.sample.showcase.common.ShowcaseService;
+import androidx.lifecycle.DefaultLifecycleObserver;
+import androidx.lifecycle.LifecycleOwner;
+
+/** A screen that demonstrates the message template. */
+public class LatestFeatures extends Screen implements DefaultLifecycleObserver {
+
+    private static final int LOADING_TIME_MILLIS = 1000;
+    private boolean mIsFinishedLoading;
+    private final Handler mHandler = new Handler(Looper.getMainLooper());
+    private boolean mShouldLoadScreens;
+
+    public LatestFeatures(@NonNull CarContext carContext) {
+        super(carContext);
+        getLifecycle().addObserver(this);
+    }
+
+    @Override
+    @SuppressWarnings({"FutureReturnValueIgnored"})
+    public void onStart(@NonNull LifecycleOwner owner) {
+        mShouldLoadScreens =
+                getCarContext()
+                        .getSharedPreferences(ShowcaseService.SHARED_PREF_KEY, Context.MODE_PRIVATE)
+                        .getBoolean(ShowcaseService.LOADING_KEY, false);
+        if (mShouldLoadScreens) {
+            // Post a message that finishes loading the template after some time.
+            mHandler.postDelayed(
+                    () -> {
+                        mIsFinishedLoading = true;
+                        invalidate();
+                    },
+                    LOADING_TIME_MILLIS);
+        }
+    }
+
+    @NonNull
+    @Override
+    public Template onGetTemplate() {
+        if (!mIsFinishedLoading && mShouldLoadScreens) {
+            return loadingScreenTemplate(getCarContext());
+        } else {
+            return new MessageTemplate.Builder(
+                    getCarContext().getString(R.string.latest_feature_details))
+                    .setTitle(getCarContext().getString(R.string.latest_feature_title))
+                    .setHeaderAction(Action.BACK)
+                    .build();
+        }
+
+    }
+}
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/settings/LoadingScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/settings/LoadingScreen.java
new file mode 100644
index 0000000..f6fae20
--- /dev/null
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/settings/LoadingScreen.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 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 androidx.car.app.sample.showcase.common.screens.settings;
+
+import static androidx.car.app.model.Action.BACK;
+
+import androidx.annotation.NonNull;
+import androidx.car.app.CarContext;
+import androidx.car.app.model.MessageTemplate;
+import androidx.car.app.model.Template;
+import androidx.car.app.sample.showcase.common.R;
+
+/** A class that provides a sample template for a loading screen */
+public abstract class LoadingScreen {
+
+    private LoadingScreen() {
+    }
+
+    /**
+    * Returns a sample template to be used for loading a screen
+    */
+    @NonNull
+    public static Template loadingScreenTemplate(@NonNull CarContext carContext) {
+        return new MessageTemplate.Builder(
+                carContext.getString(R.string.loading_screen))
+                .setLoading(true)
+                .setHeaderAction(BACK)
+                .build();
+    }
+}
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/settings/ParkedVsDrivingDemoScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/settings/ParkedVsDrivingDemoScreen.java
new file mode 100644
index 0000000..ba198e9
--- /dev/null
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/settings/ParkedVsDrivingDemoScreen.java
@@ -0,0 +1,103 @@
+/*
+ * 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 androidx.car.app.sample.showcase.common.screens.settings;
+
+import static androidx.car.app.CarToast.LENGTH_LONG;
+import static androidx.car.app.model.Action.BACK;
+import static androidx.car.app.sample.showcase.common.screens.settings.LoadingScreen.loadingScreenTemplate;
+
+import android.content.Context;
+import android.os.Handler;
+import android.os.Looper;
+
+import androidx.annotation.NonNull;
+import androidx.car.app.CarContext;
+import androidx.car.app.CarToast;
+import androidx.car.app.Screen;
+import androidx.car.app.model.ItemList;
+import androidx.car.app.model.ListTemplate;
+import androidx.car.app.model.ParkedOnlyOnClickListener;
+import androidx.car.app.model.Row;
+import androidx.car.app.model.Template;
+import androidx.car.app.sample.showcase.common.R;
+import androidx.car.app.sample.showcase.common.ShowcaseService;
+import androidx.lifecycle.DefaultLifecycleObserver;
+import androidx.lifecycle.LifecycleOwner;
+
+/** A screen demonstrating selectable lists. */
+public final class ParkedVsDrivingDemoScreen extends Screen implements DefaultLifecycleObserver {
+
+    // Adding loading state parameters
+    private static final int LOADING_TIME_MILLIS = 1000;
+    private boolean mIsFinishedLoading;
+    private final Handler mHandler = new Handler(Looper.getMainLooper());
+    private boolean mShouldLoadScreens;
+
+    public ParkedVsDrivingDemoScreen(@NonNull CarContext carContext) {
+        super(carContext);
+        getLifecycle().addObserver(this);
+    }
+
+    @Override
+    @SuppressWarnings({"FutureReturnValueIgnored"})
+    public void onStart(@NonNull LifecycleOwner owner) {
+        mShouldLoadScreens =
+                getCarContext()
+                        .getSharedPreferences(ShowcaseService.SHARED_PREF_KEY, Context.MODE_PRIVATE)
+                        .getBoolean(ShowcaseService.LOADING_KEY, false);
+        if (mShouldLoadScreens) {
+            // Post a message that finishes loading the template after some time.
+            mHandler.postDelayed(
+                    () -> {
+                        mIsFinishedLoading = true;
+                        invalidate();
+                    },
+                    LOADING_TIME_MILLIS);
+        }
+    }
+
+    @NonNull
+    @Override
+    public Template onGetTemplate() {
+
+        if (!mIsFinishedLoading && mShouldLoadScreens) {
+            return loadingScreenTemplate(getCarContext());
+        }
+
+        ItemList.Builder listBuilder = new ItemList.Builder();
+
+
+        listBuilder.addItem(
+                new Row.Builder()
+                        .setOnClickListener(
+                                ParkedOnlyOnClickListener.create(() -> onClick(
+                                        getCarContext().getString(R.string.parked_toast_msg))))
+                        .setTitle(getCarContext().getString(R.string.parked_only_title))
+                        .addText(getCarContext().getString(R.string.parked_only_text))
+                        .build());
+
+        return new ListTemplate.Builder()
+                .setSingleList(listBuilder.build())
+                .setTitle(getCarContext().getString(R.string.parking_vs_driving_demo_title))
+                .setHeaderAction(BACK)
+                .build();
+    }
+
+    private void onClick(String text) {
+        CarToast.makeText(getCarContext(), text, LENGTH_LONG).show();
+    }
+}
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/GridTemplateMenuDemoScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/GridTemplateMenuDemoScreen.java
new file mode 100644
index 0000000..930f1b3
--- /dev/null
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/GridTemplateMenuDemoScreen.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 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 androidx.car.app.sample.showcase.common.screens.templatelayouts;
+
+import static androidx.car.app.model.Action.BACK;
+
+import androidx.annotation.NonNull;
+import androidx.car.app.CarContext;
+import androidx.car.app.Screen;
+import androidx.car.app.model.ItemList;
+import androidx.car.app.model.ListTemplate;
+import androidx.car.app.model.Row;
+import androidx.car.app.model.Template;
+import androidx.car.app.sample.showcase.common.R;
+import androidx.car.app.sample.showcase.common.misc.NotificationDemoScreen;
+import androidx.car.app.sample.showcase.common.screens.templatelayouts.gridtemplates.GridTemplateDemoScreen;
+import androidx.lifecycle.DefaultLifecycleObserver;
+
+/**
+ * Creates a screen that demonstrates usage of the full screen {@link ListTemplate} to display a
+ * full-screen list.
+ */
+public final class GridTemplateMenuDemoScreen extends Screen implements DefaultLifecycleObserver {
+
+    public GridTemplateMenuDemoScreen(@NonNull CarContext carContext) {
+        super(carContext);
+        getLifecycle().addObserver(this);
+    }
+
+    @NonNull
+    @Override
+    public Template onGetTemplate() {
+        ItemList.Builder listBuilder = new ItemList.Builder();
+
+        listBuilder.addItem(buildRowForTemplate(new GridTemplateDemoScreen(getCarContext()),
+                R.string.grid_template_demo_title));
+        listBuilder.addItem(buildRowForTemplate(new NotificationDemoScreen(getCarContext()),
+                R.string.notification_template_demo_title));
+        return new ListTemplate.Builder()
+                .setSingleList(listBuilder.build())
+                .setTitle(getCarContext().getString(R.string.grid_template_menu_demo_title))
+                .setHeaderAction(BACK)
+                .build();
+    }
+
+    private Row buildRowForTemplate(Screen screen, int title) {
+        return new Row.Builder()
+                .setTitle(getCarContext().getString(title))
+                .setOnClickListener(() -> getScreenManager().push(screen))
+                .setBrowsable(true)
+                .build();
+    }
+}
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/ListTemplateDemoScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/ListTemplateDemoScreen.java
new file mode 100644
index 0000000..1888b87
--- /dev/null
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/ListTemplateDemoScreen.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 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 androidx.car.app.sample.showcase.common.screens.templatelayouts;
+
+import static androidx.car.app.model.Action.BACK;
+
+import androidx.annotation.NonNull;
+import androidx.car.app.CarContext;
+import androidx.car.app.Screen;
+import androidx.car.app.model.ItemList;
+import androidx.car.app.model.ListTemplate;
+import androidx.car.app.model.Row;
+import androidx.car.app.model.Template;
+import androidx.car.app.sample.showcase.common.R;
+import androidx.car.app.sample.showcase.common.screens.templatelayouts.listtemplates.ContentProviderIconsDemoScreen;
+import androidx.car.app.sample.showcase.common.screens.templatelayouts.listtemplates.RadioButtonListDemoScreen;
+import androidx.car.app.sample.showcase.common.screens.templatelayouts.listtemplates.TextAndIconsDemosScreen;
+import androidx.car.app.sample.showcase.common.screens.templatelayouts.listtemplates.ToggleButtonListDemoScreen;
+
+/**
+ * Creates a screen that demonstrates usage of the full screen {@link ListTemplate} to display a
+ * full-screen list.
+ */
+public final class ListTemplateDemoScreen extends Screen {
+
+    public ListTemplateDemoScreen(@NonNull CarContext carContext) {
+        super(carContext);
+    }
+
+    @NonNull
+    @Override
+    public Template onGetTemplate() {
+        ItemList.Builder listBuilder = new ItemList.Builder();
+        listBuilder.addItem(buildRowForTemplate(new RadioButtonListDemoScreen(getCarContext()),
+                R.string.radio_button_list_demo_title));
+        listBuilder.addItem(buildRowForTemplate(new ToggleButtonListDemoScreen(getCarContext()),
+                R.string.toggle_button_demo_title));
+        listBuilder.addItem(buildRowForTemplate(new TextAndIconsDemosScreen(getCarContext()),
+                R.string.text_icons_demo_title));
+        listBuilder.addItem(buildRowForTemplate(new ContentProviderIconsDemoScreen(getCarContext()),
+                R.string.content_provider_icons_demo_title));
+        return new ListTemplate.Builder()
+                .setSingleList(listBuilder.build())
+                .setTitle(getCarContext().getString(R.string.list_template_demo_title))
+                .setHeaderAction(BACK)
+                .build();
+    }
+
+    private Row buildRowForTemplate(Screen screen, int title) {
+        return new Row.Builder()
+                .setTitle(getCarContext().getString(title))
+                .setOnClickListener(() -> getScreenManager().push(screen))
+                .setBrowsable(true)
+                .build();
+    }
+}
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/MessageTemplateDemoScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/MessageTemplateDemoScreen.java
new file mode 100644
index 0000000..32aaa1a
--- /dev/null
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/MessageTemplateDemoScreen.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 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 androidx.car.app.sample.showcase.common.screens.templatelayouts;
+
+import static androidx.car.app.model.Action.BACK;
+
+import androidx.annotation.NonNull;
+import androidx.car.app.CarContext;
+import androidx.car.app.Screen;
+import androidx.car.app.model.ItemList;
+import androidx.car.app.model.ListTemplate;
+import androidx.car.app.model.Row;
+import androidx.car.app.model.Template;
+import androidx.car.app.sample.showcase.common.R;
+import androidx.car.app.sample.showcase.common.screens.templatelayouts.messagetemplates.LongMessageTemplateDemoScreen;
+import androidx.car.app.sample.showcase.common.screens.templatelayouts.messagetemplates.ShortMessageTemplateDemoScreen;
+import androidx.lifecycle.DefaultLifecycleObserver;
+
+/**
+ * Creates a screen that demonstrates usage of the full screen {@link ListTemplate} to display a
+ * full-screen list.
+ */
+public final class MessageTemplateDemoScreen extends Screen implements DefaultLifecycleObserver {
+
+    public MessageTemplateDemoScreen(@NonNull CarContext carContext) {
+        super(carContext);
+        getLifecycle().addObserver(this);
+    }
+
+    @NonNull
+    @Override
+    public Template onGetTemplate() {
+        ItemList.Builder listBuilder = new ItemList.Builder();
+
+        listBuilder.addItem(buildRowForTemplate(new ShortMessageTemplateDemoScreen(getCarContext()),
+                R.string.short_msg_template_demo_title));
+        listBuilder.addItem(buildRowForTemplate(new LongMessageTemplateDemoScreen(getCarContext()),
+                R.string.long_msg_template_demo_title));
+        return new ListTemplate.Builder()
+                .setSingleList(listBuilder.build())
+                .setTitle(getCarContext().getString(R.string.msg_template_demo_title))
+                .setHeaderAction(BACK)
+                .build();
+    }
+
+    private Row buildRowForTemplate(Screen screen, int title) {
+        return new Row.Builder()
+                .setTitle(getCarContext().getString(title))
+                .setOnClickListener(() -> getScreenManager().push(screen))
+                .setBrowsable(true)
+                .build();
+    }
+}
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/PaneTemplateDemoScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/PaneTemplateDemoScreen.java
new file mode 100644
index 0000000..baac535
--- /dev/null
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/PaneTemplateDemoScreen.java
@@ -0,0 +1,160 @@
+/*
+ * 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 androidx.car.app.sample.showcase.common.screens.templatelayouts;
+
+import static androidx.car.app.CarToast.LENGTH_SHORT;
+import static androidx.car.app.model.Action.FLAG_PRIMARY;
+
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.car.app.CarContext;
+import androidx.car.app.CarToast;
+import androidx.car.app.Screen;
+import androidx.car.app.constraints.ConstraintManager;
+import androidx.car.app.model.Action;
+import androidx.car.app.model.ActionStrip;
+import androidx.car.app.model.CarColor;
+import androidx.car.app.model.CarIcon;
+import androidx.car.app.model.Pane;
+import androidx.car.app.model.PaneTemplate;
+import androidx.car.app.model.Row;
+import androidx.car.app.model.Template;
+import androidx.car.app.sample.showcase.common.R;
+import androidx.car.app.versioning.CarAppApiLevels;
+import androidx.core.graphics.drawable.IconCompat;
+import androidx.lifecycle.DefaultLifecycleObserver;
+import androidx.lifecycle.LifecycleOwner;
+
+/**
+ * Creates a screen that demonstrates usage of the full screen {@link PaneTemplate} to display a
+ * details screen.
+ */
+public final class PaneTemplateDemoScreen extends Screen implements DefaultLifecycleObserver {
+    @Nullable
+    private IconCompat mPaneImage;
+
+    @Nullable
+    private IconCompat mRowLargeIcon;
+
+    @Nullable
+    private IconCompat mCommuteIcon;
+
+    public PaneTemplateDemoScreen(@NonNull CarContext carContext) {
+        super(carContext);
+        getLifecycle().addObserver(this);
+    }
+
+    @Override
+    public void onCreate(@NonNull LifecycleOwner owner) {
+        Resources resources = getCarContext().getResources();
+        Bitmap bitmap = BitmapFactory.decodeResource(resources, R.drawable.patio);
+        mPaneImage = IconCompat.createWithBitmap(bitmap);
+        mRowLargeIcon = IconCompat.createWithResource(getCarContext(),
+                R.drawable.ic_fastfood_white_48dp);
+        mCommuteIcon = IconCompat.createWithResource(getCarContext(), R.drawable.ic_commute_24px);
+    }
+
+    private Row createRow(int index) {
+        switch (index) {
+            case 0:
+                // Row with a large image.
+                return new Row.Builder()
+                        .setTitle(getCarContext().getString(R.string.first_row_title))
+                        .addText(getCarContext().getString(R.string.first_row_text))
+                        .addText(getCarContext().getString(R.string.first_row_text))
+                        .setImage(new CarIcon.Builder(mRowLargeIcon).build())
+                        .build();
+            default:
+                return new Row.Builder()
+                        .setTitle(
+                                getCarContext().getString(R.string.other_row_title_prefix) + (index
+                                        + 1))
+                        .addText(getCarContext().getString(R.string.other_row_text))
+                        .addText(getCarContext().getString(R.string.other_row_text))
+                        .build();
+        }
+    }
+
+    @NonNull
+    @Override
+    public Template onGetTemplate() {
+        int listLimit = getCarContext().getCarService(ConstraintManager.class).getContentLimit(
+                ConstraintManager.CONTENT_LIMIT_TYPE_PANE);
+
+        Pane.Builder paneBuilder = new Pane.Builder();
+        for (int i = 0; i < listLimit; i++) {
+            paneBuilder.addRow(createRow(i));
+        }
+
+        // Also set a large image outside of the rows.
+        paneBuilder.setImage(new CarIcon.Builder(mPaneImage).build());
+
+        Action.Builder primaryActionBuilder = new Action.Builder()
+                .setTitle(getCarContext().getString(R.string.search_action_title))
+                .setBackgroundColor(CarColor.BLUE)
+                .setOnClickListener(
+                        () -> CarToast.makeText(
+                                        getCarContext(),
+                                        getCarContext().getString(R.string.search_toast_msg),
+                                        LENGTH_SHORT)
+                                .show());
+        if (getCarContext().getCarAppApiLevel() >= CarAppApiLevels.LEVEL_4) {
+            primaryActionBuilder.setFlags(FLAG_PRIMARY);
+        }
+
+        paneBuilder
+                .addAction(primaryActionBuilder.build())
+                .addAction(
+                        new Action.Builder()
+                                .setTitle(getCarContext().getString(R.string.options_action_title))
+                                .setOnClickListener(
+                                        () -> CarToast.makeText(
+                                                        getCarContext(),
+                                                        getCarContext().getString(
+                                                                R.string.options_toast_msg),
+                                                        LENGTH_SHORT)
+                                                .show())
+                                .build());
+
+        return new PaneTemplate.Builder(paneBuilder.build())
+                .setHeaderAction(Action.BACK)
+                .setActionStrip(
+                        new ActionStrip.Builder()
+                                .addAction(new Action.Builder()
+                                        .setTitle(getCarContext().getString(
+                                                R.string.commute_action_title))
+                                        .setIcon(
+                                                new CarIcon.Builder(mCommuteIcon)
+                                                        .setTint(CarColor.BLUE)
+                                                        .build())
+                                        .setOnClickListener(
+                                                () -> CarToast.makeText(
+                                                                getCarContext(),
+                                                                getCarContext().getString(
+                                                                        R.string.commute_toast_msg),
+                                                                LENGTH_SHORT)
+                                                        .show())
+                                        .build())
+                                .build())
+                .setTitle(getCarContext().getString(R.string.pane_template_demo_title))
+                .build();
+    }
+}
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/SearchTemplateDemoScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/SearchTemplateDemoScreen.java
new file mode 100644
index 0000000..b0387e7
--- /dev/null
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/SearchTemplateDemoScreen.java
@@ -0,0 +1,92 @@
+/*
+ * 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 androidx.car.app.sample.showcase.common.screens.templatelayouts;
+
+import static androidx.car.app.CarToast.LENGTH_LONG;
+
+import androidx.annotation.NonNull;
+import androidx.car.app.CarContext;
+import androidx.car.app.CarToast;
+import androidx.car.app.Screen;
+import androidx.car.app.model.Action;
+import androidx.car.app.model.ActionStrip;
+import androidx.car.app.model.ItemList;
+import androidx.car.app.model.Row;
+import androidx.car.app.model.SearchTemplate;
+import androidx.car.app.model.SearchTemplate.SearchCallback;
+import androidx.car.app.model.Template;
+import androidx.car.app.sample.showcase.common.R;
+
+/** A screen that demonstrates the search template. */
+public class SearchTemplateDemoScreen extends Screen {
+
+    public SearchTemplateDemoScreen(@NonNull CarContext carContext) {
+        super(carContext);
+    }
+
+    @NonNull
+    @Override
+    public Template onGetTemplate() {
+        ItemList.Builder listBuilder = new ItemList.Builder();
+        for (int i = 1; i <= 6; ++i) {
+            listBuilder.addItem(
+                    new Row.Builder()
+                            .setTitle(getCarContext().getString(R.string.title_prefix) + " " + i)
+                            .addText(getCarContext().getString(R.string.first_line_text))
+                            .addText(getCarContext().getString(R.string.second_line_text))
+                            .build());
+        }
+
+        SearchCallback searchListener =
+                new SearchCallback() {
+                    @Override
+                    public void onSearchTextChanged(@NonNull String searchText) {
+                    }
+
+                    @Override
+                    public void onSearchSubmitted(@NonNull String searchText) {
+                        CarToast.makeText(
+                                        getCarContext(),
+                                        "Searched for " + searchText,
+                                        LENGTH_LONG)
+                                .show();
+                    }
+                };
+
+        ActionStrip actionStrip = new ActionStrip.Builder()
+                .addAction(
+                        new Action.Builder()
+                                .setTitle(getCarContext().getString(R.string.settings_action_title))
+                                .setOnClickListener(
+                                        () -> CarToast.makeText(
+                                                        getCarContext(),
+                                                        getCarContext().getString(
+                                                                R.string.settings_toast_msg),
+                                                        LENGTH_LONG)
+                                                .show())
+                                .build())
+                .build();
+
+        return new SearchTemplate.Builder(searchListener)
+                .setSearchHint(getCarContext().getString(R.string.search_hint))
+                .setHeaderAction(Action.BACK)
+                .setShowKeyboardByDefault(false)
+                .setItemList(listBuilder.build())
+                .setActionStrip(actionStrip)
+                .build();
+    }
+}
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/SignInTemplateDemoScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/SignInTemplateDemoScreen.java
new file mode 100644
index 0000000..e552e9c
--- /dev/null
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/SignInTemplateDemoScreen.java
@@ -0,0 +1,360 @@
+/*
+ * 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 androidx.car.app.sample.showcase.common.screens.templatelayouts;
+
+import static androidx.car.app.CarToast.LENGTH_LONG;
+
+import android.graphics.Color;
+import android.net.Uri;
+
+import androidx.activity.OnBackPressedCallback;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.car.app.CarContext;
+import androidx.car.app.CarToast;
+import androidx.car.app.Screen;
+import androidx.car.app.model.Action;
+import androidx.car.app.model.CarColor;
+import androidx.car.app.model.CarIcon;
+import androidx.car.app.model.InputCallback;
+import androidx.car.app.model.MessageTemplate;
+import androidx.car.app.model.ParkedOnlyOnClickListener;
+import androidx.car.app.model.Template;
+import androidx.car.app.model.signin.InputSignInMethod;
+import androidx.car.app.model.signin.PinSignInMethod;
+import androidx.car.app.model.signin.ProviderSignInMethod;
+import androidx.car.app.model.signin.QRCodeSignInMethod;
+import androidx.car.app.model.signin.SignInTemplate;
+import androidx.car.app.sample.showcase.common.R;
+import androidx.car.app.sample.showcase.common.common.Utils;
+import androidx.car.app.sample.showcase.common.screens.templatelayouts.messagetemplates.LongMessageTemplateDemoScreen;
+import androidx.car.app.versioning.CarAppApiLevels;
+import androidx.core.graphics.drawable.IconCompat;
+
+/** A screen that demonstrates the sign-in template. */
+public class SignInTemplateDemoScreen extends Screen {
+    private static final String EMAIL_REGEXP = "^(.+)@(.+)$";
+    private static final String EXPECTED_PASSWORD = "password";
+    private static final int MIN_USERNAME_LENGTH = 5;
+    private final CharSequence mAdditionalText;
+    private final Action mProviderSignInAction;
+    private final Action mPinSignInAction;
+    private final Action mQRCodeSignInAction;
+    // package private to avoid synthetic accessor
+    State mState = State.USERNAME;
+    String mLastErrorMessage; // last displayed error message
+    String mErrorMessage;
+
+    @Nullable
+    String mUsername;
+
+    public SignInTemplateDemoScreen(@NonNull CarContext carContext) {
+        super(carContext);
+
+        // Handle back pressed events manually, as we use them to navigate between templates within
+        // the same screen.
+        OnBackPressedCallback callback = new OnBackPressedCallback(true) {
+            @Override
+            public void handleOnBackPressed() {
+                mErrorMessage = "";
+                if (mState == State.USERNAME || mState == State.SIGNED_IN) {
+                    getScreenManager().pop();
+                } else {
+                    mState = State.USERNAME;
+                    invalidate();
+                }
+            }
+        };
+        carContext.getOnBackPressedDispatcher().addCallback(this, callback);
+
+        mAdditionalText = Utils.clickable(getCarContext().getString(R.string.additional_text), 18,
+                16,
+                () -> getScreenManager().push(new LongMessageTemplateDemoScreen(getCarContext())));
+
+        mProviderSignInAction = new Action.Builder()
+                .setTitle(getCarContext().getString(R.string.google_sign_in))
+                .setOnClickListener(ParkedOnlyOnClickListener.create(() -> {
+                    mState = State.PROVIDER;
+                    invalidate();
+                }))
+                .build();
+
+        mPinSignInAction = new Action.Builder()
+                .setTitle(getCarContext().getString(R.string.use_pin))
+                .setOnClickListener(ParkedOnlyOnClickListener.create(() -> {
+                    mState = State.PIN;
+                    invalidate();
+                }))
+                .build();
+
+        mQRCodeSignInAction = new Action.Builder()
+                .setTitle(getCarContext().getString(R.string.qr_code))
+                .setOnClickListener(ParkedOnlyOnClickListener.create(() -> {
+                    mState = State.QR_CODE;
+                    invalidate();
+                }))
+                .build();
+    }
+
+    @NonNull
+    @Override
+    public Template onGetTemplate() {
+        if (getCarContext().getCarAppApiLevel() < CarAppApiLevels.LEVEL_2) {
+            return new MessageTemplate.Builder(
+                    getCarContext().getString(R.string.sign_in_template_not_supported_text))
+                    .setTitle(getCarContext().getString(
+                            R.string.sign_in_template_not_supported_title))
+                    .setHeaderAction(Action.BACK)
+                    .build();
+        }
+        switch (mState) {
+            case USERNAME:
+                return getUsernameSignInTemplate();
+            case PASSWORD:
+                return getPasswordSignInTemplate();
+            case PIN:
+                return getPinSignInTemplate();
+            case PROVIDER:
+                return getProviderSignInTemplate();
+            case QR_CODE:
+                return getQRCodeSignInTemplate();
+            case SIGNED_IN:
+                return getSignInCompletedMessageTemplate();
+        }
+        throw new IllegalStateException("Invalid state: " + mState);
+    }
+
+    private Template getUsernameSignInTemplate() {
+        InputCallback listener = new InputCallback() {
+            @Override
+            public void onInputSubmitted(@NonNull String text) {
+                if (mState == State.USERNAME) {
+                    mUsername = text;
+                    submitUsername();
+                }
+            }
+
+            @Override
+            public void onInputTextChanged(@NonNull String text) {
+                // This callback demonstrates how to use handle the text changed event.
+                // In this case, we check that the user name doesn't exceed a certain length.
+                if (mState == State.USERNAME) {
+                    mUsername = text;
+                    mErrorMessage = validateUsername();
+
+                    // Invalidate the template (and hence possibly update the error message) only
+                    // if clearing up the error string, or if the error is changing.
+                    if (!mLastErrorMessage.isEmpty()
+                            && (mErrorMessage.isEmpty()
+                            || !mLastErrorMessage.equals(mErrorMessage))) {
+                        invalidate();
+                    }
+                }
+            }
+        };
+
+        InputSignInMethod.Builder builder = new InputSignInMethod.Builder(listener)
+                .setHint(getCarContext().getString(R.string.email_hint))
+                .setKeyboardType(InputSignInMethod.KEYBOARD_EMAIL);
+        if (mErrorMessage != null) {
+            builder.setErrorMessage(mErrorMessage);
+            mLastErrorMessage = mErrorMessage;
+        }
+        if (mUsername != null) {
+            builder.setDefaultValue(mUsername);
+        }
+        InputSignInMethod signInMethod = builder.build();
+
+        return new SignInTemplate.Builder(signInMethod)
+                .addAction(mProviderSignInAction)
+                .addAction(getCarContext().getCarAppApiLevel() > CarAppApiLevels.LEVEL_3
+                        ? mQRCodeSignInAction : mPinSignInAction)
+                .setTitle(getCarContext().getString(R.string.sign_in_title))
+                .setInstructions(getCarContext().getString(R.string.sign_in_instructions))
+                .setHeaderAction(Action.BACK)
+                .setAdditionalText(mAdditionalText)
+                .build();
+    }
+
+    /**
+     * Validates the currently entered user name and returns an error message string if invalid,
+     * or an empty string otherwise.
+     */
+    String validateUsername() {
+        if (mUsername == null || mUsername.length() < MIN_USERNAME_LENGTH) {
+            return getCarContext().getString(R.string.invalid_length_error_msg,
+                    Integer.toString(MIN_USERNAME_LENGTH));
+        } else if (!mUsername.matches(EMAIL_REGEXP)) {
+            return getCarContext().getString(R.string.invalid_email_error_msg);
+        } else {
+            return "";
+        }
+    }
+
+    /**
+     * Moves to the password screen if the user name currently entered is valid, or displays
+     * an error message otherwise.
+     */
+    void submitUsername() {
+        mErrorMessage = validateUsername();
+
+        boolean isError = !mErrorMessage.isEmpty();
+        if (!isError) {
+            // If there's no error, go to the password screen.
+            mState = State.PASSWORD;
+        }
+
+        // Invalidate the template so that we either display an error, or go to the password screen.
+        invalidate();
+    }
+
+    private Template getPasswordSignInTemplate() {
+        InputCallback callback = new InputCallback() {
+            @Override
+            public void onInputSubmitted(@NonNull String text) {
+                // Mocked password validation
+                if (!EXPECTED_PASSWORD.equals(text)) {
+                    mErrorMessage = getCarContext().getString(R.string.invalid_password_error_msg);
+                } else {
+                    mErrorMessage = "";
+                    mState = State.SIGNED_IN;
+                }
+                invalidate();
+            }
+        };
+        InputSignInMethod.Builder builder = new InputSignInMethod.Builder(callback)
+                .setHint(getCarContext().getString(R.string.password_hint))
+                .setInputType(InputSignInMethod.INPUT_TYPE_PASSWORD);
+        if (mErrorMessage != null) {
+            builder.setErrorMessage(mErrorMessage);
+        }
+        InputSignInMethod signInMethod = builder.build();
+
+        return new SignInTemplate.Builder(signInMethod)
+                .addAction(mProviderSignInAction)
+                .addAction(getCarContext().getCarAppApiLevel() > CarAppApiLevels.LEVEL_3
+                        ? mQRCodeSignInAction : mPinSignInAction)
+                .setTitle(getCarContext().getString(R.string.sign_in_title))
+                .setInstructions(
+                        getCarContext().getString(R.string.password_sign_in_instruction_prefix)
+                                + ": " + mUsername)
+                .setHeaderAction(Action.BACK)
+                .setAdditionalText(mAdditionalText)
+                .build();
+    }
+
+    private Template getPinSignInTemplate() {
+        PinSignInMethod pinSignInMethod = new PinSignInMethod("123456789ABC");
+        return new SignInTemplate.Builder(pinSignInMethod)
+                .setTitle(getCarContext().getString(R.string.sign_in_title))
+                .setInstructions(getCarContext().getString(R.string.pin_sign_in_instruction))
+                .setHeaderAction(Action.BACK)
+                .setAdditionalText(mAdditionalText)
+                .build();
+    }
+
+    private Template getQRCodeSignInTemplate() {
+        QRCodeSignInMethod qrCodeSignInMethod = new QRCodeSignInMethod(Uri.parse("https://www"
+                + ".youtube.com/watch?v=dQw4w9WgXcQ"));
+        return new SignInTemplate.Builder(qrCodeSignInMethod)
+                .setTitle(getCarContext().getString(R.string.qr_code_sign_in_title))
+                .setHeaderAction(Action.BACK)
+                .setAdditionalText(mAdditionalText)
+                .addAction(mPinSignInAction)
+                .addAction(mProviderSignInAction)
+                .build();
+    }
+
+    private Template getProviderSignInTemplate() {
+        IconCompat providerIcon = IconCompat.createWithResource(getCarContext(),
+                R.drawable.ic_googleg);
+        CarColor noTint = CarColor.createCustom(Color.TRANSPARENT, Color.TRANSPARENT);
+
+        ProviderSignInMethod providerSignInMethod = new ProviderSignInMethod(
+                new Action.Builder()
+                        .setTitle(Utils.colorize(
+                                getCarContext().getString(R.string.sign_in_with_google_title),
+                                CarColor.createCustom(Color.BLACK, Color.BLACK), 0, 19))
+                        .setBackgroundColor(CarColor.createCustom(Color.WHITE, Color.WHITE))
+                        .setIcon(new CarIcon.Builder(providerIcon)
+                                .setTint(noTint)
+                                .build())
+                        .setOnClickListener(ParkedOnlyOnClickListener.create(
+                                this::performSignInWithGoogleFlow)).build());
+
+        return new SignInTemplate.Builder(providerSignInMethod)
+                .setTitle(getCarContext().getString(R.string.sign_in_title))
+                .setInstructions(getCarContext().getString(R.string.provider_sign_in_instruction))
+                .setHeaderAction(Action.BACK)
+                .setAdditionalText(mAdditionalText)
+                .build();
+    }
+
+    private void performSignInWithGoogleFlow() {
+        // This is here for demonstration purposes, if the APK is not signed with a signature
+        // that has been registered for sign in with Google flow, the sign in will fail at runtime.
+
+//        Bundle extras = new Bundle(1);
+//        extras.putBinder(BINDER_KEY, new SignInWithGoogleActivity.OnSignInComplete() {
+//            @Override
+//            public void onSignInComplete(@Nullable GoogleSignInAccount account) {
+//                if (account == null) {
+//                    CarToast.makeText(getCarContext(), "Error signing in", LENGTH_LONG).show();
+//                    return;
+//                }
+//
+//                // Use the account
+//                CarToast.makeText(getCarContext(),
+//                        account.getGivenName() + " signed in", LENGTH_LONG).show();
+//            }
+//        });
+//        getCarContext().startActivity(
+//                new Intent()
+//                        .setClass(getCarContext(), SignInWithGoogleActivity.class)
+//                        .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+//                        .putExtras(extras));
+        CarToast.makeText(getCarContext(),
+                        getCarContext().getString(R.string.sign_in_with_google_toast_msg),
+                        LENGTH_LONG)
+                .show();
+    }
+
+    private MessageTemplate getSignInCompletedMessageTemplate() {
+        return new MessageTemplate.Builder(
+                getCarContext().getString(R.string.sign_in_complete_text))
+                .setTitle(getCarContext().getString(R.string.sign_in_complete_title))
+                .setHeaderAction(Action.BACK)
+                .addAction(new Action.Builder()
+                        .setTitle(getCarContext().getString(R.string.sign_out_action_title))
+                        .setOnClickListener(() -> {
+                            mState = State.USERNAME;
+                            invalidate();
+                        })
+                        .build())
+                .build();
+    }
+
+    private enum State {
+        USERNAME,
+        PASSWORD,
+        PIN,
+        PROVIDER,
+        QR_CODE,
+        SIGNED_IN,
+    }
+
+}
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/SignInWithGoogleActivity.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/SignInWithGoogleActivity.java
new file mode 100644
index 0000000..96cab04
--- /dev/null
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/SignInWithGoogleActivity.java
@@ -0,0 +1,75 @@
+/*
+ * 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 androidx.car.app.sample.showcase.common.screens.templatelayouts;
+
+import android.os.Bundle;
+
+import androidx.activity.ComponentActivity;
+import androidx.annotation.Nullable;
+
+/**
+ * An activity for use by the car app library to perform actions such as requesting permissions.
+ */
+public class SignInWithGoogleActivity extends ComponentActivity {
+    static final String BINDER_KEY = "binder";
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+
+//        OnSignInComplete signInCompleteCallback =
+//                (OnSignInComplete) getIntent().getExtras().getBinder(BINDER_KEY);
+//
+//        ActivityResultLauncher<Intent> activityResultLauncher =
+//                registerForActivityResult(
+//                        new ActivityResultContracts.StartActivityForResult(),
+//                        result -> {
+//                            GoogleSignInAccount account =
+//                                    GoogleSignIn.getSignedInAccountFromIntent(
+//                                            result.getData()).getResult();
+//                            signInCompleteCallback.onSignInComplete(account);
+//                            finish();
+//                        });
+//
+//        GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this);
+//        if (account != null) {
+//            signInCompleteCallback.onSignInComplete(account);
+//            finish();
+//        }
+//
+//        GoogleSignInOptions gso =
+//                new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
+//                        .requestEmail()
+//                        .requestProfile()
+//                        .build();
+//        GoogleSignInClient signInClient = GoogleSignIn.getClient(this, gso);
+//        activityResultLauncher.launch(signInClient.getSignInIntent());
+    }
+
+
+//    /**
+//     * Binder callback to provide to the sign in activity.
+//     */
+//    abstract static class OnSignInComplete extends Binder implements IBinder {
+//        /**
+//         * Notifies that sign in flow completed.
+//         *
+//         * @param account the account signed in or {@code null} if there were issues signing in.
+//         */
+//        public abstract void onSignInComplete(@Nullable GoogleSignInAccount account);
+//    }
+}
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/gridtemplates/GridTemplateDemoScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/gridtemplates/GridTemplateDemoScreen.java
new file mode 100644
index 0000000..1dfacb0
--- /dev/null
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/gridtemplates/GridTemplateDemoScreen.java
@@ -0,0 +1,328 @@
+/*
+ * 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 androidx.car.app.sample.showcase.common.screens.templatelayouts.gridtemplates;
+
+import static androidx.car.app.CarToast.LENGTH_SHORT;
+import static androidx.car.app.model.Action.BACK;
+
+import android.content.res.Resources;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.os.Handler;
+import android.os.Looper;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.car.app.CarContext;
+import androidx.car.app.CarToast;
+import androidx.car.app.Screen;
+import androidx.car.app.constraints.ConstraintManager;
+import androidx.car.app.model.Action;
+import androidx.car.app.model.ActionStrip;
+import androidx.car.app.model.CarIcon;
+import androidx.car.app.model.GridItem;
+import androidx.car.app.model.GridTemplate;
+import androidx.car.app.model.ItemList;
+import androidx.car.app.model.OnClickListener;
+import androidx.car.app.model.Template;
+import androidx.car.app.sample.showcase.common.R;
+import androidx.car.app.versioning.CarAppApiLevels;
+import androidx.core.graphics.drawable.IconCompat;
+import androidx.lifecycle.DefaultLifecycleObserver;
+import androidx.lifecycle.LifecycleOwner;
+
+/** Creates a screen that demonstrates usage of the full screen {@link GridTemplate}. */
+public final class GridTemplateDemoScreen extends Screen implements DefaultLifecycleObserver {
+    private static final int MAX_GRID_ITEMS = 100;
+    private static final int LOADING_TIME_MILLIS = 2000;
+    private final Handler mHandler = new Handler(Looper.getMainLooper());
+
+    @Nullable
+    private IconCompat mImage;
+    @Nullable
+    private IconCompat mIcon;
+    private boolean mIsFourthItemLoading;
+    private boolean mThirdItemToggleState;
+    private boolean mFourthItemToggleState;
+    private boolean mFifthItemToggleState;
+
+    public GridTemplateDemoScreen(@NonNull CarContext carContext) {
+        super(carContext);
+        getLifecycle().addObserver(this);
+        mIsFourthItemLoading = false;
+        mThirdItemToggleState = false;
+        mFourthItemToggleState = true;
+        mFifthItemToggleState = false;
+    }
+
+    @Override
+    public void onCreate(@NonNull LifecycleOwner owner) {
+        Resources resources = getCarContext().getResources();
+        Bitmap bitmap = BitmapFactory.decodeResource(resources, R.drawable.test_image_square);
+        mImage = IconCompat.createWithBitmap(bitmap);
+        mIcon = IconCompat.createWithResource(getCarContext(), R.drawable.ic_fastfood_white_48dp);
+    }
+
+    @Override
+    @SuppressWarnings({"FutureReturnValueIgnored"})
+    public void onStart(@NonNull LifecycleOwner owner) {
+        mIsFourthItemLoading = false;
+
+        // Post a message that starts loading the fourth item for some time.
+        triggerFourthItemLoading();
+    }
+
+    private GridItem createGridItem(int index) {
+        switch (index) {
+            case 0:
+                // Grid item with an icon and a title.
+                return createGridItem(createCarIconFromImage(mIcon), GridItem.IMAGE_TYPE_ICON,
+                        getTextStringFromId(R.string.non_actionable));
+            case 1:
+                // Grid item with an icon, a title, onClickListener and no text.
+                return createGridItem(createCarIconFromImage(mIcon), GridItem.IMAGE_TYPE_ICON,
+                        getTextStringFromId(R.string.second_item), createOnClickListener(
+                                (String) getTextStringFromId(R.string.second_item_toast_msg),
+                                LENGTH_SHORT));
+
+            case 2:
+                // Grid item with an icon marked as icon, a title, a text and a toggle in
+                // unchecked state.
+                return createGridItem(createCarIconFromImage(mIcon),
+                        GridItem.IMAGE_TYPE_LARGE, getTextStringFromId(R.string.third_item),
+                        mThirdItemToggleState
+                                ? getTextStringFromId(R.string.checked_action_title) :
+                                getTextStringFromId(R.string.unchecked_action_title),
+                        createOnClickListenerForThirdItem());
+
+            case 3:
+                // Grid item with an image, a title, a long text and a toggle that takes some
+                // time to
+                // update.
+                if (mIsFourthItemLoading) {
+                    return createGridItem(getTextStringFromId(R.string.fourth_item),
+                            mFourthItemToggleState
+                                    ? getTextStringFromId(R.string.on_action_title) :
+                                    getTextStringFromId(R.string.off_action_title),
+                            true);
+                } else {
+                    return createGridItem(createCarIconFromImage(mImage),
+                            getTextStringFromId(R.string.fourth_item),
+                            mFourthItemToggleState
+                                    ? getTextStringFromId(R.string.on_action_title) :
+                                    getTextStringFromId(R.string.off_action_title),
+                            this::triggerFourthItemLoading);
+                }
+            case 4:
+                // Grid item with a large image, a long title, no text and a toggle in unchecked
+                // state.
+                return createGridItem(createCarIconFromImage(mIcon),
+                        GridItem.IMAGE_TYPE_LARGE, getTextStringFromId(R.string.fifth_item),
+                        createOnClickListenerForFifthItem());
+            case 5:
+                // Grid item with an image marked as an icon, a long title, a long text and
+                // onClickListener.
+                return createGridItem(createCarIconFromImage(mIcon),
+                        GridItem.IMAGE_TYPE_ICON, getTextStringFromId(R.string.sixth_item),
+                        getTextStringFromId(R.string.sixth_item),
+                        createOnClickListener(
+                                (String) getTextStringFromId(R.string.sixth_item_toast_msg),
+                                LENGTH_SHORT));
+
+            default:
+                String titleText = (index + 1) + "th item";
+                String toastText = "Clicked " + (index + 1) + "th item";
+
+                return createGridItem(createCarIconFromImage(mIcon),
+                        GridItem.IMAGE_TYPE_ICON, titleText, createOnClickListener(toastText,
+                                LENGTH_SHORT));
+        }
+    }
+
+
+    @NonNull
+    @Override
+    public Template onGetTemplate() {
+        int itemLimit = 6;
+        // Adjust the item limit according to the car constrains.
+        if (getCarContext().getCarAppApiLevel() > CarAppApiLevels.LEVEL_1) {
+            itemLimit =
+                    Math.min(MAX_GRID_ITEMS,
+                            getCarContext().getCarService(ConstraintManager.class).getContentLimit(
+                                    ConstraintManager.CONTENT_LIMIT_TYPE_GRID));
+        }
+
+        ItemList.Builder gridItemListBuilder = new ItemList.Builder();
+        for (int i = 0; i <= itemLimit; i++) {
+            gridItemListBuilder.addItem(createGridItem(i));
+        }
+
+        Action settings = new Action.Builder()
+                .setTitle(getCarContext().getString(
+                        R.string.settings_action_title))
+                .setOnClickListener(
+                        () -> CarToast.makeText(
+                                        getCarContext(),
+                                        getCarContext().getString(R.string.settings_toast_msg),
+                                        LENGTH_SHORT)
+                                .show())
+                .build();
+        return new GridTemplate.Builder()
+                .setHeaderAction(Action.APP_ICON)
+                .setSingleList(gridItemListBuilder.build())
+                .setTitle(getCarContext().getString(R.string.grid_template_demo_title))
+                .setActionStrip(
+                        new ActionStrip.Builder()
+                                .addAction(settings)
+                                .build())
+                .setHeaderAction(BACK)
+                .build();
+    }
+
+    /**
+     * Changes the fourth item to a loading state for some time and changes it back to the loaded
+     * state.
+     */
+    private void triggerFourthItemLoading() {
+        mHandler.post(
+                () -> {
+                    mIsFourthItemLoading = true;
+                    invalidate();
+
+                    mHandler.postDelayed(
+                            () -> {
+                                mIsFourthItemLoading = false;
+                                mFourthItemToggleState = !mFourthItemToggleState;
+                                invalidate();
+                            },
+                            LOADING_TIME_MILLIS);
+                });
+    }
+
+    /**
+     * Custom listener for third grid item
+     */
+    private OnClickListener createOnClickListenerForThirdItem() {
+        return () -> {
+            mThirdItemToggleState = !mThirdItemToggleState;
+            CarToast.makeText(
+                            getCarContext(),
+                            getCarContext().getString(
+                                    R.string.third_item_checked_toast_msg)
+                                    + ": " + mThirdItemToggleState,
+                            LENGTH_SHORT)
+                    .show();
+            invalidate();
+        };
+    }
+
+    /**
+     * Custom listener for fifth grid item
+     */
+    private OnClickListener createOnClickListenerForFifthItem() {
+        return () -> {
+            mFifthItemToggleState = !mFifthItemToggleState;
+            CarToast.makeText(
+                            getCarContext(),
+                            getCarContext().getString(
+                                    R.string.fifth_item_checked_toast_msg)
+                                    + ": "
+                                    + mFifthItemToggleState,
+                            LENGTH_SHORT)
+                    .show();
+            invalidate();
+        };
+    }
+
+    /**
+     * Returns CharSequence text for given id
+     */
+    private CharSequence getTextStringFromId(int id) {
+        return getCarContext().getString(id);
+    }
+
+    /**
+     * Create an onClickListener using a Car Toast
+     */
+    private OnClickListener createOnClickListener(String toastText, int toastLength) {
+        return () ->
+                CarToast.makeText(
+                                getCarContext(),
+                                toastText,
+                                toastLength)
+                        .show();
+    }
+
+    /**
+     * Creates CarIcon from given IconCompat image
+     */
+    private CarIcon createCarIconFromImage(IconCompat image) {
+        return new CarIcon.Builder(image).build();
+    }
+
+    /**
+     * A number of overloaded constructors with different parameters to build grid items
+     */
+    private GridItem createGridItem(CharSequence title, CharSequence text,
+            boolean isLoading) {
+        return new GridItem.Builder()
+                .setTitle(title)
+                .setText(text)
+                .setLoading(isLoading)
+                .build();
+    }
+
+    private GridItem createGridItem(CarIcon carIcon,
+            int imageType, CharSequence title, CharSequence text,
+            OnClickListener onClickListener) {
+        return new GridItem.Builder()
+                .setImage(carIcon, imageType)
+                .setTitle(title)
+                .setText(text)
+                .setOnClickListener(onClickListener)
+                .build();
+    }
+
+    private GridItem createGridItem(CarIcon carIcon,
+            CharSequence title, CharSequence text,
+            OnClickListener onClickListener) {
+        return new GridItem.Builder()
+                .setImage(carIcon)
+                .setTitle(title)
+                .setText(text)
+                .setOnClickListener(onClickListener)
+                .build();
+    }
+
+    private GridItem createGridItem(CarIcon carIcon,
+            int imageType, CharSequence title,
+            OnClickListener onClickListener) {
+        return new GridItem.Builder()
+                .setImage(carIcon, imageType)
+                .setTitle(title)
+                .setOnClickListener(onClickListener)
+                .build();
+    }
+
+    private GridItem createGridItem(CarIcon carIcon,
+            int imageType, CharSequence title) {
+        return new GridItem.Builder()
+                .setImage(carIcon, imageType)
+                .setTitle(title)
+                .build();
+    }
+}
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/gridtemplates/NotificationDemoScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/gridtemplates/NotificationDemoScreen.java
new file mode 100644
index 0000000..3753600
--- /dev/null
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/gridtemplates/NotificationDemoScreen.java
@@ -0,0 +1,361 @@
+/*
+ * 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 androidx.car.app.sample.showcase.common.screens.templatelayouts.gridtemplates;
+
+import static java.util.concurrent.TimeUnit.SECONDS;
+
+import android.annotation.SuppressLint;
+import android.app.NotificationManager;
+import android.app.PendingIntent;
+import android.content.BroadcastReceiver;
+import android.content.ComponentName;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.graphics.BitmapFactory;
+import android.net.Uri;
+import android.os.Handler;
+import android.os.Looper;
+import android.os.Message;
+
+import androidx.annotation.NonNull;
+import androidx.car.app.CarContext;
+import androidx.car.app.CarToast;
+import androidx.car.app.Screen;
+import androidx.car.app.model.Action;
+import androidx.car.app.model.CarColor;
+import androidx.car.app.model.CarIcon;
+import androidx.car.app.model.GridItem;
+import androidx.car.app.model.GridTemplate;
+import androidx.car.app.model.ItemList;
+import androidx.car.app.model.Template;
+import androidx.car.app.notification.CarAppExtender;
+import androidx.car.app.notification.CarNotificationManager;
+import androidx.car.app.notification.CarPendingIntent;
+import androidx.car.app.sample.showcase.common.R;
+import androidx.car.app.sample.showcase.common.ShowcaseService;
+import androidx.core.app.NotificationChannelCompat;
+import androidx.core.app.NotificationCompat;
+import androidx.core.graphics.drawable.IconCompat;
+import androidx.lifecycle.DefaultLifecycleObserver;
+import androidx.lifecycle.LifecycleOwner;
+
+/** A simple screen that demonstrates how to use notifications in a car app. */
+public final class NotificationDemoScreen extends Screen implements DefaultLifecycleObserver {
+
+    static final long NOTIFICATION_DELAY_IN_MILLIS = SECONDS.toMillis(1);
+    private static final String NOTIFICATION_CHANNEL_ID = "channel_00";
+    private static final CharSequence NOTIFICATION_CHANNEL_NAME = "Default Channel";
+    private static final int NOTIFICATION_ID = 1001;
+    private static final String NOTIFICATION_CHANNEL_HIGH_ID = "channel_01";
+    private static final CharSequence NOTIFICATION_CHANNEL_HIGH_NAME = "High Channel";
+    private static final String NOTIFICATION_CHANNEL_LOW_ID = "channel_02";
+    private static final CharSequence NOTIFICATION_CHANNEL_LOW_NAME = "Low Channel";
+    private static final String INTENT_ACTION_PRIMARY_PHONE =
+            "androidx.car.app.sample.showcase.common.INTENT_ACTION_PRIMARY_PHONE";
+    private static final String INTENT_ACTION_SECONDARY_PHONE =
+            "androidx.car.app.sample.showcase.common.INTENT_ACTION_SECONDARY_PHONE";
+    private static final int MSG_SEND_NOTIFICATION = 1;
+    final Handler mHandler = new Handler(Looper.getMainLooper(), new HandlerCallback());
+
+    private final IconCompat mIcon = IconCompat.createWithResource(getCarContext(),
+            R.drawable.ic_face_24px);
+    /** A broadcast receiver that can show a toast message upon receiving a broadcast. */
+    private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() {
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            CarToast.makeText(
+                            getCarContext(),
+                            getCarContext().getString(R.string.triggered_toast_msg) + ": "
+                                    + intent.getAction(),
+                            CarToast.LENGTH_SHORT)
+                    .show();
+        }
+    };
+    private int mImportance = NotificationManager.IMPORTANCE_DEFAULT;
+    private boolean mIsNavCategory;
+    private boolean mSetOngoing;
+    private int mNotificationCount;
+
+    public NotificationDemoScreen(@NonNull CarContext carContext) {
+        super(carContext);
+        getLifecycle().addObserver(this);
+    }
+
+    @Override
+    public void onCreate(@NonNull LifecycleOwner owner) {
+        registerBroadcastReceiver();
+    }
+
+    @Override
+    public void onDestroy(@NonNull LifecycleOwner owner) {
+        mHandler.removeMessages(MSG_SEND_NOTIFICATION);
+        CarNotificationManager.from(getCarContext()).cancelAll();
+        unregisterBroadcastReceiver();
+    }
+
+    @NonNull
+    @Override
+    public Template onGetTemplate() {
+        ItemList.Builder listBuilder = new ItemList.Builder();
+
+        // Send a single notification with the settings configured by other buttons.
+        listBuilder.addItem(
+                new GridItem.Builder()
+                        .setTitle(getCarContext().getString(R.string.send_notification_title))
+                        .setImage(new CarIcon.Builder(mIcon).build())
+                        .setOnClickListener(this::sendNotification)
+                        .build());
+
+        // Start a repeating notification with the settings configured by other buttons.
+        listBuilder.addItem(
+                new GridItem.Builder()
+                        .setTitle(getCarContext().getString(R.string.start_notifications_title))
+                        .setImage(new CarIcon.Builder(mIcon).build())
+                        .setOnClickListener(() -> mHandler.sendMessage(
+                                mHandler.obtainMessage(MSG_SEND_NOTIFICATION)))
+                        .build());
+
+        // Stop the repeating notification and reset the count.
+        listBuilder.addItem(
+                new GridItem.Builder()
+                        .setTitle(getCarContext().getString(R.string.stop_notifications_title))
+                        .setImage(new CarIcon.Builder(mIcon).build())
+                        .setOnClickListener(() -> {
+                            mHandler.removeMessages(MSG_SEND_NOTIFICATION);
+                            CarNotificationManager.from(getCarContext()).cancelAll();
+                            mNotificationCount = 0;
+                        })
+                        .build());
+
+        // Configure the notification importance.
+        listBuilder.addItem(
+                new GridItem.Builder()
+                        .setImage(new CarIcon.Builder(mIcon).build())
+                        .setTitle(getCarContext().getString(R.string.importance_title))
+                        .setText(getImportanceString())
+                        .setOnClickListener(() -> {
+                            setImportance();
+                            invalidate();
+                        })
+                        .build());
+
+        // Configure whether the notification's category is navigation.
+        listBuilder.addItem(
+                new GridItem.Builder()
+                        .setImage(new CarIcon.Builder(mIcon).build())
+                        .setTitle(getCarContext().getString(R.string.category_title))
+                        .setText(getCategoryString())
+                        .setOnClickListener(() -> {
+                            mIsNavCategory = !mIsNavCategory;
+                            invalidate();
+                        })
+                        .build());
+
+        // Configure whether the notification is an ongoing notification.
+        listBuilder.addItem(
+                new GridItem.Builder()
+                        .setImage(new CarIcon.Builder(mIcon).build())
+                        .setTitle(getCarContext().getString(R.string.ongoing_title))
+                        .setText(String.valueOf(mSetOngoing))
+                        .setOnClickListener(() -> {
+                            mSetOngoing = !mSetOngoing;
+                            invalidate();
+                        })
+                        .build());
+
+        return new GridTemplate.Builder()
+                .setSingleList(listBuilder.build())
+                .setTitle(getCarContext().getString(R.string.notification_demo))
+                .setHeaderAction(Action.BACK)
+                .build();
+    }
+
+    void sendNotification() {
+        mNotificationCount++;
+        String title =
+                getCarContext().getString(R.string.notification_title) + ": "
+                        + getImportanceString() + ", " + mNotificationCount;
+        String text = getCarContext().getString(R.string.category_title) + ": "
+                + getCategoryString() + ", "
+                + getCarContext().getString(R.string.ongoing_title) + ": " + mSetOngoing;
+
+        switch (mImportance) {
+            case NotificationManager.IMPORTANCE_HIGH:
+                sendNotification(title, text, NOTIFICATION_CHANNEL_HIGH_ID,
+                        NOTIFICATION_CHANNEL_HIGH_NAME, NOTIFICATION_ID,
+                        NotificationManager.IMPORTANCE_HIGH);
+                break;
+            case NotificationManager.IMPORTANCE_DEFAULT:
+                sendNotification(title, text, NOTIFICATION_CHANNEL_ID, NOTIFICATION_CHANNEL_NAME,
+                        NOTIFICATION_ID, NotificationManager.IMPORTANCE_DEFAULT);
+                break;
+            case NotificationManager.IMPORTANCE_LOW:
+                sendNotification(title, text, NOTIFICATION_CHANNEL_LOW_ID,
+                        NOTIFICATION_CHANNEL_LOW_NAME, NOTIFICATION_ID,
+                        NotificationManager.IMPORTANCE_LOW);
+                break;
+            default:
+                break;
+        }
+    }
+
+    // Suppressing 'ObsoleteSdkInt' as this code is shared between APKs with different min SDK
+    // levels
+    @SuppressLint("ObsoleteSdkInt")
+    private void sendNotification(CharSequence title, CharSequence text, String channelId,
+            CharSequence channelName, int notificationId, int importance) {
+        CarNotificationManager carNotificationManager =
+                CarNotificationManager.from(getCarContext());
+
+        NotificationChannelCompat channel = new NotificationChannelCompat.Builder(channelId,
+                importance).setName(channelName).build();
+        carNotificationManager.createNotificationChannel(channel);
+
+        NotificationCompat.Builder builder;
+        builder = new NotificationCompat.Builder(getCarContext(), channelId);
+        if (mIsNavCategory) {
+            builder.setCategory(NotificationCompat.CATEGORY_NAVIGATION);
+        }
+        builder.setOngoing(mSetOngoing);
+
+        builder.setSmallIcon(R.drawable.ic_bug_report_24px)
+                .setContentTitle(title + " (phone)")
+                .setContentText(text + " (phone)")
+                .setColor(getCarContext().getColor(androidx.car.app.R.color.carColorGreen))
+                .setColorized(true)
+                .setLargeIcon(
+                        BitmapFactory.decodeResource(
+                                getCarContext().getResources(), R.drawable.ic_hi))
+                .addAction(
+                        new NotificationCompat.Action.Builder(
+                                R.drawable.ic_face_24px,
+                                "Action1 (phone)",
+                                createPendingIntent(INTENT_ACTION_PRIMARY_PHONE))
+                                .build())
+                .addAction(
+                        R.drawable.ic_commute_24px,
+                        "Action2 (phone)",
+                        createPendingIntent(INTENT_ACTION_SECONDARY_PHONE))
+                .extend(
+                        new CarAppExtender.Builder()
+                                .setContentTitle(title)
+                                .setContentText(text)
+                                .setContentIntent(
+                                        CarPendingIntent.getCarApp(getCarContext(), 0,
+                                                new Intent(Intent.ACTION_VIEW).setComponent(
+                                                        new ComponentName(getCarContext(),
+                                                                ShowcaseService.class)), 0))
+                                .setColor(CarColor.PRIMARY)
+                                .setSmallIcon(R.drawable.ic_bug_report_24px)
+                                .setLargeIcon(
+                                        BitmapFactory.decodeResource(
+                                                getCarContext().getResources(),
+                                                R.drawable.ic_hi))
+                                .addAction(
+                                        R.drawable.ic_commute_24px,
+                                        getCarContext().getString(R.string.navigate),
+                                        getPendingIntentForNavigation())
+                                .addAction(
+                                        R.drawable.ic_face_24px,
+                                        getCarContext().getString(R.string.call_action_title),
+                                        createPendingIntentForCall())
+                                .build());
+
+        carNotificationManager.notify(notificationId, builder);
+    }
+
+    private PendingIntent createPendingIntentForCall() {
+        Intent intent = new Intent(Intent.ACTION_DIAL).setData(Uri.parse("tel:+14257232350"));
+        return CarPendingIntent.getCarApp(getCarContext(), intent.hashCode(), intent, 0);
+    }
+
+    private PendingIntent getPendingIntentForNavigation() {
+        Intent intent = new Intent(CarContext.ACTION_NAVIGATE).setData(Uri.parse("geo:0,0?q=Home"));
+        return CarPendingIntent.getCarApp(getCarContext(), intent.hashCode(), intent, 0);
+    }
+
+    private String getImportanceString() {
+        switch (mImportance) {
+            case NotificationManager.IMPORTANCE_HIGH:
+                return getCarContext().getString(R.string.high_importance);
+            case NotificationManager.IMPORTANCE_DEFAULT:
+                return getCarContext().getString(R.string.default_importance);
+            case NotificationManager.IMPORTANCE_LOW:
+                return getCarContext().getString(R.string.low_importance);
+            default:
+                return getCarContext().getString(R.string.unknown_importance);
+        }
+    }
+
+    private String getCategoryString() {
+        return mIsNavCategory ? "Navigation" : "None";
+    }
+
+    /**
+     * Change the notification importance in a rotating sequence:
+     * Low -> Default -> High -> Low...
+     */
+    private void setImportance() {
+        switch (mImportance) {
+            case NotificationManager.IMPORTANCE_HIGH:
+                mImportance = NotificationManager.IMPORTANCE_LOW;
+                break;
+            case NotificationManager.IMPORTANCE_DEFAULT:
+                mImportance = NotificationManager.IMPORTANCE_HIGH;
+                break;
+            case NotificationManager.IMPORTANCE_LOW:
+                mImportance = NotificationManager.IMPORTANCE_DEFAULT;
+                break;
+            default:
+                break;
+        }
+    }
+
+    private void registerBroadcastReceiver() {
+        IntentFilter filter = new IntentFilter();
+        filter.addAction(INTENT_ACTION_PRIMARY_PHONE);
+        filter.addAction(INTENT_ACTION_SECONDARY_PHONE);
+
+        getCarContext().registerReceiver(mBroadcastReceiver, filter);
+    }
+
+    private void unregisterBroadcastReceiver() {
+        getCarContext().unregisterReceiver(mBroadcastReceiver);
+    }
+
+    /** Returns a pending intent with the provided intent action. */
+    private PendingIntent createPendingIntent(String intentAction) {
+        Intent intent = new Intent(intentAction);
+        return PendingIntent.getBroadcast(getCarContext(), intentAction.hashCode(), intent,
+                PendingIntent.FLAG_IMMUTABLE);
+    }
+
+    final class HandlerCallback implements Handler.Callback {
+        @Override
+        public boolean handleMessage(Message msg) {
+            if (msg.what == MSG_SEND_NOTIFICATION) {
+                sendNotification();
+                mHandler.sendMessageDelayed(
+                        mHandler.obtainMessage(MSG_SEND_NOTIFICATION),
+                        NOTIFICATION_DELAY_IN_MILLIS);
+                return true;
+            }
+            return false;
+        }
+    }
+}
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/listtemplates/ContentProviderIconsDemoScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/listtemplates/ContentProviderIconsDemoScreen.java
new file mode 100644
index 0000000..e94d105e
--- /dev/null
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/listtemplates/ContentProviderIconsDemoScreen.java
@@ -0,0 +1,87 @@
+/*
+ * 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 androidx.car.app.sample.showcase.common.screens.templatelayouts.listtemplates;
+
+import static androidx.car.app.model.Action.BACK;
+
+import android.net.Uri;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.car.app.CarContext;
+import androidx.car.app.HostInfo;
+import androidx.car.app.Screen;
+import androidx.car.app.model.CarIcon;
+import androidx.car.app.model.ItemList;
+import androidx.car.app.model.ListTemplate;
+import androidx.car.app.model.Row;
+import androidx.car.app.model.Template;
+import androidx.car.app.sample.showcase.common.R;
+import androidx.core.graphics.drawable.IconCompat;
+
+/** Creates a screen that demonstrate the image loading in the library using a content provider. */
+public final class ContentProviderIconsDemoScreen extends Screen {
+    private static final int[] ICON_DRAWABLES = {
+            R.drawable.arrow_right_turn, R.drawable.arrow_straight, R.drawable.ic_i5,
+            R.drawable.ic_520
+    };
+    @Nullable
+    private final String mHostPackageName;
+
+    public ContentProviderIconsDemoScreen(@NonNull CarContext carContext) {
+        super(carContext);
+
+        HostInfo hostInfo = carContext.getHostInfo();
+        mHostPackageName = hostInfo == null ? null : hostInfo.getPackageName();
+    }
+
+    @NonNull
+    @Override
+    public Template onGetTemplate() {
+        ItemList.Builder listBuilder = new ItemList.Builder();
+
+        String hostPackageName = mHostPackageName;
+        if (hostPackageName == null) {
+            // Cannot get the host package name, show an error message.
+            listBuilder.setNoItemsMessage(
+                    getCarContext().getString(R.string.images_unknown_host_error));
+        } else {
+            for (int i = 0; i < ICON_DRAWABLES.length; i++) {
+                int resId = ICON_DRAWABLES[i];
+                Uri uri = DelayedFileProvider.getUriForResource(getCarContext(), hostPackageName,
+                        resId);
+                listBuilder.addItem(
+                        new Row.Builder()
+                                .setImage(
+                                        new CarIcon.Builder(
+                                                IconCompat.createWithContentUri(uri))
+                                                .build())
+                                .setTitle(
+                                        getCarContext().getString(R.string.icon_title_prefix) + " "
+                                                + i)
+                                .build());
+            }
+        }
+
+
+        return new ListTemplate.Builder()
+                .setSingleList(listBuilder.build())
+                .setTitle(getCarContext().getString(R.string.content_provider_icons_demo_title))
+                .setHeaderAction(BACK)
+                .build();
+    }
+}
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/listtemplates/DelayedFileProvider.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/listtemplates/DelayedFileProvider.java
new file mode 100644
index 0000000..217bd16
--- /dev/null
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/listtemplates/DelayedFileProvider.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 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 androidx.car.app.sample.showcase.common.screens.templatelayouts.listtemplates;
+
+import android.content.Context;
+import android.content.Intent;
+import android.graphics.Bitmap;
+import android.graphics.Bitmap.CompressFormat;
+import android.graphics.BitmapFactory;
+import android.net.Uri;
+import android.os.ParcelFileDescriptor;
+
+import androidx.annotation.NonNull;
+import androidx.core.content.FileProvider;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.concurrent.ThreadLocalRandom;
+
+/** A simple file provider that returns files after a random delay. */
+public class DelayedFileProvider extends FileProvider {
+    private static final String FILE_PROVIDER_AUTHORITY = "com.showcase.fileprovider";
+    private static final String RESOURCE_DIR = "res";
+    private static final long MIN_DELAY_MILLIS = 1000;
+    private static final long MAX_DELAY_MILLIS = 3000;
+
+    /** Creates a file from the given resource id and returns the URI for it. */
+    @NonNull
+    public static Uri getUriForResource(@NonNull Context context,
+            @NonNull String hostPackageName, int resId) {
+        File resourceFile =
+                new File(context.getFilesDir().getAbsolutePath(), RESOURCE_DIR + "/" + resId);
+        if (!resourceFile.exists()) {
+            resourceFile.getParentFile().mkdir();
+
+            Bitmap bm = BitmapFactory.decodeResource(context.getResources(), resId);
+            try (FileOutputStream fos = new FileOutputStream(resourceFile)) {
+                bm.compress(CompressFormat.PNG, 10, fos);
+            } catch (IOException ex) {
+                throw new IllegalArgumentException("Invalid resource " + resId);
+            }
+        }
+        Uri uri = getUriForFile(context, FILE_PROVIDER_AUTHORITY, resourceFile);
+
+        // FileProvider requires the app to grant temporary access to the car hosts for the file.
+        // A URI from a content provider may not need to do this if its contents are public.
+        context.grantUriPermission(hostPackageName, uri,
+                Intent.FLAG_GRANT_READ_URI_PERMISSION);
+
+        return uri;
+    }
+
+    @Override
+    @NonNull
+    public ParcelFileDescriptor openFile(@NonNull Uri uri, @NonNull String mode)
+            throws FileNotFoundException {
+        try {
+            // Wait for a random period between the minimum and maximum delay.
+            Thread.sleep(ThreadLocalRandom.current().nextLong(MIN_DELAY_MILLIS, MAX_DELAY_MILLIS));
+        } catch (InterruptedException e) {
+            throw new FileNotFoundException(e.getMessage());
+        }
+
+        return super.openFile(uri, mode);
+    }
+}
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/listtemplates/RadioButtonListDemoScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/listtemplates/RadioButtonListDemoScreen.java
new file mode 100644
index 0000000..df4d004
--- /dev/null
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/listtemplates/RadioButtonListDemoScreen.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright 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 androidx.car.app.sample.showcase.common.screens.templatelayouts.listtemplates;
+
+import static androidx.car.app.CarToast.LENGTH_LONG;
+import static androidx.car.app.model.Action.BACK;
+
+import androidx.annotation.NonNull;
+import androidx.car.app.CarContext;
+import androidx.car.app.CarToast;
+import androidx.car.app.Screen;
+import androidx.car.app.model.Action;
+import androidx.car.app.model.ActionStrip;
+import androidx.car.app.model.CarIcon;
+import androidx.car.app.model.ItemList;
+import androidx.car.app.model.ListTemplate;
+import androidx.car.app.model.Row;
+import androidx.car.app.model.SectionedItemList;
+import androidx.car.app.model.Template;
+import androidx.car.app.sample.showcase.common.R;
+import androidx.core.graphics.drawable.IconCompat;
+
+/** A screen demonstrating selectable lists. */
+public final class RadioButtonListDemoScreen extends Screen {
+
+    public RadioButtonListDemoScreen(@NonNull CarContext carContext) {
+        super(carContext);
+    }
+
+    private boolean mIsEnabled = true;
+
+    @NonNull
+    @Override
+    public Template onGetTemplate() {
+        ListTemplate.Builder templateBuilder = new ListTemplate.Builder();
+        ItemList radioList =
+                new ItemList.Builder()
+
+                        .addItem(buildRowForTemplate(R.string.option_row_radio_title,
+                                R.string.additional_text))
+
+                        .addItem(buildRowForTemplate(R.string.option_row_radio_icon_title,
+                                R.string.additional_text,
+                                buildImageWithResource(R.drawable
+                                        .ic_fastfood_white_48dp), Row.IMAGE_TYPE_ICON))
+
+                        .addItem(buildRowForTemplate(
+                                R.string.option_row_radio_icon_colored_text_title,
+                                R.string.additional_text,
+                                buildImageWithResource(R.drawable
+                                        .test_image_square), Row.IMAGE_TYPE_LARGE))
+
+                        .setOnSelectedListener(this::onSelected)
+                        .build();
+        templateBuilder.addSectionedList(
+                SectionedItemList.create(radioList,
+                        getCarContext().getString(R.string.sample_additional_list)));
+
+        return templateBuilder
+                .setTitle(getCarContext().getString(R.string.radio_button_list_demo_title))
+                .setActionStrip(
+                        new ActionStrip.Builder()
+                                .addAction(
+                                        new Action.Builder()
+                                                .setTitle(mIsEnabled
+                                                        ? getCarContext().getString(
+                                                        R.string.disable_all_rows)
+                                                        : getCarContext().getString(
+                                                                R.string.enable_all_rows))
+                                                .setOnClickListener(
+                                                        () -> {
+                                                            mIsEnabled = !mIsEnabled;
+                                                            invalidate();
+                                                        })
+                                                .build())
+                                .build())
+                .setHeaderAction(
+                        BACK).build();
+    }
+
+    private CarIcon buildImageWithResource(int imageId) {
+        return new CarIcon.Builder(
+                IconCompat.createWithResource(
+                        getCarContext(),
+                        imageId))
+                .build();
+    }
+
+    private Row buildRowForTemplate(int title, int text, CarIcon icon, int imageType) {
+        return new Row.Builder()
+                .addText(getCarContext().getString(text))
+                .setTitle(getCarContext().getString(title))
+                .setImage(icon, imageType)
+                .setEnabled(mIsEnabled)
+                .build();
+
+    }
+
+    private Row buildRowForTemplate(int title, int text) {
+        return new Row.Builder()
+                .addText(getCarContext().getString(text))
+                .setTitle(getCarContext().getString(title))
+                .setEnabled(mIsEnabled)
+                .build();
+
+    }
+
+    private void onSelected(int index) {
+        CarToast.makeText(getCarContext(),
+                        getCarContext()
+                                .getString(R.string.changes_selection_to_index_toast_msg_prefix)
+                                + ":"
+                                + " " + index, LENGTH_LONG)
+                .show();
+    }
+}
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/listtemplates/TextAndIconsDemosScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/listtemplates/TextAndIconsDemosScreen.java
new file mode 100644
index 0000000..ceb70e06
--- /dev/null
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/listtemplates/TextAndIconsDemosScreen.java
@@ -0,0 +1,152 @@
+/*
+ * 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 androidx.car.app.sample.showcase.common.screens.templatelayouts.listtemplates;
+
+import static androidx.car.app.model.Action.BACK;
+import static androidx.car.app.model.CarColor.GREEN;
+import static androidx.car.app.model.CarColor.RED;
+import static androidx.car.app.model.CarColor.YELLOW;
+
+import android.graphics.BitmapFactory;
+import android.text.SpannableString;
+
+import androidx.annotation.NonNull;
+import androidx.car.app.CarContext;
+import androidx.car.app.Screen;
+import androidx.car.app.model.CarColor;
+import androidx.car.app.model.CarIcon;
+import androidx.car.app.model.ItemList;
+import androidx.car.app.model.ListTemplate;
+import androidx.car.app.model.Row;
+import androidx.car.app.model.Template;
+import androidx.car.app.sample.showcase.common.R;
+import androidx.car.app.sample.showcase.common.common.Utils;
+import androidx.core.graphics.drawable.IconCompat;
+
+/** Creates a screen that shows different types of texts and icons. */
+public final class TextAndIconsDemosScreen extends Screen {
+
+    private static final String FULL_STAR = "\u2605";
+    private static final String HALF_STAR = "\u00BD";
+
+    public TextAndIconsDemosScreen(@NonNull CarContext carContext) {
+        super(carContext);
+    }
+
+    @NonNull
+    @Override
+    public Template onGetTemplate() {
+
+        ItemList.Builder listBuilder = new ItemList.Builder();
+
+        listBuilder.addItem(buildRowForTemplate(R.string.title_with_app_icon_row_title,
+                CarIcon.APP_ICON));
+
+        listBuilder.addItem(buildRowForTemplate(R.string.png_bitmap_title,
+                buildCarIconWithBitmap(R.drawable.banana)));
+
+        listBuilder.addItem(buildRowForTemplate(R.string.png_res_title,
+                buildCarIconWithResource(R.drawable.banana)));
+
+        listBuilder.addItem(buildRowForTemplate(R.string.title_with_res_id_image_row_title,
+                buildSecondaryText(R.string.example_1_text, RED, 16, 3),
+                buildCarIconWithResource(R.drawable.ic_fastfood_white_48dp, RED)));
+
+        listBuilder.addItem(buildRowForTemplate(R.string.title_with_svg_image_row_title,
+                buildSecondaryText(R.string.example_2_text, GREEN, 16, 5),
+                buildCarIconWithResource(R.drawable.ic_emoji_food_beverage_white_48dp, GREEN)));
+
+        listBuilder.addItem(buildRowForTemplate(R.string.colored_secondary_row_title,
+                getRatingsString(3.5)));
+
+        return new ListTemplate.Builder()
+                .setSingleList(listBuilder.build())
+                .setTitle(getCarContext().getString(R.string.text_icons_demo_title))
+                .setHeaderAction(BACK)
+                .build();
+
+    }
+
+    private CarIcon buildCarIconWithResource(int imageId) {
+        return new CarIcon.Builder(
+                IconCompat.createWithResource(
+                        getCarContext(),
+                        imageId))
+                .build();
+    }
+
+    private CarIcon buildCarIconWithResource(int imageId, CarColor color) {
+        return new CarIcon.Builder(
+                IconCompat.createWithResource(
+                        getCarContext(),
+                        imageId))
+                .setTint(color)
+                .build();
+    }
+
+    private CarIcon buildCarIconWithBitmap(int imageId) {
+        return new CarIcon.Builder(
+                IconCompat.createWithBitmap(
+                        BitmapFactory.decodeResource(
+                                getCarContext().getResources(),
+                                imageId)))
+                .build();
+    }
+
+    /**
+    * build a colored line of secondary text using a specific CarColor and some custom text
+    */
+    private CharSequence buildSecondaryText(int textId, CarColor color, int index, int length) {
+        return Utils.colorize(getCarContext().getString(textId),
+                color, index, length);
+    }
+
+    private Row buildRowForTemplate(int title, CharSequence text) {
+        return new Row.Builder()
+                .setTitle(getCarContext().getString(title))
+                .addText(text)
+                .build();
+    }
+
+    private Row buildRowForTemplate(int title, CarIcon image) {
+        return new Row.Builder()
+                .setTitle(getCarContext().getString(title))
+                .setImage(image)
+                .build();
+    }
+
+    private Row buildRowForTemplate(int title, CharSequence text, CarIcon image) {
+        return new Row.Builder()
+                .setTitle(getCarContext().getString(title))
+                .addText(text)
+                .setImage(image)
+                .build();
+    }
+
+    private static CharSequence getRatingsString(Double ratings) {
+        String s;
+        double r;
+        for (s = "", r = ratings; r > 0; --r) {
+            s += r < 1 ? HALF_STAR : FULL_STAR;
+        }
+        SpannableString ss = new SpannableString(s + " ratings: " + ratings);
+        if (!s.isEmpty()) {
+            Utils.colorize(ss, YELLOW, 0, s.length());
+        }
+        return ss;
+    }
+}
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/listtemplates/ToggleButtonListDemoScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/listtemplates/ToggleButtonListDemoScreen.java
new file mode 100644
index 0000000..092b530
--- /dev/null
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/listtemplates/ToggleButtonListDemoScreen.java
@@ -0,0 +1,171 @@
+/*
+ * Copyright 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 androidx.car.app.sample.showcase.common.screens.templatelayouts.listtemplates;
+
+import static androidx.car.app.CarToast.LENGTH_LONG;
+import static androidx.car.app.model.Action.BACK;
+import static androidx.car.app.model.CarColor.GREEN;
+
+import androidx.annotation.NonNull;
+import androidx.car.app.CarContext;
+import androidx.car.app.CarToast;
+import androidx.car.app.Screen;
+import androidx.car.app.model.Action;
+import androidx.car.app.model.ActionStrip;
+import androidx.car.app.model.CarIcon;
+import androidx.car.app.model.ItemList;
+import androidx.car.app.model.ListTemplate;
+import androidx.car.app.model.OnClickListener;
+import androidx.car.app.model.Row;
+import androidx.car.app.model.Template;
+import androidx.car.app.model.Toggle;
+import androidx.car.app.sample.showcase.common.R;
+import androidx.core.graphics.drawable.IconCompat;
+
+/** A screen demonstrating selectable lists. */
+public final class ToggleButtonListDemoScreen extends Screen {
+
+    public ToggleButtonListDemoScreen(@NonNull CarContext carContext) {
+        super(carContext);
+    }
+
+    private boolean mFirstToggleState;
+    private boolean mSecondToggleState;
+    private boolean mSecondToggleEnabled = true;
+    private int mImageType = Row.IMAGE_TYPE_ICON;
+    private boolean mSetTintToVector;
+
+    @NonNull
+    @Override
+    public Template onGetTemplate() {
+        Toggle mToggleForVector = new Toggle.Builder((checked) -> {
+            mSetTintToVector = !mSetTintToVector;
+            invalidate();
+        }).setChecked(mSetTintToVector).build();
+
+        Toggle mFirstToggle = new Toggle.Builder((checked) -> {
+            mSecondToggleEnabled = checked;
+            if (checked) {
+                CarToast.makeText(getCarContext(), R.string.toggle_test_enabled,
+                        LENGTH_LONG).show();
+            } else {
+                CarToast.makeText(getCarContext(), R.string.toggle_test_disabled,
+                        LENGTH_LONG).show();
+            }
+            mFirstToggleState = !mFirstToggleState;
+            invalidate();
+        }).setChecked(mFirstToggleState).build();
+
+        Toggle mSecondToggle = new Toggle.Builder((checked) -> {
+            mSecondToggleState = !mSecondToggleState;
+            invalidate();
+        }).setChecked(mSecondToggleState).setEnabled(mSecondToggleEnabled).build();
+
+        ItemList.Builder builder = new ItemList.Builder();
+        builder.addItem(buildRowForTemplate(R.string.toggle_test_first_toggle_title,
+                R.string.toggle_test_first_toggle_text, mFirstToggle));
+
+        builder.addItem(buildRowForTemplate(R.string.toggle_test_second_toggle_title,
+                R.string.toggle_test_second_toggle_text, mSecondToggle));
+
+        builder.addItem(buildRowForTemplate(titleForVectorDrawable(),
+                R.string.vector_toggle_details, mToggleForVector, buildCarIconForVectorDrawable(),
+                null, Row.IMAGE_TYPE_ICON));
+
+        builder.addItem(buildRowForTemplate(R.string.image_test_title,
+                R.string.image_test_text, null, buildCarIconForImageTest(),
+                buildOnClickListenerForImageTest(), mImageType));
+
+        return new ListTemplate.Builder()
+                .setSingleList(builder.build())
+                .setTitle(getCarContext().getString(R.string.toggle_button_demo_title))
+                .setHeaderAction(BACK)
+                .setActionStrip(
+                        new ActionStrip.Builder()
+                                .addAction(
+                                        new Action.Builder()
+                                                .setTitle(getCarContext().getString(
+                                                        R.string.home_caps_action_title))
+                                                .setOnClickListener(
+                                                        () -> getScreenManager().popToRoot())
+                                                .build())
+                                .build())
+                .build();
+    }
+
+    private CarIcon buildCarIconForVectorDrawable() {
+        CarIcon.Builder carIconBuilder = new CarIcon.Builder(
+                IconCompat.createWithResource(
+                        getCarContext(),
+                        R.drawable.ic_fastfood_white_48dp));
+
+        if (mSetTintToVector) {
+            carIconBuilder.setTint(GREEN);
+        }
+        return carIconBuilder.build();
+    }
+
+    private CarIcon buildCarIconForImageTest() {
+        return new CarIcon.Builder(
+                IconCompat.createWithResource(
+                        getCarContext(),
+                        R.drawable.ic_fastfood_yellow_48dp))
+                .build();
+    }
+
+    private int titleForVectorDrawable() {
+        if (mSetTintToVector) {
+            return R.string.vector_with_tint_title;
+        } else {
+            return R.string.vector_no_tint_title;
+        }
+    }
+
+    private OnClickListener buildOnClickListenerForImageTest() {
+        return () -> {
+            mImageType =
+                    mImageType == Row.IMAGE_TYPE_ICON
+                            ? Row.IMAGE_TYPE_LARGE
+                            : Row.IMAGE_TYPE_ICON;
+            invalidate();
+        };
+    }
+
+    private Row buildRowForTemplate(int title, int text, Toggle toggle) {
+        return new Row.Builder()
+                .addText(getCarContext().getString(text))
+                .setTitle(getCarContext().getString(title))
+                .setToggle(toggle)
+                .build();
+
+    }
+
+    private Row buildRowForTemplate(int title, int text, Toggle toggle, CarIcon icon,
+            OnClickListener onClickListener, int imageType) {
+
+        Row.Builder rowBuilder = new Row.Builder();
+        rowBuilder
+                .addText(getCarContext().getString(text))
+                .setTitle(getCarContext().getString(title))
+                .setImage(icon, imageType);
+
+        if (toggle != null) rowBuilder.setToggle(toggle);
+        if (onClickListener != null) rowBuilder.setOnClickListener(onClickListener);
+
+        return rowBuilder.build();
+    }
+}
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/messagetemplates/LongMessageTemplateDemoScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/messagetemplates/LongMessageTemplateDemoScreen.java
new file mode 100644
index 0000000..03e5598
--- /dev/null
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/messagetemplates/LongMessageTemplateDemoScreen.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright 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 androidx.car.app.sample.showcase.common.screens.templatelayouts.messagetemplates;
+
+import static androidx.car.app.CarToast.LENGTH_LONG;
+import static androidx.car.app.model.Action.BACK;
+import static androidx.car.app.model.Action.FLAG_PRIMARY;
+
+import androidx.annotation.NonNull;
+import androidx.car.app.CarContext;
+import androidx.car.app.CarToast;
+import androidx.car.app.Screen;
+import androidx.car.app.model.Action;
+import androidx.car.app.model.ActionStrip;
+import androidx.car.app.model.CarColor;
+import androidx.car.app.model.LongMessageTemplate;
+import androidx.car.app.model.MessageTemplate;
+import androidx.car.app.model.ParkedOnlyOnClickListener;
+import androidx.car.app.model.Template;
+import androidx.car.app.sample.showcase.common.R;
+import androidx.car.app.versioning.CarAppApiLevels;
+
+/** A screen that demonstrates the long message template. */
+public class LongMessageTemplateDemoScreen extends Screen {
+    public LongMessageTemplateDemoScreen(@NonNull CarContext carContext) {
+        super(carContext);
+    }
+
+    @NonNull
+    @Override
+    public Template onGetTemplate() {
+        if (getCarContext().getCarAppApiLevel() < CarAppApiLevels.LEVEL_2) {
+            return new MessageTemplate.Builder(
+                    getCarContext().getString(R.string.long_msg_template_not_supported_text))
+                    .setTitle(getCarContext().getString(
+                            R.string.long_msg_template_not_supported_title))
+                    .setHeaderAction(Action.BACK)
+                    .build();
+        }
+
+        Action.Builder primaryActionBuilder = new Action.Builder()
+                .setOnClickListener(
+                        ParkedOnlyOnClickListener.create(() -> {
+                            getScreenManager().pop();
+                            CarToast.makeText(
+                                    getCarContext(),
+                                    getCarContext().getString(R.string.primary_action_title),
+                                    LENGTH_LONG
+                            ).show();
+                        }))
+                .setTitle(getCarContext().getString(R.string.accept_action_title));
+        if (getCarContext().getCarAppApiLevel() >= CarAppApiLevels.LEVEL_4) {
+            primaryActionBuilder.setFlags(FLAG_PRIMARY);
+        }
+
+        return new LongMessageTemplate.Builder(
+                getCarContext().getString(R.string.long_msg_template_text))
+                .setTitle(getCarContext().getString(R.string.long_msg_template_demo_title))
+                .setHeaderAction(BACK)
+                .addAction(primaryActionBuilder.build())
+                .addAction(new Action.Builder()
+                        .setBackgroundColor(CarColor.RED)
+                        .setOnClickListener(
+                                ParkedOnlyOnClickListener.create(() -> getScreenManager().pop()))
+                        .setTitle(getCarContext().getString(R.string.reject_action_title))
+                        .build())
+                .setActionStrip(new ActionStrip.Builder()
+                        .addAction(new Action.Builder()
+                                .setTitle(getCarContext().getString(R.string.more_action_title))
+                                .setOnClickListener(
+                                        () ->
+                                                CarToast.makeText(
+                                                                getCarContext(),
+                                                                getCarContext().getString(
+                                                                        R.string.more_toast_msg),
+                                                                LENGTH_LONG)
+                                                        .show())
+                                .build())
+                        .build())
+                .build();
+    }
+}
diff --git a/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/messagetemplates/ShortMessageTemplateDemoScreen.java b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/messagetemplates/ShortMessageTemplateDemoScreen.java
new file mode 100644
index 0000000..f24d545
--- /dev/null
+++ b/car/app/app-samples/showcase/common/src/main/java/androidx/car/app/sample/showcase/common/screens/templatelayouts/messagetemplates/ShortMessageTemplateDemoScreen.java
@@ -0,0 +1,100 @@
+/*
+ * Copyright 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 androidx.car.app.sample.showcase.common.screens.templatelayouts.messagetemplates;
+
+import static androidx.car.app.CarToast.LENGTH_LONG;
+import static androidx.car.app.model.Action.BACK;
+import static androidx.car.app.model.Action.FLAG_PRIMARY;
+
+import androidx.annotation.NonNull;
+import androidx.car.app.CarContext;
+import androidx.car.app.CarToast;
+import androidx.car.app.Screen;
+import androidx.car.app.model.Action;
+import androidx.car.app.model.ActionStrip;
+import androidx.car.app.model.CarColor;
+import androidx.car.app.model.CarIcon;
+import androidx.car.app.model.MessageTemplate;
+import androidx.car.app.model.Template;
+import androidx.car.app.sample.showcase.common.R;
+import androidx.car.app.versioning.CarAppApiLevels;
+import androidx.core.graphics.drawable.IconCompat;
+
+/** A screen that demonstrates the message template. */
+public class ShortMessageTemplateDemoScreen extends Screen {
+
+    public ShortMessageTemplateDemoScreen(@NonNull CarContext carContext) {
+        super(carContext);
+    }
+
+    @NonNull
+    @Override
+    public Template onGetTemplate() {
+        Action.Builder primaryActionBuilder = new Action.Builder()
+                .setOnClickListener(() -> {
+                    CarToast.makeText(
+                            getCarContext(),
+                            getCarContext().getString(R.string.primary_action_title),
+                            LENGTH_LONG
+                    ).show();
+                })
+                .setTitle(getCarContext().getString(R.string.ok_action_title));
+        if (getCarContext().getCarAppApiLevel() >= CarAppApiLevels.LEVEL_4) {
+            primaryActionBuilder.setFlags(FLAG_PRIMARY);
+        }
+
+        Action settings = new Action.Builder()
+                .setTitle(getCarContext().getString(
+                        R.string.settings_action_title))
+                .setOnClickListener(
+                        () -> CarToast.makeText(
+                                        getCarContext(),
+                                        getCarContext().getString(
+                                                R.string.settings_toast_msg),
+                                        LENGTH_LONG)
+                                .show())
+                .build();
+
+        return new MessageTemplate.Builder(
+                getCarContext().getString(R.string.msg_template_demo_text))
+                .setTitle(getCarContext().getString(R.string.msg_template_demo_title))
+                .setIcon(
+                        new CarIcon.Builder(
+                                IconCompat.createWithResource(
+                                        getCarContext(),
+                                        R.drawable.ic_emoji_food_beverage_white_48dp))
+                                .setTint(CarColor.GREEN)
+                                .build())
+                .setHeaderAction(BACK)
+                .addAction(primaryActionBuilder.build())
+                .addAction(
+                        new Action.Builder()
+                                .setBackgroundColor(CarColor.RED)
+                                .setTitle(getCarContext().getString(R.string.throw_action_title))
+                                .setOnClickListener(
+                                        () -> {
+                                            throw new RuntimeException("Error");
+                                        })
+                                .build())
+
+                .setActionStrip(
+                        new ActionStrip.Builder()
+                                .addAction(settings)
+                                .build())
+                .build();
+    }
+}
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-af/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-af/strings.xml
index 4847905..f3ec645 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-af/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-af/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Hierdie teks het ’n groen kleur"</string>
     <string name="example_3_text" msgid="977269832109695627">"Hierdie teks het ’n blou kleur"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Hierdie teks het ’n geel kleur"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Hierdie teks gebruik die primêre kleur"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Hierdie teks gebruik die sekondêre kleur"</string>
     <string name="color_demo" msgid="1822427636476178993">"Kleurdemonstrasie"</string>
     <string name="list_limit" msgid="3023536401535417286">"Lyslimiet"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"Dit sal die program voltooi en ’n toestemmingskerm byvoeg wanneer jy terugkeer."</string>
     <string name="finish_app_title" msgid="9013328479438745074">"Voltooi programdemonstrasie"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"Demonstrasie van toestemmingskerm wanneer program weer oopgemaak word"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"Demonstrasie van toestemmingskerm vir program"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"Demonstrasie van toestemmingskerm wanneer program weer oopgemaak word"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"Laai tans demonstrasie"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"Klaar gelaai!"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"Gaan na kernregte"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Onversoenbare gasheer"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Boodskaptemplaatdemonstrasie"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Boodskap kom hier.\nMeer teks in tweede reël."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Paneeltemplaatdemonstrasie"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Demonstrasie van pleklystemplaat"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Blaai deur plekke"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"’n Vektorgrafika, met ’n tint"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"’n Vektorgrafika, met ’n program se temakenmerk vir sy kleur"</string>
     <string name="png_res_title" msgid="7437083018336747544">"’n PNG, gestuur as ’n hulpbron"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"’n PNG, gestuur as ’n hulpbron"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Net ’n titel"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Titel met programikoon"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Titel met hulpbron-ID-prent"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Demonstrasie van rye"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Demonstrasies oor teks en ikone"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Demonstrasie van rye met teks en ikone"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Demonstrasie van kiesbare lyste"</string>
     <string name="option_1_title" msgid="7221252541651471199">"Opsie 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"Opsie 2"</string>
@@ -292,6 +296,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Taaklimiet is bereik\nAs jy voortgaan, sal die program verplig word om te stop"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Taak se stap %1$d van %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Klik om aan te beweeg"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Wissel toets"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Dinamiese veranderinge word toegelaat"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Aktiveer wisseltoets"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Wisseltoets is gedeaktiveer"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Demonstrasies oor diverse template"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Stal demonstrasies uit"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"Demonstrasieskerm vir stemtoegang"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"Gebruikerinteraksies"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"Versoek demonstrasies van toestemmings"</string>
+    <string name="perm_group" msgid="3834918337351876270">"Toestemminggroep"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"Toestemminggroep vir uitstalprogram"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"Toegang tot fyn ligging"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"Toestemming vir toegang tot fyn ligging"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"Toegang tot growwe ligging"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"Toestemming vir toegang tot growwe ligging"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"Toegang tot Neem Oudio Op"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"Toestemming vir toegang tot Neem Oudio Op"</string>
     <string name="location_1_description" msgid="4801052291684791371">"Hulpbronvektor wat getint is"</string>
     <string name="location_2_description" msgid="3331356135359047166">"Prenthulpbronbiskaart"</string>
     <string name="location_3_description" msgid="3982142774088944850">"Gekleurde teksmerker"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Prentbiskaart"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Teksetiket"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-am/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-am/strings.xml
index e2beac8..a7d68fe 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-am/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-am/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"ይህ ጽሁፍ አረንጓዴ ቀለም አለው"</string>
     <string name="example_3_text" msgid="977269832109695627">"ይህ ጽሁፍ ሰማያዊ ቀለም አለው"</string>
     <string name="example_4_text" msgid="2043547015979437373">"ይህ ጽሁፍ ቢጫ ቀለም አለው"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"ይህ ጽሁፍ ዋናውን ቀለም ይጠቀማል"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"ይህ ጽሁፍ ሁለተኛውን ቀለም ይጠቀማል"</string>
     <string name="color_demo" msgid="1822427636476178993">"የቀለም ቅንጭብ ማሳያ"</string>
     <string name="list_limit" msgid="3023536401535417286">"የዝርዝር ገደብ"</string>
@@ -232,6 +233,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"ተኳሃኝ ያልሆነ አስተናጋጅ"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"የመልዕክት ቅንብር ደንብ ቅንጭብ ማሳያ"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"መልእክት እዚህ ይሆናል።\nበሁለተኛው መስመር ላይ ተጨማሪ ጽሁፍ።"</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"የፔን ቅንብር ደንብ ቅንጭብ ማሳያ"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"የዝርዝር ቅንብር ደንብ ቅንጭብ ማሳያ ይመድቡ"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"ቦታዎችን ያስሱ"</string>
@@ -267,7 +270,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"ቬክተር ሊሳል የሚችል፣ ከቀለም ጋር"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"ቬክተር ሊሳል የሚችል፣ ለቀለም ከመተግበሪያው ገጽታ መግለጫ ባህሪ"</string>
     <string name="png_res_title" msgid="7437083018336747544">"PNG፣ እንደ ግብዓት ተልኳል"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"PNG፣ እንደ ግብዓት ተልኳል"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"ርዕስ ብቻ"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"የመተግበሪያ አዶ ያለው ርዕስ"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"የንብረት መታወቂያ ምስል ያለው ርዕስ"</string>
@@ -279,6 +283,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"የረድፎች ቅንጭብ ማሳያ"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"የጽሑፍ እና የአዶዎች ቅንጭብ ማሳያዎች"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"ጽሁፍ እና የአዶዎች ቅንጭብ ማሳያ ረድፎች"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"ሊመረጡ የሚችሉ ዝርዝሮች ቅንጭብ ማሳያ"</string>
     <string name="option_1_title" msgid="7221252541651471199">"አማራጭ 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"አማራጭ 2"</string>
@@ -292,6 +298,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"የተግባር ገደብ ላይ ደርሷል\nወደፊት መሄድ መተግበሪያውን በኃይል ያስቆማል"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"የተግባር እርምጃ %1$d ከ%2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"ወደፊት ለመሄድ ጠቅ ያድርጉ"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"ሙከራን ቀያይር"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"ተጨባጭ ለውጦች ተፈቅደዋል"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"የመቀያየር ሙከራን አንቃ"</string>
@@ -306,6 +314,10 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"የመቀያየር ሙከራ ተሰናክሏል"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"የተለያዩ ቅንብር ደንቦች ቅንጭብ ማሳያዎች"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"የመሳያ ቅንጭብ ማሳያ"</string>
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
+    <skip />
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
+    <skip />
     <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
     <skip />
     <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
@@ -333,4 +345,18 @@
     <string name="location_3_description" msgid="3982142774088944850">"ባለቀለም የጽሑፍ ምልክት ማድረጊያ"</string>
     <string name="location_4_description" msgid="6560365445044381911">"የምስል ቢትማፕ"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"የጽሑፍ መሰየሚያ"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-ar/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-ar/strings.xml
index d51221c..a0f316d3 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-ar/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-ar/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"يحتوي هذا النص على محتوى باللون الأخضر."</string>
     <string name="example_3_text" msgid="977269832109695627">"يحتوي هذا النص على محتوى باللون الأزرق."</string>
     <string name="example_4_text" msgid="2043547015979437373">"يحتوي هذا النص على محتوى باللون الأصفر."</string>
-    <string name="example_5_text" msgid="4387859825054561488">"يستخدم هذا النص اللون الأساسي."</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"يستخدم هذا النص اللون الثانوي."</string>
     <string name="color_demo" msgid="1822427636476178993">"إصدار تجريبي للألوان"</string>
     <string name="list_limit" msgid="3023536401535417286">"حد القائمة"</string>
@@ -232,6 +233,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"مضيف غير متوافق"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"إصدار تجريبي لنموذج الرسالة"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"تظهر الرسالة هنا.\nالمزيد من النص في السطر الثاني."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"إصدار تجريبي لنموذج اللوحة"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"إصدار تجريبي لنموذج قائمة الأماكن"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"تصفُّح الأماكن"</string>
@@ -267,7 +270,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"متّجه قابل للرسم مع درجات ألوان"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"متّجه قابل للرسم مع سمة لمظهر التطبيق خاصة بلونه"</string>
     <string name="png_res_title" msgid="7437083018336747544">"‏تم إرسال صورة بتنسيق PNG كأحد الموارد"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"‏تم إرسال صورة بتنسيق PNG كأحد الموارد"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"مجرد عنوان"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"عنوان مع رمز تطبيق"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"عنوان مع صورة معرف المورد"</string>
@@ -279,6 +283,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"إصدار تجريبي للصفوف"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"الإصدارات التجريبية للنصوص والرموز"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"إصدار تجريبي للصفوف التي تتضمن نصوصًا ورموزًا"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"إصدار تجريبي للقوائم القابلة للاختيار"</string>
     <string name="option_1_title" msgid="7221252541651471199">"الخيار الأول"</string>
     <string name="option_2_title" msgid="1905146448697963818">"الخيار الثاني"</string>
@@ -292,6 +298,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"تم الوصول إلى حد المهمّة.\nسيؤدي التقدم إلى فرض إيقاف التطبيق."</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"‏خطوة المهمة: %1$d من %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"انقر للتقدم إلى الأمام."</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"إيقاف/تفعيل الاختبار"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"يُسمَح بتغيير الحالة."</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"تفعيل زر إيقاف/تفعيل الاختبار"</string>
@@ -306,6 +314,10 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"تم إيقاف زر إيقاف/تفعيل الاختبار."</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"إصدارات تجريبية لنموذج ميزات متنوّعة"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"عرض الإصدارات التجريبية"</string>
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
+    <skip />
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
+    <skip />
     <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
     <skip />
     <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
@@ -333,4 +345,18 @@
     <string name="location_3_description" msgid="3982142774088944850">"علامة النص الملوّن"</string>
     <string name="location_4_description" msgid="6560365445044381911">"صورة نقطية"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"تصنيف النص"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-as/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-as/strings.xml
index 9140972..fda3a3a 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-as/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-as/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"এই পাঠটোত সেউজীয়া ৰং আছে"</string>
     <string name="example_3_text" msgid="977269832109695627">"এই পাঠটোত নীলা ৰং আছে"</string>
     <string name="example_4_text" msgid="2043547015979437373">"এই পাঠটোত হালধীয়া ৰং আছে"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"এই পাঠটোৱে মুখ্য ৰং ব্যৱহাৰ কৰে"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"এই পাঠটোৱে গৌণ ৰং ব্যৱহাৰ কৰে"</string>
     <string name="color_demo" msgid="1822427636476178993">"ৰঙৰ ডেম’"</string>
     <string name="list_limit" msgid="3023536401535417286">"সূচীৰ সীমা"</string>
@@ -232,6 +233,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"অমিল হ’ষ্ট"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"বাৰ্তাৰ টেম্পলে’টৰ ডেম’"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"ইয়াত বাৰ্তা ওলাব।\nদ্বিতীয় শাৰীত অধিক পাঠ।"</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"পে’নৰ টেম্পলে’টৰ ডেম’"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"ঠাইৰ সূচীৰ টেম্পলে’টৰ ডেম’"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"ঠাইসমূহ ব্ৰাউজ কৰক"</string>
@@ -267,7 +270,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"এটা ৰঙৰ জৰিয়তে স্পৰ্শেৰে স্থানান্তৰ কৰিব পৰা এটা ভেক্টৰ"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"এটা এপৰ নিজৰ ৰঙৰ থীমৰ এট্ৰিবিউটৰ জৰিয়তে স্পৰ্শেৰে স্থানান্তৰ কৰিব পৰা এটা ভেক্টৰ"</string>
     <string name="png_res_title" msgid="7437083018336747544">"উৎস হিচাপে পঠিওৱা এটা PNG"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"উৎস হিচাপে পঠিওৱা এটা PNG"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"মাত্ৰ অলপ"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"এপৰ চিহ্নৰ সৈতে শিৰোনাম"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"উৎসৰ আইডিৰ প্ৰতিচ্ছবিৰ সৈতে শিৰোনাম"</string>
@@ -279,6 +283,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"শাৰীৰ ডেম’"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"পাঠ আৰু চিহ্নৰ ডেম’"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"পাঠ আৰু চিহ্নৰ ডেম’যুক্ত শাৰী"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"বাছনিযোগ্য সূচীৰ ডেম’"</string>
     <string name="option_1_title" msgid="7221252541651471199">"বিকল্প ১"</string>
     <string name="option_2_title" msgid="1905146448697963818">"বিকল্প ২"</string>
@@ -292,6 +298,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"কাৰ্যৰ সীমাত উপনীত হৈছে\nআগবাঢ়ি গ’লে এপ্‌টো বলপূৰ্বকভাৱে বন্ধ কৰা হ’ব"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"কাৰ্যৰ পদক্ষেপ %2$d টাৰ %1$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"আগবাঢ়ি যাবলৈ ক্লিক কৰক"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"পৰীক্ষা ট’গল কৰক"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"ষ্টে’টফুল সলনি কৰাৰ অনুমতি আছে"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"পৰীক্ষা ট’গল কৰাৰ সুবিধা সক্ষম কৰক"</string>
@@ -306,6 +314,10 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"পৰীক্ষা ট’গল কৰাৰ সুবিধা অক্ষম কৰা হৈছে"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"সানমিহলি টেম্পলে’টৰ ডেম’"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"ডেম’ দেখুৱাওক"</string>
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
+    <skip />
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
+    <skip />
     <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
     <skip />
     <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
@@ -333,4 +345,18 @@
     <string name="location_3_description" msgid="3982142774088944850">"ৰং কৰা পাঠৰ চিহ্ন"</string>
     <string name="location_4_description" msgid="6560365445044381911">"প্ৰতিচ্ছবিৰ বিটমেপ"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"পাঠৰ লেবেল"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-az/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-az/strings.xml
index d120ca6..dae7bd5 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-az/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-az/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Bu mətn yaşıl rəngdədir"</string>
     <string name="example_3_text" msgid="977269832109695627">"Bu mətn mavi rəngdədir"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Bu mətn sarı rəngdədir"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Bu mətn əsas rəngdən istifadə edir"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Bu mətn ikinci dərəcəli rəngdən istifadə edir"</string>
     <string name="color_demo" msgid="1822427636476178993">"Rəng Demosu"</string>
     <string name="list_limit" msgid="3023536401535417286">"Siyahı Limiti"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"Bu, tətbiqi bitirəcək və geri qaytardığınız zaman o, icazə ekranını əvvəlcədən yükləyəcək"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"Tətbiq Demosunu Bitirin"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"Növbəti işə salınmada İcazə Ekranını əvvəlcədən yükləmə Demosu"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"Əvvəlcədən yükləmə Tətbiq Demosu"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"Növbəti işə salınmada İcazə Ekranını əvvəlcədən yükləmə Demosu"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"Demo Yüklənir"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"Yükləmə Tamamlandı!"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"Kökə keçid"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Uyğun olmayan host"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Message Şablonu Demosu"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Mesaj burada olmalıdır.\nİkinci sətirdə daha çox mətn."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Panel Şablonu Demosu"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Yer Siyahısı Şablonu Demosu"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Yerlərə Baxın"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Rəng ilə çəkilə bilən vektor"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Rənginə görə tətbiqin tema atributu ilə çəkilə bilən vektor"</string>
     <string name="png_res_title" msgid="7437083018336747544">"Resurs olaraq göndərilən PNG"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"Resurs olaraq göndərilən PNG"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Sadəcə başlıq"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Tətbiq ikonası ilə başlıq"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Resurs ID şəkli ilə başlıq"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Sıra Demosu"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Mətn və İkona Demoları"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Mətn və İkonalar olan Sıralar Demosu"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Seçilə Bilən Siyahılar Demosu"</string>
     <string name="option_1_title" msgid="7221252541651471199">"Seçim 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"Seçim 2"</string>
@@ -292,6 +296,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Tapşırıq limitinə çatdınız\nİrəli getmək tətbiqi məcburi dayandıracaq"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Tapşırıq mərhələsi %1$d/%2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"İrəli keçmək üçün klikləyin"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Keçirmə testi"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Status dəyişikliyinə icazə verilir"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Keçirmə Testini Aktivdir edin"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Keçirmə Testi Deaktivdir"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Digər Şablon Demoları"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Vitrin Demoları"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"Səsli Giriş Demo Ekranı"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"İstifadəçi əlaqələri"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"İcazə Demosu Tələb edin"</string>
+    <string name="perm_group" msgid="3834918337351876270">"İcazə Qrupu"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"Xəbərlər Vitrini Tətbiqi üçün İcazə Qrupu"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"Dəqiq Məkana Giriş"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"Dəqiq Məkana Giriş üçün İcazə"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"Təqribi Məkana Giriş"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"Təqribi Məkana Giriş üçün İcazə"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"Audio Yazmağa Giriş"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"Audio Yazmağa Giriş üçün İcazə"</string>
     <string name="location_1_description" msgid="4801052291684791371">"Rənglənmiş resurs vektoru"</string>
     <string name="location_2_description" msgid="3331356135359047166">"Şəkil resursunun nöqtəli görüntüsü"</string>
     <string name="location_3_description" msgid="3982142774088944850">"Rəngli mətn markeri"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Nöqtəli görüntü"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Mətn etiketi"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-b+sr+Latn/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-b+sr+Latn/strings.xml
index a85d701..e2198ca 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-b+sr+Latn/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-b+sr+Latn/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Ovaj tekst ima zelenu boju"</string>
     <string name="example_3_text" msgid="977269832109695627">"Ovaj tekst ima plavu boju"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Ovaj tekst ima žutu boju"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Ovaj tekst koristi primarnu boju"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Ovaj tekst koristi sekundarnu boju"</string>
     <string name="color_demo" msgid="1822427636476178993">"Demonstracija za boju"</string>
     <string name="list_limit" msgid="3023536401535417286">"Ograničenje liste"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"Time će se aplikacija završiti, a kada je vratite, predučitaće ekran sa dozvolama"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"Demonstracija završetka aplikacije"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"Demonstracija predučitavanja ekrana sa dozvolama pri sledećem pokretanju"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"Demonstracija predučitavanja dozvola za aplikaciju"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"Demonstracija predučitavanja ekrana sa dozvolama pri sledećem pokretanju"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"Učitava se demonstracija"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"Učitavanje je dovršeno!"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"Pređi na osnovni nivo"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Nekompatibilan host"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Demonstracija šablona poruke"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Ovde ide poruka.\nViše teksta u drugom redu."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Demonstracija šablona okna"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Demonstracija šablona liste mesta"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Pregledajte mesta"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Vektor koji može da se crta, sa tonalitetom"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Vektor koji može da se crta, sa atributom teme aplikacije za njegovu boju"</string>
     <string name="png_res_title" msgid="7437083018336747544">"PNG fajl, poslat kao resurs"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"PNG fajl, poslat kao resurs"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Samo naslov"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Naslov sa ikonom aplikacije"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Naslov sa slikom ID-a resursa"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Demonstracija redova"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Demonstracije teksta i ikona"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Demonstracija redova sa tekstom i ikonama"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Demonstracija lista koje mogu da se izaberu"</string>
     <string name="option_1_title" msgid="7221252541651471199">"1. opcija"</string>
     <string name="option_2_title" msgid="1905146448697963818">"2. opcija"</string>
@@ -292,6 +296,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Dostignuto je ograničenje zadataka\nAko nastavite, aplikacija će se prinudno zaustaviti"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"%1$d. korak zadatka od %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Kliknite da biste išli napred"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Uključi/isključi test"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Promene stanja su dozvoljene"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Omogućite test uključivanja/isključivanja"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Test uključivanja/isključivanja je onemogućen"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Demonstracije različitih šablona"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Demonstracije prikazivanja"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"Ekran demonstracije pristupa glasu"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"Korisničke interakcije"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"Demonstracije zahteva za dozvole"</string>
+    <string name="perm_group" msgid="3834918337351876270">"Grupa dozvola"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"Grupa dozvola za isticanje aplikacije"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"Pristup preciznoj lokaciji"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"Dozvola za pristup preciznoj lokaciji"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"Pristup približnoj lokaciji"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"Dozvola za pristup približnoj lokaciji"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"Pristup snimanju zvuka"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"Dozvola za pristup snimanju zvuka"</string>
     <string name="location_1_description" msgid="4801052291684791371">"Vektor resursa sa tonalitetom"</string>
     <string name="location_2_description" msgid="3331356135359047166">"Bit mapa resursa slike"</string>
     <string name="location_3_description" msgid="3982142774088944850">"Marker teksta u boji"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Bit mapa slike"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Oznaka teksta"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-be/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-be/strings.xml
index 4e81d50..ca53e2c 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-be/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-be/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Гэта тэкст зялёнага колеру"</string>
     <string name="example_3_text" msgid="977269832109695627">"Гэта тэкст сіняга колеру"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Гэта тэкст жоўтага колеру"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Гэты тэкст мае асноўны колер"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Гэты тэкст мае другасны колер"</string>
     <string name="color_demo" msgid="1822427636476178993">"Дэманстрацыя колеру"</string>
     <string name="list_limit" msgid="3023536401535417286">"Абмежаванне спіса"</string>
@@ -232,6 +233,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Несумяшчальны хост"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Дэманстрацыя шаблона паведамлення"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Тут будзе паказана паведамленне.\nАстатні тэкст – далей."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Дэманстрацыя шаблона панэлі"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Дэманстрацыя шаблона спіса месцаў"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Агляд месцаў"</string>
@@ -267,7 +270,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Вектарны графічны элемент з каляровым фільтрам"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Вектарны графічны элемент з атрыбутам тэмы праграмы для яго колеру"</string>
     <string name="png_res_title" msgid="7437083018336747544">"Файл PNG, адпраўлены як рэсурс"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"Файл PNG, адпраўлены як рэсурс"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Толькі назва"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Назва са значком праграмы"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Назва з відарысам ідэнтыфікатара рэсурсу"</string>
@@ -279,6 +283,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Дэманстрацыя радкоў"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Дэманстрацыі тэксту і значкоў"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Дэманстрацыя радкоў з тэкстам і значкамі"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Дэманстрацыя спісаў выбару"</string>
     <string name="option_1_title" msgid="7221252541651471199">"Варыянт 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"Варыянт 2"</string>
@@ -292,6 +298,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Дасягнута максімальная колькасць задач\nДалейшы рух прывядзе да прымусовага спынення праграмы"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Крок задачы %1$d з %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Націсніце, каб рухацца далей"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Праверка пераключэння"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Дазволена змяняць стан"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Уключыць праверку пераключэння"</string>
@@ -306,6 +314,10 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Праверка пераключэння адключана"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Дэманстрацыі розных шаблонаў"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Дэманстрацыі выбранага"</string>
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
+    <skip />
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
+    <skip />
     <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
     <skip />
     <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
@@ -333,4 +345,18 @@
     <string name="location_3_description" msgid="3982142774088944850">"Тэкставы маркер афарбаваны"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Растравая выява відарыса"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Тэкставая метка"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-bg/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-bg/strings.xml
index 7e30fa4..231eca5 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-bg/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-bg/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Този текст е със зелен цвят"</string>
     <string name="example_3_text" msgid="977269832109695627">"Този текст е със син цвят"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Този текст е с жълт цвят"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"За този текст се използва основният цвят"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"За този текст се използва алтернативният цвят"</string>
     <string name="color_demo" msgid="1822427636476178993">"Цветова демонстрация"</string>
     <string name="list_limit" msgid="3023536401535417286">"Ограничение за списъка"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"Приложението ще се затвори и когато се върнете към него, то ще зареди предварително екран за разрешения"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"Демонстрация на затваряне на приложение"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"Демонстрация на предварително зареждане на екрана с разрешения при следващото стартиране"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"Демонстрация на приложението за разрешение за предварително зареждане"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"Демонстрация на предварително зареждане на екрана с разрешения при следващото стартиране"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"Демонстрацията се зарежда"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"Зареждането завърши!"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"Преминаване към основния екран"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Несъвместим хост"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Демонстрация на шаблон за съобщение"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Място за съобщение.\nОще текст на втория ред."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Демонстрация на шаблон за панел"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Демонстрация на шаблон за списък с места"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Преглед на места"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Векторен ресурс с възможност за изчертаване, с нюанс"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Векторен ресурс с възможност за изчертаване, за цвета му се използва атрибут от тема на приложение"</string>
     <string name="png_res_title" msgid="7437083018336747544">"PNG файл, изпратен като ресурс"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"PNG файл, изпратен като ресурс"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Просто едно заглавие"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Заглавие с икона на приложение"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Заглавие с изображение на ID на ресурс"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Демонстрация на редове"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Демонстрации на текст и икони"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Демонстрация на редове с текст и икони"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Демонстрация на списъци с опции"</string>
     <string name="option_1_title" msgid="7221252541651471199">"Опция 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"Опция 2"</string>
@@ -292,6 +296,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Ограничението за задачи е достигнато\nАко продължите, приложението ще бъде спряно принудително"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Стъпка %1$d от %2$d в задачата"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Кликнете, за да продължите напред"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Тест с превключвател"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Промените на състоянието са разрешени"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Активиране на теста с превключвател"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Тестът с превключвател е деактивиран"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Демонстрации на разни шаблони"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Демонстрации на Showcase"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"Екран за демонстрация на Voice Access"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"Потребителски взаимодействия"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"Демонстрации за заявяване на разрешения"</string>
+    <string name="perm_group" msgid="3834918337351876270">"Група разрешения"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"Група разрешения за приложението „На фокус“"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"Достъп до точното местоположение"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"Разрешение за достъп до точното местоположение"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"Достъп до приблизителното местоположение"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"Разрешение за достъп до приблизителното местоположение"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"Достъп до записване на аудио"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"Разрешение за достъп до записване на аудио"</string>
     <string name="location_1_description" msgid="4801052291684791371">"Нюансиран векторен ресурс"</string>
     <string name="location_2_description" msgid="3331356135359047166">"Растерен графичен ресурс"</string>
     <string name="location_3_description" msgid="3982142774088944850">"Цветен текстов маркер"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Растерно изображение"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Текстов етикет"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-bn/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-bn/strings.xml
index 4eefbbf..f50850c 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-bn/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-bn/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"এই টেক্সট সবুজ রঙে লেখা হয়েছে"</string>
     <string name="example_3_text" msgid="977269832109695627">"এই টেক্সট নীল রঙে লেখা হয়েছে"</string>
     <string name="example_4_text" msgid="2043547015979437373">"এই টেক্সট হলুদ রঙে লেখা হয়েছে"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"এই টেক্সটে মুখ্য কালার ব্যবহৃত হয়েছে"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"এই টেক্সটে গৌণ কালার ব্যবহৃত হয়েছে"</string>
     <string name="color_demo" msgid="1822427636476178993">"কালার দেখানো ডেমো"</string>
     <string name="list_limit" msgid="3023536401535417286">"তালিকার সীমা"</string>
@@ -232,6 +233,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"হোস্ট কাজ করছে না"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"মেসেজ টেমপ্লেটের ডেমো"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"মেসেজে এখানে লেখা হবে।\nবেশি টেক্সট হলে, দ্বিতীয় লাইনে লিখুন।"</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"প্যানেল টেমপ্লেটের ডেমো"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"জায়গার তালিকার টেমপ্লেটের ডেমো"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"জায়গা ব্রাউজ করুন"</string>
@@ -267,7 +270,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"আঁকা যায় এমন রঙিন ভেক্টর"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"অ্যাপের থিমের অ্যাট্রিবিউটের রঙে আঁকা যায় এমন ভেক্টর"</string>
     <string name="png_res_title" msgid="7437083018336747544">"রিসোর্স হিসেবে পাঠানো PNG ছবি"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"রিসোর্স হিসেবে পাঠানো PNG ছবি"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"শুধুমাত্র একটি টাইটেল"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"অ্যাপ আইকন সহ টাইটেল"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"রিসোর্স আইডি ছবি সহ টাইটেল"</string>
@@ -279,6 +283,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"সারির ডেমো"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"টেক্সট ও আইকনের ডেমো"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"টেক্সট ও আইকন সহ সারির ডেমো"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"বেছে নেওয়া যায় এমন তালিকার ডেমো"</string>
     <string name="option_1_title" msgid="7221252541651471199">"১ নম্বর বিকল্প"</string>
     <string name="option_2_title" msgid="1905146448697963818">"২ নম্বর বিকল্প"</string>
@@ -292,6 +298,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"টাস্কের সীমা পেরিয়ে গেছে\nআরও এগোলে, অ্যাপকে জোর করে বন্ধ করা হবে"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"টাস্কের %2$d ধাপের %1$d নম্বর ধাপ"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"এগিয়ে যাওয়ার জন্য ক্লিক করুন"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"টগল টেস্ট"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"স্টেটফুল পরিবর্তন করার অনুমতি দেওয়া হয়েছে"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"টগল টেস্ট চালু করুন"</string>
@@ -306,6 +314,10 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"টগল টেস্ট বন্ধ করা হয়েছে"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"অন্যান্য টেমপ্লেটের ডেমো"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"ডেমো শোকেস করুন"</string>
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
+    <skip />
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
+    <skip />
     <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
     <skip />
     <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
@@ -333,4 +345,18 @@
     <string name="location_3_description" msgid="3982142774088944850">"রঙিন টেক্সট মার্কার"</string>
     <string name="location_4_description" msgid="6560365445044381911">"ছবির বিটম্যাপ"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"টেক্সট লেবেল"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-bs/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-bs/strings.xml
index a108f3f..374669e 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-bs/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-bs/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Ovaj tekst sadržava zelenu boju"</string>
     <string name="example_3_text" msgid="977269832109695627">"Ovaj tekst sadržava plavu boju"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Ovaj tekst sadržava žutu boju"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Ovaj tekst koristi primarnu boju"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Ovaj tekst koristi sekundarnu boju"</string>
     <string name="color_demo" msgid="1822427636476178993">"Demo verzija u boji"</string>
     <string name="list_limit" msgid="3023536401535417286">"Ograničenje liste"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"To će zatvoriti aplikaciju, a kada se vratite, ekran s odobrenjem će se pripremiti"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"Završi demo verziju aplikacije"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"Demonstracija predučitavanja ekrana odobrenja prilikom sljedećeg pokretanja"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"Demo verzija aplikacije s odobrenjem za vraćanje na prethodne ekrane"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"Vrati prethodni ekran odobrenja prilikom sljedećeg pokretanja demo verzije"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"Učitavanje demo verzije"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"Učitavanje je završeno!"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"Pređite na korijenski direktorij"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Nekompatibilan host"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Demo verzija šablona poruke"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Poruka ide ovdje.\nViše teksta u drugom redu."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Demo verzija šablona okna"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Demo verzija šablona za listu mjesta"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Pregledajte mjesta"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Vektor koji je moguće nacrtati uz nijansiranje"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Vektor koji je moguće nacrtati i koji koristi atribut teme aplikacije za svoju boju"</string>
     <string name="png_res_title" msgid="7437083018336747544">"PNG fajl, poslan kao izvor"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"PNG fajl, poslan kao izvor"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Samo naslov"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Naslov s ikonom aplikacije"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Naslov sa slikom ID-a izvora"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Demo verzija redova"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Demo verzije teksta i ikona"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Demo verzija redova s tekstom i ikonama"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Demo verzija listi s odabirima"</string>
     <string name="option_1_title" msgid="7221252541651471199">"1. opcija"</string>
     <string name="option_2_title" msgid="1905146448697963818">"2. opcija"</string>
@@ -292,6 +296,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Dostignuto je ograničenje za zadatak\nAko nastavite, prisilno ćete zaustaviti aplikaciju"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Korak zadatka: %1$d od %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Kliknite da idete naprijed"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Testiranje uključivanja/isključivanja"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Dozvoljene su izmjene koje zavise od statusa"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Omogućite testiranje uključivanja/isključivanja"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Testiranje uključivanja/isključivanja je onemogućeno"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Demo verzije raznih šablona"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Demo verzije predstavljanja"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"Ekran demo verzije Pristupa glasom"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"Korisničke interakcije"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"Zatraži demo verzije odobrenja"</string>
+    <string name="perm_group" msgid="3834918337351876270">"Grupa odobrenja"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"Grupa odobrenja za aplikaciju Showcase"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"Pristup preciznoj lokaciji"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"Odobrenje za pristup preciznoj lokaciji"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"Pristup približnoj lokaciji"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"Odobrenje za pristup približnoj lokaciji"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"Pristup snimanju zvuka"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"Odobrenje za pristup snimanju zvuka"</string>
     <string name="location_1_description" msgid="4801052291684791371">"Nijansirani vektor izvora"</string>
     <string name="location_2_description" msgid="3331356135359047166">"Slika izvora u formatu bitmape"</string>
     <string name="location_3_description" msgid="3982142774088944850">"Označivač teksta u boji"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Slika u formatu bitmape"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Tekstualna oznaka"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-ca/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-ca/strings.xml
index 9e8de99..94e9cbc 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-ca/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-ca/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Aquest text és de color verd"</string>
     <string name="example_3_text" msgid="977269832109695627">"Aquest text és de color blau"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Aquest text és de color groc"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Aquest text utilitza el color primari"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Aquest text utilitza el color secundari"</string>
     <string name="color_demo" msgid="1822427636476178993">"Demostració de color"</string>
     <string name="list_limit" msgid="3023536401535417286">"Límit de la llista"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"Aquesta acció tancarà l\'aplicació, i quan la tornis a obrir farà la precàrrega d\'una pantalla de permisos"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"Finalitza la demostració de l\'aplicació"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"Demostració de precàrrega de la pantalla de permisos en l\'execució següent"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"Demostració de precàrrega de l\'aplicació de permisos"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"Demostració de precàrrega de la pantalla de permisos en l\'execució següent"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"S\'està carregant la demostració"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"Càrrega completada"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"Ves a l\'arrel"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Amfitrió incompatible"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Demostració d\'una plantilla de missatge"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"El missatge va aquí.\nMés text a la segona línia."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Demostració d\'una plantilla de subfinestra"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Demostració d\'una plantilla de llista de llocs"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Cerca llocs"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Un dibuixable vectorial amb to"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Un dibuixable vectorial amb l\'atribut del tema d\'una aplicació pel seu color"</string>
     <string name="png_res_title" msgid="7437083018336747544">"Un PNG, enviat com a recurs"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"Un PNG, enviat com a recurs"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Només un títol"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Títol amb icona de l\'aplicació"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Títol amb imatge d\'un identificador de recurs"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Demostració de files"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Demostracions de text i icones"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Demostració de files amb text i icones"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Demostració de llistes seleccionables"</string>
     <string name="option_1_title" msgid="7221252541651471199">"Opció 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"Opció 2"</string>
@@ -292,6 +296,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"S\'ha arribat al límit de tasques\nEn continuar es forçarà l\'aturada de l\'aplicació"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Pas de la tasca %1$d de %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Fes clic per anar endavant"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Test de commutació"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Es permeten canvis amb estat"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Activa la prova de commutació"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Prova de commutació desactivada"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Demostracions de plantilles diverses"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Demostracions de Showcase"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"Pantalla de demostració de Voice Access"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"Interaccions dels usuaris"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"Demostracions de sol·licitud de permisos"</string>
+    <string name="perm_group" msgid="3834918337351876270">"Grup de permisos"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"Grup de permisos de l\'aplicació Showcase"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"Accés a la ubicació precisa"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"Permís per accedir a la ubicació precisa"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"Accés a la ubicació aproximada"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"Permís per accedir a la ubicació aproximada"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"Accés a la gravació d\'àudio"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"Permís per accedir a la gravació d\'àudio"</string>
     <string name="location_1_description" msgid="4801052291684791371">"Vector de recursos amb to"</string>
     <string name="location_2_description" msgid="3331356135359047166">"Mapa de bits del recurs d\'imatge"</string>
     <string name="location_3_description" msgid="3982142774088944850">"Marcador de text acolorit"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Mapa de bits de la imatge"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Etiqueta de text"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-cs/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-cs/strings.xml
index dac65be..068f9e6 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-cs/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-cs/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Tento text má zelenou barvu"</string>
     <string name="example_3_text" msgid="977269832109695627">"Tento text má modrou barvu"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Tento text má žlutou barvu"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Tento text používá primární barvu"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Tento text používá sekundární barvu"</string>
     <string name="color_demo" msgid="1822427636476178993">"Ukázka barvy"</string>
     <string name="list_limit" msgid="3023536401535417286">"Omezení seznamu"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"Touto akcí ukončíte aplikaci, a když se do ní vrátíte, předkonfiguruje obrazovku s oprávněním"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"Ukončit ukázku aplikace"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"Ukázka předvyplnění obrazovky oprávnění při dalším spuštění"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"Předvyplnění obrazovky oprávnění – ukázka aplikace"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"Ukázka předvyplnění obrazovky oprávnění při dalším spuštění"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"Načítání ukázky"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"Načítání bylo dokončeno!"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"Přejít do kořene"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Nekompatibilní hostitel"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Ukázka šablony zprávy"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Zde bude zpráva.\nDalší text na druhém řádku."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Ukázka šablony panelu"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Ukázka šablony seznamu míst"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Procházet místa"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Vektorový grafický prvek s tónováním"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Vektorový grafický prvek s atributem barvy z motivu aplikace"</string>
     <string name="png_res_title" msgid="7437083018336747544">"Soubor PNG, odeslán jako zdroj"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"Soubor PNG, odeslán jako zdroj"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Trochu"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Název s ikonou aplikace"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Název s obrázkem ID zdroje"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Ukázka řádků"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Ukázky textu a ikon"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Ukázka řádků s textem a ikonami"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Ukázka seznamů s možností výběru"</string>
     <string name="option_1_title" msgid="7221252541651471199">"Možnost 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"Možnost 2"</string>
@@ -292,6 +296,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Byl dosažen limit úkolů\nPokračováním vynutíte ukončení aplikace"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Krok úkolu %1$d z %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Kliknutím přejdete vpřed"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Test přepínače"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Sledované změny jsou povoleny"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Povolit test přepínače"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Test přepínače byl zakázán"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Ukázky různých šablon"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Ukázky Výběru"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"Ukázka obrazovky pro ovládání hlasem"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"Interakce uživatelů"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"Ukázky žádostí o oprávnění"</string>
+    <string name="perm_group" msgid="3834918337351876270">"Skupina oprávnění"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"Skupina oprávnění pro vystavenou aplikaci"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"Přístup k přesné poloze"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"Oprávnění pro přístup k přesné poloze"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"Přístup k přibližné poloze"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"Oprávnění pro přístup k přibližné poloze"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"Přístup k nahrávání zvuku"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"Oprávnění pro přístup k nahrávání zvuku"</string>
     <string name="location_1_description" msgid="4801052291684791371">"Tónovaný zdroj vektoru"</string>
     <string name="location_2_description" msgid="3331356135359047166">"Rastrový zdroj obrázku"</string>
     <string name="location_3_description" msgid="3982142774088944850">"Barevná značka textu"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Rastrový obrázek"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Textový štítek"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-da/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-da/strings.xml
index 7796fac..c31a838 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-da/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-da/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Denne tekst har farven grøn"</string>
     <string name="example_3_text" msgid="977269832109695627">"Denne tekst har farven blå"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Denne tekst har farven gul"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Den tekst bruger den primære farve"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Den tekst bruger den sekundære farve"</string>
     <string name="color_demo" msgid="1822427636476178993">"Demonstration af farve"</string>
     <string name="list_limit" msgid="3023536401535417286">"Listegrænse"</string>
@@ -232,6 +233,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Inkompatibel host"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Demonstration af beskedskabelon"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Beskeden skal skrives her.\nMere tekst på næste linje."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Demonstration af rudeskabelon"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Demonstration af skabelonen for listen over steder"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Gennemse steder"</string>
@@ -267,7 +270,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Et trækbart vektorelement, med en nuance"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Et trækbart vektorelement, med en apps temaattribut som farve"</string>
     <string name="png_res_title" msgid="7437083018336747544">"En PNG-fil, der er sendt som en ressource"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"En PNG-fil, der er sendt som en ressource"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Bare en titel"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Titel med appikon"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Titel med ressource-id-billede"</string>
@@ -279,6 +283,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Demonstration af rækker"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Demonstrationer af tekst og ikoner"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Demonstration af rækker med tekst og ikoner"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Demonstration af lister, der kan vælges"</string>
     <string name="option_1_title" msgid="7221252541651471199">"Valgmulighed 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"Valgmulighed 2"</string>
@@ -292,6 +298,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Grænsen for opgaver blev nået\nHvis du fortsætter, tvinges appen til at standse"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Opgavetrin %1$d af %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Klik for at gå videre"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Slå test til/fra"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Tilstandsfulde ændringer er tilladt"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Aktivér test af kontakt"</string>
@@ -306,6 +314,10 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Test af kontakt er deaktiveret"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Demonstrationer af diverse skabeloner"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Vis demonstrationer"</string>
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
+    <skip />
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
+    <skip />
     <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
     <skip />
     <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
@@ -333,4 +345,18 @@
     <string name="location_3_description" msgid="3982142774088944850">"Farvet tekstmarkør"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Billedbitmap"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Tekstetiket"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-de/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-de/strings.xml
index 5e178e0..253c92b 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-de/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-de/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Dieser Text ist grün"</string>
     <string name="example_3_text" msgid="977269832109695627">"Dieser Text ist blau"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Dieser Text ist gelb"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Dieser Text verwendet die Primärfarbe"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Dieser Text verwendet die Sekundärfarbe"</string>
     <string name="color_demo" msgid="1822427636476178993">"Farbdemo"</string>
     <string name="list_limit" msgid="3023536401535417286">"Listenbeschränkung"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"Dadurch wird die App geschlossen und beim nächsten Ausführen eine Berechtigungsanfrage eingeblendet"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"App-Demo beenden"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"Beim nächsten Ausführen der Demo Berechtigungsbildschirm voranstellen"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"Beim nächsten Ausführen Demo zu App-Berechtigungen voranstellen"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"Beim nächsten Ausführen der Demo Berechtigungsbildschirm voranstellen"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"Demo wird geladen"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"Ladevorgang abgeschlossen!"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"Zu Stammverzeichnis wechseln"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Inkompatibler Host"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Demo der Nachrichtenvorlage"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Nachricht wird hier angezeigt.\nMehr Text in der zweiten Zeile."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Demo der Bereichsvorlage"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Demo der Ortslistenvorlage"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Orte durchsuchen"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Ein Vektor-Drawable mit einer Färbung"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Ein Vektor-Drawable mit einem App-Designattribut für die Farbe"</string>
     <string name="png_res_title" msgid="7437083018336747544">"Eine PNG wurde als Ressource gesendet"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"Eine PNG wurde als Ressource gesendet"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Nur ein Titel"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Titel mit App-Symbol"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Titel mit Bild für Ressourcen-ID"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Demo der Zeilen"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Demos für Text und Symbole"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Demo der Zeilen mit Text und Symbolen"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Demo der auswählbaren Listen"</string>
     <string name="option_1_title" msgid="7221252541651471199">"Option 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"Option 2"</string>
@@ -292,6 +296,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Aufgabenlimit erreicht\nDurch Fortfahren wird das Beenden der App erzwungen"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Aufgabe: Schritt %1$d von %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Klicken, um fortzufahren"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Test der Ein-/Aus-Schaltfläche"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Zustandsorientierte Änderungen sind erlaubt"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Test der Ein-/Aus-Schaltfläche aktivieren"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Test der Ein-/Aus-Schaltfläche deaktiviert"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Demos der verschiedenen Vorlagen"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Demos anzeigen"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"Bildschirm für Voice Access-Demo"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"Nutzerinteraktionen"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"Demos zur Berechtigungsanfrage"</string>
+    <string name="perm_group" msgid="3834918337351876270">"Berechtigungsgruppe"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"Berechtigungsgruppe für die Showcase App"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"Zugriff auf genauen Standort"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"Berechtigung für Zugriff auf den genauen Standort"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"Zugriff auf ungefähren Standort"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"Berechtigung für Zugriff auf den ungefähren Standort"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"Zugriff für Audioaufnahmen"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"Berechtigung für Zugriff für Audioaufnahmen"</string>
     <string name="location_1_description" msgid="4801052291684791371">"Gefärbter Ressourcenvektor"</string>
     <string name="location_2_description" msgid="3331356135359047166">"Bitmap-Infobild"</string>
     <string name="location_3_description" msgid="3982142774088944850">"Farbige Textmarkierung"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Bitmap-Bild"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Textlabel"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-el/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-el/strings.xml
index d1e430f..af90acc 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-el/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-el/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Αυτό το κείμενο έχει πράσινο χρώμα"</string>
     <string name="example_3_text" msgid="977269832109695627">"Αυτό το κείμενο έχει μπλε χρώμα"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Αυτό το κείμενο έχει κίτρινο χρώμα"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Αυτό το κείμενο χρησιμοποιεί το κύριο χρώμα"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Αυτό το κείμενο χρησιμοποιεί το δευτερεύον χρώμα"</string>
     <string name="color_demo" msgid="1822427636476178993">"Επίδειξη χρωμάτων"</string>
     <string name="list_limit" msgid="3023536401535417286">"Όριο λίστας"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"Αυτή η ενέργεια θα ολοκληρώσει την εφαρμογή και, όταν επιστρέψετε, θα πραγματοποιήσει προκαταρκτικό seed μιας οθόνης άδειας"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"Ολοκλήρωση επίδειξης εφαρμογής"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"Προκαταρκτικό seed της οθόνης αδειών κατά την επόμενη εκτέλεση της επίδειξης"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"Άδεια προκαταρκτικού seed επίδειξης εφαρμογής"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"Προκαταρκτικό seed της οθόνης αδειών κατά την επόμενη εκτέλεση της επίδειξης"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"Φόρτωση επίδειξης"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"Η φόρτωση ολοκληρώθηκε!"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"Μετάβαση στο ριζικό στοιχείο"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Μη συμβατός κεντρικός υπολογιστής"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Επίδειξη προτύπου μηνύματος"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Το μήνυμα τοποθετείται εδώ.\nΠερισσότερο κείμενο στη δεύτερη γραμμή."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Επίδειξη προτύπου πλαισίου"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Επίδειξη προτύπου λίστας μερών"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Περιήγηση σε μέρη"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Ένα διάνυσμα με δυνατότητα σχεδίασης, με απόχρωση"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Ένα διάνυσμα με δυνατότητα σχεδίασης, με το χαρακτηριστικό θέμα μιας εφαρμογής για το χρώμα του"</string>
     <string name="png_res_title" msgid="7437083018336747544">"Ένα PNG που αποστέλλεται ως πόρος"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"Ένα PNG που αποστέλλεται ως πόρος"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Απλώς ένας τίτλος"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Τίτλος με εικονίδιο εφαρμογής"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Τίτλος με εικόνα αναγνωριστικού πόρου"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Επίδειξη σειρών"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Επιδείξεις κειμένου και εικονιδίων"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Επίδειξη σειρών με κείμενο και εικονίδια"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Επίδειξη επιλέξιμων λιστών"</string>
     <string name="option_1_title" msgid="7221252541651471199">"Επιλογή 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"Επιλογή 2"</string>
@@ -292,6 +296,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Συμπληρώθηκε το όριο εργασιών\nΜε μετάβαση προς τα εμπρός, θα γίνει αναγκαστική διακοπή της εφαρμογής."</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Βήμα εργασίας %1$d από %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Κάντε κλικ για μετάβαση εμπρός"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Εναλλαγή δοκιμής"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Επιτρέπονται οι αλλαγές με επίβλεψη κατάστασης"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Ενεργοποίηση εναλλαγής δοκιμής"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Η εναλλαγή δοκιμής απενεργοποιήθηκε"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Διάφορες επιδείξεις προτύπων"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Προβολή επιδείξεων"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"Οθόνη επίδειξης Voice Access"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"Αλληλεπιδράσεις χρήστη"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"Αίτημα για επιδείξεις αδειών"</string>
+    <string name="perm_group" msgid="3834918337351876270">"Ομάδα αδειών"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"Ομάδα αδειών για την εφαρμογή Showcase"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"Πρόσβαση στην Ακριβή τοποθεσία"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"Άδεια για πρόσβαση στην Ακριβή τοποθεσία"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"Πρόσβαση στην Τοποθεσία κατά προσέγγιση"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"Άδεια για πρόσβαση στην Τοποθεσία κατά προσέγγιση"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"Πρόσβαση στην Εγγραφή ήχου"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"Άδεια για την πρόσβαση στην Εγγραφή ήχου"</string>
     <string name="location_1_description" msgid="4801052291684791371">"Διάνυσμα πόρου με απόχρωση"</string>
     <string name="location_2_description" msgid="3331356135359047166">"Χάρτης bit πόρων εικόνας"</string>
     <string name="location_3_description" msgid="3982142774088944850">"Έγχρωμος δείκτης κειμένου"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Χάρτης bit εικόνας"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Ετικέτα κειμένου"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-en-rAU/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-en-rAU/strings.xml
index 9511ae5..0481143 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-en-rAU/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-en-rAU/strings.xml
@@ -100,7 +100,7 @@
     <string name="example_2_text" msgid="718820705318661440">"This text has a green colour"</string>
     <string name="example_3_text" msgid="977269832109695627">"This text has a blue colour"</string>
     <string name="example_4_text" msgid="2043547015979437373">"This text has a yellow colour"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"This text uses the primary colour"</string>
+    <string name="example_5_text" msgid="8828804968749423500">"This text uses the primary colour"</string>
     <string name="example_6_text" msgid="7991523168517599600">"This text uses the secondary colour"</string>
     <string name="color_demo" msgid="1822427636476178993">"Colour demo"</string>
     <string name="list_limit" msgid="3023536401535417286">"List limit"</string>
@@ -113,10 +113,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"This will finish the app, and when you return it will pre-seed a permission screen"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"Finish app demo"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"Pre-seed the permission screen on next run demo"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"Pre-seed permission app demo"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"Pre-seed the permission screen on next run demo"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"Loading demo"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"Loading complete!"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"Pop to root"</string>
@@ -232,6 +230,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Incompatible host"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Message template demo"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Message goes here.\nMore text on second line."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Pane template demo"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Place list template demo"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Browse places"</string>
@@ -267,7 +267,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"A vector drawable, with a tint"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"A vector drawable, with an app\'s theme attribute for its colour"</string>
     <string name="png_res_title" msgid="7437083018336747544">"A PNG, sent as a resource"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"A PNG, sent as a resource"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Just a title"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Title with app icon"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Title with resource ID image"</string>
@@ -279,6 +280,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Rows demo"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Text and icons demos"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Rows with text and icons demo"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Selectable lists demo"</string>
     <string name="option_1_title" msgid="7221252541651471199">"Option 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"Option 2"</string>
@@ -292,6 +295,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Task limit reached\nGoing forward will force stop the app"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Task step %1$d of %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Click to go forward"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Toggle test"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Stateful changes are allowed"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Enable toggle test"</string>
@@ -306,31 +311,32 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Toggle test disabled"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Misc templates demos"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Showcase demos"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"Voice Access demo screen"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"User interactions"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"Request permissions demos"</string>
+    <string name="perm_group" msgid="3834918337351876270">"Permission group"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"Permission group for Showcase app"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"Access to fine location"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"Permission for access to fine location"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"Access to coarse location"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"Permission for access to coarse location"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"Access to record audio"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"Permission for access to record audio"</string>
     <string name="location_1_description" msgid="4801052291684791371">"Tinted resource vector"</string>
     <string name="location_2_description" msgid="3331356135359047166">"Image resource bitmap"</string>
     <string name="location_3_description" msgid="3982142774088944850">"Coloured text marker"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Image bitmap"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Text label"</string>
+    <string name="parking_vs_driving_demo_title" msgid="3367862800135053111">"Parking vs driving demo"</string>
+    <string name="latest_feature_details" msgid="6843008350392721502">"Cluster displays in cars!"</string>
+    <string name="latest_feature_title" msgid="7929405790070777460">"Latest features"</string>
+    <string name="loading_toggle_enabled" msgid="8828072732804454994">"Loading enabled"</string>
+    <string name="loading_toggle_disabled" msgid="7689738885077382673">"Loading disabled"</string>
+    <string name="loading_screen" msgid="4771507490730308794">"Loading screen"</string>
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-en-rCA/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-en-rCA/strings.xml
index 9511ae5..0481143 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-en-rCA/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-en-rCA/strings.xml
@@ -100,7 +100,7 @@
     <string name="example_2_text" msgid="718820705318661440">"This text has a green colour"</string>
     <string name="example_3_text" msgid="977269832109695627">"This text has a blue colour"</string>
     <string name="example_4_text" msgid="2043547015979437373">"This text has a yellow colour"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"This text uses the primary colour"</string>
+    <string name="example_5_text" msgid="8828804968749423500">"This text uses the primary colour"</string>
     <string name="example_6_text" msgid="7991523168517599600">"This text uses the secondary colour"</string>
     <string name="color_demo" msgid="1822427636476178993">"Colour demo"</string>
     <string name="list_limit" msgid="3023536401535417286">"List limit"</string>
@@ -113,10 +113,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"This will finish the app, and when you return it will pre-seed a permission screen"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"Finish app demo"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"Pre-seed the permission screen on next run demo"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"Pre-seed permission app demo"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"Pre-seed the permission screen on next run demo"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"Loading demo"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"Loading complete!"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"Pop to root"</string>
@@ -232,6 +230,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Incompatible host"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Message template demo"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Message goes here.\nMore text on second line."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Pane template demo"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Place list template demo"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Browse places"</string>
@@ -267,7 +267,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"A vector drawable, with a tint"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"A vector drawable, with an app\'s theme attribute for its colour"</string>
     <string name="png_res_title" msgid="7437083018336747544">"A PNG, sent as a resource"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"A PNG, sent as a resource"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Just a title"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Title with app icon"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Title with resource ID image"</string>
@@ -279,6 +280,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Rows demo"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Text and icons demos"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Rows with text and icons demo"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Selectable lists demo"</string>
     <string name="option_1_title" msgid="7221252541651471199">"Option 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"Option 2"</string>
@@ -292,6 +295,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Task limit reached\nGoing forward will force stop the app"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Task step %1$d of %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Click to go forward"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Toggle test"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Stateful changes are allowed"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Enable toggle test"</string>
@@ -306,31 +311,32 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Toggle test disabled"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Misc templates demos"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Showcase demos"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"Voice Access demo screen"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"User interactions"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"Request permissions demos"</string>
+    <string name="perm_group" msgid="3834918337351876270">"Permission group"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"Permission group for Showcase app"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"Access to fine location"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"Permission for access to fine location"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"Access to coarse location"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"Permission for access to coarse location"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"Access to record audio"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"Permission for access to record audio"</string>
     <string name="location_1_description" msgid="4801052291684791371">"Tinted resource vector"</string>
     <string name="location_2_description" msgid="3331356135359047166">"Image resource bitmap"</string>
     <string name="location_3_description" msgid="3982142774088944850">"Coloured text marker"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Image bitmap"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Text label"</string>
+    <string name="parking_vs_driving_demo_title" msgid="3367862800135053111">"Parking vs driving demo"</string>
+    <string name="latest_feature_details" msgid="6843008350392721502">"Cluster displays in cars!"</string>
+    <string name="latest_feature_title" msgid="7929405790070777460">"Latest features"</string>
+    <string name="loading_toggle_enabled" msgid="8828072732804454994">"Loading enabled"</string>
+    <string name="loading_toggle_disabled" msgid="7689738885077382673">"Loading disabled"</string>
+    <string name="loading_screen" msgid="4771507490730308794">"Loading screen"</string>
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-en-rGB/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-en-rGB/strings.xml
index 9511ae5..0481143 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-en-rGB/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-en-rGB/strings.xml
@@ -100,7 +100,7 @@
     <string name="example_2_text" msgid="718820705318661440">"This text has a green colour"</string>
     <string name="example_3_text" msgid="977269832109695627">"This text has a blue colour"</string>
     <string name="example_4_text" msgid="2043547015979437373">"This text has a yellow colour"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"This text uses the primary colour"</string>
+    <string name="example_5_text" msgid="8828804968749423500">"This text uses the primary colour"</string>
     <string name="example_6_text" msgid="7991523168517599600">"This text uses the secondary colour"</string>
     <string name="color_demo" msgid="1822427636476178993">"Colour demo"</string>
     <string name="list_limit" msgid="3023536401535417286">"List limit"</string>
@@ -113,10 +113,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"This will finish the app, and when you return it will pre-seed a permission screen"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"Finish app demo"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"Pre-seed the permission screen on next run demo"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"Pre-seed permission app demo"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"Pre-seed the permission screen on next run demo"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"Loading demo"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"Loading complete!"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"Pop to root"</string>
@@ -232,6 +230,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Incompatible host"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Message template demo"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Message goes here.\nMore text on second line."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Pane template demo"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Place list template demo"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Browse places"</string>
@@ -267,7 +267,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"A vector drawable, with a tint"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"A vector drawable, with an app\'s theme attribute for its colour"</string>
     <string name="png_res_title" msgid="7437083018336747544">"A PNG, sent as a resource"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"A PNG, sent as a resource"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Just a title"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Title with app icon"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Title with resource ID image"</string>
@@ -279,6 +280,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Rows demo"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Text and icons demos"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Rows with text and icons demo"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Selectable lists demo"</string>
     <string name="option_1_title" msgid="7221252541651471199">"Option 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"Option 2"</string>
@@ -292,6 +295,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Task limit reached\nGoing forward will force stop the app"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Task step %1$d of %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Click to go forward"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Toggle test"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Stateful changes are allowed"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Enable toggle test"</string>
@@ -306,31 +311,32 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Toggle test disabled"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Misc templates demos"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Showcase demos"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"Voice Access demo screen"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"User interactions"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"Request permissions demos"</string>
+    <string name="perm_group" msgid="3834918337351876270">"Permission group"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"Permission group for Showcase app"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"Access to fine location"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"Permission for access to fine location"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"Access to coarse location"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"Permission for access to coarse location"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"Access to record audio"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"Permission for access to record audio"</string>
     <string name="location_1_description" msgid="4801052291684791371">"Tinted resource vector"</string>
     <string name="location_2_description" msgid="3331356135359047166">"Image resource bitmap"</string>
     <string name="location_3_description" msgid="3982142774088944850">"Coloured text marker"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Image bitmap"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Text label"</string>
+    <string name="parking_vs_driving_demo_title" msgid="3367862800135053111">"Parking vs driving demo"</string>
+    <string name="latest_feature_details" msgid="6843008350392721502">"Cluster displays in cars!"</string>
+    <string name="latest_feature_title" msgid="7929405790070777460">"Latest features"</string>
+    <string name="loading_toggle_enabled" msgid="8828072732804454994">"Loading enabled"</string>
+    <string name="loading_toggle_disabled" msgid="7689738885077382673">"Loading disabled"</string>
+    <string name="loading_screen" msgid="4771507490730308794">"Loading screen"</string>
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-en-rIN/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-en-rIN/strings.xml
index 9511ae5..0481143 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-en-rIN/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-en-rIN/strings.xml
@@ -100,7 +100,7 @@
     <string name="example_2_text" msgid="718820705318661440">"This text has a green colour"</string>
     <string name="example_3_text" msgid="977269832109695627">"This text has a blue colour"</string>
     <string name="example_4_text" msgid="2043547015979437373">"This text has a yellow colour"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"This text uses the primary colour"</string>
+    <string name="example_5_text" msgid="8828804968749423500">"This text uses the primary colour"</string>
     <string name="example_6_text" msgid="7991523168517599600">"This text uses the secondary colour"</string>
     <string name="color_demo" msgid="1822427636476178993">"Colour demo"</string>
     <string name="list_limit" msgid="3023536401535417286">"List limit"</string>
@@ -113,10 +113,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"This will finish the app, and when you return it will pre-seed a permission screen"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"Finish app demo"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"Pre-seed the permission screen on next run demo"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"Pre-seed permission app demo"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"Pre-seed the permission screen on next run demo"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"Loading demo"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"Loading complete!"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"Pop to root"</string>
@@ -232,6 +230,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Incompatible host"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Message template demo"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Message goes here.\nMore text on second line."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Pane template demo"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Place list template demo"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Browse places"</string>
@@ -267,7 +267,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"A vector drawable, with a tint"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"A vector drawable, with an app\'s theme attribute for its colour"</string>
     <string name="png_res_title" msgid="7437083018336747544">"A PNG, sent as a resource"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"A PNG, sent as a resource"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Just a title"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Title with app icon"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Title with resource ID image"</string>
@@ -279,6 +280,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Rows demo"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Text and icons demos"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Rows with text and icons demo"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Selectable lists demo"</string>
     <string name="option_1_title" msgid="7221252541651471199">"Option 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"Option 2"</string>
@@ -292,6 +295,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Task limit reached\nGoing forward will force stop the app"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Task step %1$d of %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Click to go forward"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Toggle test"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Stateful changes are allowed"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Enable toggle test"</string>
@@ -306,31 +311,32 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Toggle test disabled"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Misc templates demos"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Showcase demos"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"Voice Access demo screen"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"User interactions"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"Request permissions demos"</string>
+    <string name="perm_group" msgid="3834918337351876270">"Permission group"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"Permission group for Showcase app"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"Access to fine location"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"Permission for access to fine location"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"Access to coarse location"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"Permission for access to coarse location"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"Access to record audio"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"Permission for access to record audio"</string>
     <string name="location_1_description" msgid="4801052291684791371">"Tinted resource vector"</string>
     <string name="location_2_description" msgid="3331356135359047166">"Image resource bitmap"</string>
     <string name="location_3_description" msgid="3982142774088944850">"Coloured text marker"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Image bitmap"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Text label"</string>
+    <string name="parking_vs_driving_demo_title" msgid="3367862800135053111">"Parking vs driving demo"</string>
+    <string name="latest_feature_details" msgid="6843008350392721502">"Cluster displays in cars!"</string>
+    <string name="latest_feature_title" msgid="7929405790070777460">"Latest features"</string>
+    <string name="loading_toggle_enabled" msgid="8828072732804454994">"Loading enabled"</string>
+    <string name="loading_toggle_disabled" msgid="7689738885077382673">"Loading disabled"</string>
+    <string name="loading_screen" msgid="4771507490730308794">"Loading screen"</string>
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-en-rXC/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-en-rXC/strings.xml
index cdb08f4..d3078ea 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-en-rXC/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-en-rXC/strings.xml
@@ -100,7 +100,7 @@
     <string name="example_2_text" msgid="718820705318661440">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‎‎‏‏‏‏‏‏‎‎‏‏‏‎‎‎‎‏‏‏‎‎‏‏‏‏‏‎‏‏‏‏‏‎‏‏‎‏‏‎‏‏‎‏‏‏‎‏‏‎‏‎‏‎‎‎‎‎‎‎This text has a green color‎‏‎‎‏‎"</string>
     <string name="example_3_text" msgid="977269832109695627">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‏‏‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‏‏‏‎‎‎‎‎‎‏‎‎‎‏‎‎‏‏‎‏‎‏‎‏‎‎‎‏‎‏‎‎‎‏‎‏‏‎This text has a blue color‎‏‎‎‏‎"</string>
     <string name="example_4_text" msgid="2043547015979437373">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‎‏‎‏‏‏‎‎‎‎‏‎‎‎‏‏‎‎‏‎‏‏‏‏‎‎‎‏‎‎‎‏‎‏‎‎‎‎‏‏‏‎‎‎‏‏‎‏‎‎‏‏‏‏‎‏‎This text has a yellow color‎‏‎‎‏‎"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‏‏‎‎‏‏‏‎‎‏‎‎‏‏‎‎‏‏‏‏‎‏‎‎‎‎‏‏‎‏‎‏‎‏‎‎‏‎‎‏‎‏‎‏‏‎‏‏‎‏‎‎‏‏‎‏‎‎‎‎‎This text uses the primary colo‎‏‎‎‏‎"</string>
+    <string name="example_5_text" msgid="8828804968749423500">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‎‏‏‎‎‎‏‏‎‏‏‏‎‏‎‏‎‏‏‏‏‎‎‏‎‎‎‏‏‎‎‎‎‎‏‏‎‏‎‏‏‎‏‏‏‎‎‎‏‏‎‎‎This text uses the primary color‎‏‎‎‏‎"</string>
     <string name="example_6_text" msgid="7991523168517599600">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‏‏‎‎‏‏‏‏‎‎‏‎‏‏‏‏‏‏‏‏‎‏‏‎‎‎‏‏‎‎‏‏‏‎‎‏‎‏‏‏‎‏‏‎‎‎‏‎‏‏‏‎‎‎‎‎This text uses the secondary color‎‏‎‎‏‎"</string>
     <string name="color_demo" msgid="1822427636476178993">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‎‏‎‏‎‎‏‎‏‎‏‎‎‏‎‎‎‎‎‏‎‎‎‏‏‏‏‎‎‏‏‏‎‏‎‎‎‎‎‏‎‎‎‏‏‏‎‎‏‎‎‎‏‏‎‎‎‏‎Color Demo‎‏‎‎‏‎"</string>
     <string name="list_limit" msgid="3023536401535417286">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‎‎‏‏‏‏‏‎‏‎‏‏‏‎‎‎‎‏‎‎‏‎‏‎‏‏‎‎‏‏‏‏‎‏‎‏‏‏‏‏‎‏‏‎‎‏‏‏‎‏‏‏‏‎‎‎‏‏‎‎List Limit‎‏‎‎‏‎"</string>
@@ -230,6 +230,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‏‏‎‏‎‏‏‎‏‏‏‏‏‎‎‏‎‎‏‏‎‎‏‎‏‎‎‎‏‎‎‎‏‏‏‎‎‏‏‏‏‏‎‏‏‏‏‎‏‎‎‏‏‎‏‏‎‏‎Incompatible host‎‏‎‎‏‎"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‎‎‎‎‎‏‏‏‎‏‎‎‏‎‎‎‏‏‎‏‏‏‎‎‎‏‏‏‏‎‏‏‏‏‏‎‏‏‎‏‏‎‏‎‎‎‎‏‎‏‎‎‎‎‎‎‏‎Message Template Demo‎‏‎‎‏‎"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‏‏‏‎‎‏‎‎‏‏‎‏‏‏‎‏‎‏‏‎‏‎‏‎‏‏‏‏‎‏‏‎‏‎‎‏‏‎‎‏‎‏‎‏‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎Message goes here.‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎More text on second line.‎‏‎‎‏‎"</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‎‎‎‏‎‎‏‏‏‎‎‏‏‎‏‎‏‎‏‏‎‎‎‏‎‏‎‏‎‏‎‏‎‏‏‏‎‎‏‏‏‎‎‏‏‎‏‏‎‏‎‏‏‎‏‎‎‎‎Pane Template Demo‎‏‎‎‏‎"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‏‎‎‏‎‎‎‎‎‎‏‎‏‎‏‏‎‏‏‎‎‎‎‎‏‎‏‏‏‎‎‏‎‎‎‏‎‎‎‏‏‏‏‎‏‏‎‎‎‎‎‎‏‏‏‎‏‎‏‎Place List Template Demo‎‏‎‎‏‎"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‎‏‎‎‎‏‏‏‎‏‏‏‏‏‎‏‏‏‏‏‏‏‎‏‏‏‏‏‎‏‎‎‎‏‏‎‎‏‎‏‏‎‏‏‎‏‏‎‏‏‏‏‏‏‎‏‎‎Browse Places‎‏‎‎‏‎"</string>
@@ -265,7 +267,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‏‎‎‎‏‏‎‎‎‎‎‎‎‏‏‎‏‎‏‎‏‎‎‏‏‎‏‏‏‏‎‏‏‏‎‏‎‏‎‏‏‏‎‏‏‎‏‎‎‏‎‎‏‏‏‎‏‏‎A vector drawable, with a tint‎‏‎‎‏‎"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‏‏‏‎‏‏‏‎‏‎‎‎‏‏‎‏‏‎‎‎‎‎‏‎‏‏‏‏‎‏‏‏‏‏‏‏‎‏‏‏‎‎‎‏‎‏‎‏‎‏‎‎‏‏‎‏‏‎A vector drawable, with an app\'s theme attribute for its color‎‏‎‎‏‎"</string>
     <string name="png_res_title" msgid="7437083018336747544">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‏‏‎‎‏‏‎‏‎‏‏‏‎‏‎‎‏‏‏‎‎‏‏‎‏‎‎‎‎‏‎‎‎‏‎‎‎‎‏‏‎‏‎‏‎‎‎‎‎‎‎‎‎‏‏‎‎‎‎A PNG, sent as a resource‎‏‎‎‏‎"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‎‏‏‏‎‏‎‏‏‎‏‎‎‏‎‎‎‏‎‎‎‎‏‎‎‎‎‏‎‏‏‏‎‎‏‏‎‏‎‎‏‎‏‏‎‏‎‏‏‎‏‎‎‏‎‎‎‏‏‎A PNG, sent as a resource‎‏‎‎‏‎"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‏‎‏‏‎‎‏‏‎‏‏‎‏‏‎‏‏‎‎‎‎‏‏‎‏‏‎‎‏‏‎‎‏‎‎‏‏‎‏‎‎‏‎‎‏‏‏‏‏‏‏‏‎‎‏‎‏‎Just a title‎‏‎‎‏‎"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‏‎‏‎‏‏‎‎‏‏‎‏‎‏‎‏‏‏‎‏‎‏‏‎‏‎‏‎‎‎‎‎‎‎‎‏‎‎‎‏‏‏‎‎‎‎‏‎‏‏‎‏‎‏‎‎‎‎Title with app icon‎‏‎‎‏‎"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‎‏‏‏‎‏‎‏‎‏‏‏‏‏‎‎‏‏‏‏‏‏‏‏‎‎‎‏‎‏‏‎‏‎‏‏‏‏‏‏‏‎‏‎‏‎‏‏‏‏‎‎‎‎‎‏‎‎Title with resource ID image‎‏‎‎‏‎"</string>
@@ -277,6 +280,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‎‎‎‏‏‎‎‎‏‏‏‎‎‏‎‏‏‏‎‏‏‎‏‏‏‎‎‏‎‏‎‎‏‎‏‏‎‎‏‎‎‎‎‏‏‏‏‎‎‏‏‏‏‏‏‏‏‏‎Rows Demo‎‏‎‎‏‎"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‎‏‎‎‏‏‎‎‎‏‏‎‏‎‎‏‏‎‎‎‏‏‏‎‏‎‎‎‎‎‏‎‏‏‎‎‎‏‎‎‎‏‏‏‏‏‎‏‏‏‎‏‏‎‎‎‎‏‎Text and Icons Demos‎‏‎‎‏‎"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‎‎‏‏‏‏‏‎‎‎‎‎‎‎‏‏‎‏‏‎‎‏‎‎‏‏‎‏‎‎‏‏‎‏‎‎‏‏‎‎‏‏‏‏‏‎‏‏‏‎‎‎‎‎‏‎‏‎‎‏‎Rows with Text and Icons Demo‎‏‎‎‏‎"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‏‏‎‎‎‎‏‏‏‎‎‏‏‏‎‏‏‎‎‎‎‎‎‎‎‎‏‏‏‎‏‏‏‏‎‎‎‏‏‏‎‎‏‎‎‎‏‎‎‏‎‏‏‎‏‎‏‎‏‎‎Selectable Lists Demo‎‏‎‎‏‎"</string>
     <string name="option_1_title" msgid="7221252541651471199">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‎‏‎‎‎‎‏‏‎‏‏‏‎‎‎‎‏‎‏‎‏‏‏‎‏‏‎‏‎‏‎‎‎‎‏‎‏‎‎‎‎‏‎‏‏‏‎‎‏‎‏‏‎‏‎‏‏‏‏‏‎Option 1‎‏‎‎‏‎"</string>
     <string name="option_2_title" msgid="1905146448697963818">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‏‎‏‎‎‏‏‏‎‎‎‎‎‏‏‏‎‎‎‎‏‎‎‏‏‎‎‏‏‏‏‎‎‏‏‏‏‎‏‏‏‏‎‏‎‎‏‏‎‏‎‏‎‎‏‎‏‎‏‎‎Option 2‎‏‎‎‏‎"</string>
@@ -290,6 +295,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‎‏‏‏‏‎‎‏‏‎‏‏‏‏‏‏‏‏‏‎‏‎‎‏‎‎‏‏‎‎‎‏‏‏‏‎‏‏‎‎‏‎‎‎‏‏‎‎‎‏‎‏‎‎‎‎‏‎‎‎Task limit reached‎‏‎‎‏‏‎\n‎‏‎‎‏‏‏‎Going forward will force stop the app‎‏‎‎‏‎"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‎‏‎‏‏‏‏‏‎‎‎‏‎‏‏‎‎‏‎‏‏‎‎‏‎‎‎‎‏‏‏‏‎‎‎‎‎‎‏‎‎‏‏‏‎‎‎‏‏‎‎‏‏‏‏‏‏‎Task step %1$d of %2$d‎‏‎‎‏‎"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‎‎‎‏‏‏‏‏‎‎‏‎‎‎‎‎‎‎‎‎‎‏‏‏‎‏‏‏‏‎‎‏‏‏‎‏‎‎‏‎‎‎‏‏‎‏‏‎‎‏‎‎‎‏‎‎‏‏‎Click to go forward‎‏‎‎‏‎"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‎‏‏‎‎‏‏‎‏‎‏‎‎‎‏‏‎‏‏‏‎‎‏‏‏‎‎‏‏‎‏‎‏‎‏‎‏‏‎‎‎‎‏‎‎‏‏‏‎‏‎‎‏‏‎‏‎‎‏‏‏‎Toggle test‎‏‎‎‏‎"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‎‎‎‏‎‏‎‎‏‏‏‏‏‎‎‎‏‏‎‏‎‏‎‏‎‎‏‎‏‎‏‏‎‎‏‏‏‏‎‏‎‎‎‏‏‎‏‎‏‏‎‎‏‎Stateful changes are allowed‎‏‎‎‏‎"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‎‏‎‎‏‏‏‎‎‏‎‎‎‏‏‎‎‎‏‎‏‏‎‏‏‏‎‏‏‎‎‎‏‎‏‏‎‎‎‏‏‏‏‏‏‏‎‎‏‏‏‏‎‏‏‎‎‎‎‎Enable Toggle Test‎‏‎‎‏‎"</string>
@@ -304,6 +311,10 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‎‏‎‎‎‎‎‏‏‎‏‎‎‎‏‎‎‏‎‏‏‎‏‎‎‏‏‏‎‏‎‏‎‏‎‎‏‏‏‎‏‎‎‏‎‎‏‎‏‏‏‎‎‏‎‏‎‎‎‎‎Toggle Test Disabled‎‏‎‎‏‎"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‏‎‏‎‏‏‎‎‏‏‏‎‎‎‏‎‎‎‎‎‏‎‎‎‏‎‎‎‎‎‎‎‏‎‏‎‎‎‏‎‎‎‏‏‎‏‏‎‎‏‏‎‎‏‎‎Misc Templates Demos‎‏‎‎‏‎"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‏‎‏‎‏‏‎‎‏‏‎‏‎‎‏‏‏‎‏‎‎‏‎‎‎‎‏‎‎‎‏‎‏‏‏‏‎‏‏‎‎‏‏‏‏‎‎‏‎‎‎‎‎‎‏‏‎‎‎‎Showcase Demos‎‏‎‎‏‎"</string>
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
+    <skip />
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
+    <skip />
     <string name="voice_access_demo_title" msgid="3825223890895361496">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‎‏‎‎‎‏‎‏‎‏‏‏‏‎‏‏‎‎‏‏‎‏‏‏‎‎‏‎‏‎‎‎‏‏‎‎‏‎‎‏‏‏‏‏‎‏‎‏‎‏‏‏‎‏‏‎‎‎‎Voice Access Demo Screen‎‏‎‎‏‎"</string>
     <string name="user_interactions_demo_title" msgid="1356952319161314986">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‎‏‏‎‎‏‎‏‏‎‏‎‏‎‎‏‏‎‏‏‏‎‎‏‏‏‏‎‎‎‏‏‏‏‎‎‎‎‎‏‏‎‎‎‎‎‎‏‎‏‎‏‏‏‎‏‎‏‎‏‎‏‎‎User Interactions‎‏‎‎‏‎"</string>
     <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‏‎‎‏‎‎‎‎‏‎‎‎‏‎‏‏‎‏‎‏‎‎‎‎‎‎‏‎‎‏‏‏‏‎‎‏‎‏‏‎‏‏‏‏‎‎‏‏‏‏‎‎‏‎‎‏‎Request Permissions Demos‎‏‎‎‏‎"</string>
@@ -320,4 +331,12 @@
     <string name="location_3_description" msgid="3982142774088944850">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‏‎‏‏‏‎‏‎‎‎‎‏‏‎‏‏‎‏‎‎‏‏‏‎‎‎‎‎‏‎‎‏‏‎‏‏‎‎‏‏‏‎‏‎‏‏‏‎‎‏‏‎‎‏‏‎‏‎‎‏‎‎Colored text marker‎‏‎‎‏‎"</string>
     <string name="location_4_description" msgid="6560365445044381911">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‎‏‏‎‎‎‎‏‎‏‏‎‎‎‏‏‎‎‏‏‎‎‏‏‏‎‏‎‎‏‎‏‏‎‎‏‎‎‏‏‏‏‎‎‎‏‎‏‎‎‎‏‏‎‏‎‏‏‏‎Image bitmap‎‏‎‎‏‎"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‎‏‏‎‏‎‎‏‎‏‎‎‎‎‏‏‏‎‏‎‏‏‎‏‎‎‏‎‎‏‏‎‎‏‎‏‏‎‎‏‏‏‎‎‏‏‎‎‏‎‏‏‏‏‎‎‎‎‏‏‎Text label‎‏‎‎‏‎"</string>
+    <string name="parking_vs_driving_demo_title" msgid="3367862800135053111">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‎‏‎‏‏‏‎‏‎‏‏‏‏‎‏‎‎‎‎‏‏‎‏‎‏‎‏‏‏‏‏‎‏‏‏‏‏‏‎‎‏‎‎‏‏‎‏‎‏‎‏‏‏‏‏‎‎‏‏‎‏‏‏‎Parking Vs Driving Demo‎‏‎‎‏‎"</string>
+    <string name="latest_feature_details" msgid="6843008350392721502">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‏‏‏‏‎‏‏‏‏‎‏‏‏‎‎‏‏‏‏‏‏‏‏‎‏‎‏‏‎‏‏‎‎‎‎‎‎‎‎‏‏‎‎‎‎‏‎‏‎‎‎‎‎‎‏‎‏‏‏‏‎‎Cluster Displays in cars!‎‏‎‎‏‎"</string>
+    <string name="latest_feature_title" msgid="7929405790070777460">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‏‏‎‎‎‎‎‏‎‏‎‏‏‏‎‏‎‎‎‏‎‎‎‏‏‎‏‏‏‏‎‎‏‎‏‎‎‎‏‏‎‎‎‎‎‏‎‎‏‏‎‎‏‏‏‎‏‎‎‎Latest Features‎‏‎‎‏‎"</string>
+    <string name="loading_toggle_enabled" msgid="8828072732804454994">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‏‏‎‏‎‏‎‎‎‎‎‏‏‏‎‎‏‏‏‎‏‎‏‏‎‎‎‎‎‏‎‎‏‏‎‏‎‎‎‎‏‏‏‏‏‎‎‎‏‏‎‏‎‎‏‎‏‎‎‏‎‎Loading enabled‎‏‎‎‏‎"</string>
+    <string name="loading_toggle_disabled" msgid="7689738885077382673">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‏‎‏‎‏‎‏‎‏‏‎‏‏‏‎‏‏‏‎‎‎‎‏‏‎‎‎‏‏‎‎‎‏‎‎‏‎‎‏‎‎‎‏‎‏‏‏‎‏‏‎‏‏‎‎‎‎‏‎‎‎‏‎Loading disabled‎‏‎‎‏‎"</string>
+    <string name="loading_screen" msgid="4771507490730308794">"‎‏‎‎‎‎‎‏‎‏‏‏‎‎‎‎‎‎‏‎‎‏‎‎‎‎‏‏‏‏‏‏‏‏‎‎‎‎‏‎‎‎‏‏‎‏‏‏‏‏‎‎‏‏‎‎‏‏‎‎‏‎‎‎‎‏‎‎‎‏‎‎‎‎‎‏‏‎‎‎‎‏‏‏‎‏‎‎‏‎‏‏‏‎‏‎‎Loading screen‎‏‎‎‏‎"</string>
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-es-rUS/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-es-rUS/strings.xml
index 95373e1..99c3cbaf 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-es-rUS/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-es-rUS/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Este texto es de color verde"</string>
     <string name="example_3_text" msgid="977269832109695627">"Este texto es de color azul"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Este texto es de color amarillo"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Este texto usa colores primarios"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Este texto usa colores secundarios"</string>
     <string name="color_demo" msgid="1822427636476178993">"Demostración de color"</string>
     <string name="list_limit" msgid="3023536401535417286">"Límite de la lista"</string>
@@ -232,6 +233,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Host no compatible"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Demostración de plantilla de mensajes"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"El mensaje se muestra aquí.\nEn la segunda línea, aparece texto adicional."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Demostración de la plantilla de panel"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Demostración de la plantilla de la lista de lugares"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Explorar lugares"</string>
@@ -267,7 +270,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Un elemento de diseño vectorial, con tono"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Un elemento de diseño vectorial, con el color correspondiente a un atributo del tema de la app"</string>
     <string name="png_res_title" msgid="7437083018336747544">"Un archivo PNG, enviado como recurso"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"Un archivo PNG, enviado como recurso"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Solo un título"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Título con el ícono de la app"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Título con la imagen del ID de recurso"</string>
@@ -279,6 +283,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Demostración de filas"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Demostraciones de texto e íconos"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Demostración de filas con texto e íconos"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Demostración de las listas seleccionables"</string>
     <string name="option_1_title" msgid="7221252541651471199">"Opción 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"Opción 2"</string>
@@ -292,6 +298,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Se alcanzó el límite de tareas\nSi avanzas, se forzará la detención de la app"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Paso %1$d de %2$d de la tarea"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Haz clic para avanzar"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Prueba el botón de activación"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Se permiten los cambios con estado"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Habilitar prueba del botón de activación"</string>
@@ -306,6 +314,10 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Prueba del botón de activación desactivada"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Demostraciones de plantillas varias"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Demostraciones de Showcase"</string>
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
+    <skip />
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
+    <skip />
     <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
     <skip />
     <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
@@ -333,4 +345,18 @@
     <string name="location_3_description" msgid="3982142774088944850">"Marcador de texto en color"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Mapa de bits de la imagen"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Etiqueta de texto"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-es/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-es/strings.xml
index bdb249c..7c8a115 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-es/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-es/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Este texto es de color verde"</string>
     <string name="example_3_text" msgid="977269832109695627">"Este texto es de color azul"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Este texto es de color amarillo"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Este texto usa el color principal"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Este texto usa el color secundario"</string>
     <string name="color_demo" msgid="1822427636476178993">"Demo de color"</string>
     <string name="list_limit" msgid="3023536401535417286">"Límite de lista"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"Esta acción cerrará la aplicación y, cuando la vuelvas a abrir, precargará una pantalla de permisos"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"Finalizar demo de la aplicación"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"Precarga la pantalla de permisos en el siguiente inicio de la demo"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"Precarga la aplicación de permisos de la demo"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"Precarga la pantalla de permisos en el siguiente inicio de la demo"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"Cargando demo"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"Carga completa"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"Ir a la raíz"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Host no compatible"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Demo de plantilla de mensaje"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"El mensaje va aquí.\nMás texto en la segunda línea."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Demo de plantilla de panel"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Demo de plantilla de la lista de lugares"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Ver lugares"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Un dibujable de vector con ajuste de tono"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Un dibujable de vector con un atributo de tema de la aplicación para su color"</string>
     <string name="png_res_title" msgid="7437083018336747544">"Un archivo PNG, enviado como recurso"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"Un archivo PNG, enviado como recurso"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Solo un título"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Título con icono de la aplicación"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Título con imagen de ID de recurso"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Demo de filas"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Demos de texto e iconos"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Demo de filas con texto e iconos"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Demo de listas seleccionables"</string>
     <string name="option_1_title" msgid="7221252541651471199">"Opción 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"Opción 2"</string>
@@ -292,6 +296,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Se ha alcanzado el límite de tareas\nSi continuas, se forzará la detención de la aplicación"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Paso %1$d de %2$d de la tarea"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Haz clic para continuar"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Prueba del interruptor"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Se permiten cambios de estado"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Habilitar prueba del interruptor"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Prueba del interruptor inhabilitada"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Otras demos de plantillas"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Demos de Showcase"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"Pantalla de la demo de Voice Access"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"Interacciones de usuarios"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"Demos de solicitud de permisos"</string>
+    <string name="perm_group" msgid="3834918337351876270">"Grupo de permisos"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"Grupo de permisos de la aplicación Showcase"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"Acceso a la ubicación precisa"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"Permiso para acceder a la ubicación precisa"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"Acceso a la ubicación aproximada"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"Permiso para acceder a la ubicación aproximada"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"Acceso a la grabación de audio"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"Permiso para acceder a la grabación de audio"</string>
     <string name="location_1_description" msgid="4801052291684791371">"Vector de recursos con color"</string>
     <string name="location_2_description" msgid="3331356135359047166">"Mapa de bits de recursos de imagen"</string>
     <string name="location_3_description" msgid="3982142774088944850">"Marcador de texto con color"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Mapa de bits de imagen"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Etiqueta de texto"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-et/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-et/strings.xml
index 68371bf..af61146 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-et/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-et/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"See tekst on rohelist värvi"</string>
     <string name="example_3_text" msgid="977269832109695627">"See tekst on sinist värvi"</string>
     <string name="example_4_text" msgid="2043547015979437373">"See tekst on kollast värvi"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"See tekst kasutab peamist värvi"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"See tekst kasutab sekundaarset värvi"</string>
     <string name="color_demo" msgid="1822427636476178993">"Värvi demo"</string>
     <string name="list_limit" msgid="3023536401535417286">"Loendi piirang"</string>
@@ -232,6 +233,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Ühildumatu host"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Sõnumimalli demo"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Sõnum lisatakse siia.\nTeisel real on veel teksti."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Paanimalli demo"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Kohtade loendi malli demo"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Sirvige kohti"</string>
@@ -267,7 +270,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Joonistatav vektor, toonitud"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Joonistatav vektor, mille värv on rakenduse teema atribuut"</string>
     <string name="png_res_title" msgid="7437083018336747544">"Ressursina saadetud PNG"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"Ressursina saadetud PNG"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Lihtsalt pealkiri"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Rakenduse ikooniga pealkiri"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Ressursi ID pildiga pealkiri"</string>
@@ -279,6 +283,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Ridade demo"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Teksti ja ikoonide demod"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Teksti ja ikoonidega ridade demo"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Valitavate loendite demo"</string>
     <string name="option_1_title" msgid="7221252541651471199">"1. valik"</string>
     <string name="option_2_title" msgid="1905146448697963818">"2. valik"</string>
@@ -292,6 +298,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Ülesannete piirang on saavutatud\nJätkamisel rakendus sundsuletakse"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Ülesande toiming %1$d %2$d-st"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Klõpsake edasiliikumiseks"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Testi lüliti"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Olekulised muudatused on lubatud"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Luba lülititest"</string>
@@ -306,6 +314,10 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Lülititest on keelatud"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Mitmesuguste mallide demod"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Esiletõstmise demod"</string>
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
+    <skip />
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
+    <skip />
     <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
     <skip />
     <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
@@ -333,4 +345,18 @@
     <string name="location_3_description" msgid="3982142774088944850">"Värviline tekstimarker"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Kujutise raster"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Teksti silt"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-eu/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-eu/strings.xml
index 59985ec..5bc973d 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-eu/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-eu/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Testua berdez dago"</string>
     <string name="example_3_text" msgid="977269832109695627">"Testua urdinez dago"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Testua horiz dago"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Testua kolore primario batean dago"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Testua kolore sekundario batean dago"</string>
     <string name="color_demo" msgid="1822427636476178993">"Kolorearen demo-bertsioa"</string>
     <string name="list_limit" msgid="3023536401535417286">"Zerrenden muga"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"Aplikazioa itxiko da. Itzultzen zarenean, kargatzeko lehentasuna emango zaio baimenen pantaila bati."</string>
     <string name="finish_app_title" msgid="9013328479438745074">"Itxi aplikazioaren demo-bertsioa"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"Eman kargatzeko lehentasuna baimen-pantailari demo-bertsioa abiarazten den hurrengoan"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"Baimenen aplikazioari kargatzeko lehentasuna emateko aukeraren demo-bertsioa"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"Abiarazten den hurrengoan baimenen pantailari kargatzeko lehentasuna emateko aukeraren demo-bertsioa"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"Demo-bertsioa kargatzen"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"Kargatu da"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"Joan errora"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Ostalaria ez da bateragarria"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Mezuen txantiloien demo-bertsioa"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Hemen idatzi behar da mezua.\nBigarren lerroan testu gehiago duzu."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Panelen txantiloien demo-bertsioa"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Tokien zerrenden txantiloien demo-bertsioa"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Arakatu tokiak"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Marraz daitekeen bektore tonudun bat"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Marraz daitekeen bektore bat, aplikazioaren gaiaren kolorearen atributua duena"</string>
     <string name="png_res_title" msgid="7437083018336747544">"Baliabide gisa bidalitako PNG bat"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"Baliabide gisa bidalitako PNG bat"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Izen bat baino ez"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Aplikazioaren ikonoa duen izena"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Baliabide IDaren irudia duen izena"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Errenkaden demo-bertsioa"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Testuen eta ikonoen demo-bertsioak"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Errenkada testudun eta ikonodunen demo-bertsioa"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Hauta daitezkeen zerrenden demo-bertsioa"</string>
     <string name="option_1_title" msgid="7221252541651471199">"1. aukera"</string>
     <string name="option_2_title" msgid="1905146448697963818">"2. aukera"</string>
@@ -292,6 +296,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Zereginen mugara iritsi zara\nAurrera eginez gero, aplikazioa gelditzera behartuko duzu"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Zereginaren %1$d/%2$d urratsa"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Aurrera egiteko, sakatu hau"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Etengailuaren proba"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Aldaketa egoeradunak egin daitezke"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Gaitu etengailuaren proba"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Desgaitu da etengailuaren proba"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Bestelako txantiloien demo-bertsioak"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Erakutsi demo-bertsioak"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"Ahots bidezko sarbidearen demo-bertsioaren pantaila"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"Erabiltzailearen interakzioak"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"Baimen-eskaeren demo-bertsioak"</string>
+    <string name="perm_group" msgid="3834918337351876270">"Baimenen taldea"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"Showcase aplikazioaren baimenen taldea"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"Kokapen zehatzerako sarbidea"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"Kokapen zehatza atzitzeko baimena"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"Gutxi gorabeherako kokapenerako sarbidea"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"Gutxi gorabeherako kokapena atzitzeko baimena"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"Audioa grabatzeko sarbidea"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"Audioa grabatzeko baimena"</string>
     <string name="location_1_description" msgid="4801052291684791371">"Baliabide-bektore tonuduna"</string>
     <string name="location_2_description" msgid="3331356135359047166">"Irudiaren baliabidearen bit-mapa"</string>
     <string name="location_3_description" msgid="3982142774088944850">"Koloreztatutako testu-markatzailea"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Irudiaren bit-mapa"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Testuaren etiketa"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-fa/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-fa/strings.xml
index aa81d6f..d2e0e24 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-fa/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-fa/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"رنگ این نوشتار سبز است"</string>
     <string name="example_3_text" msgid="977269832109695627">"رنگ این نوشتار آبی است"</string>
     <string name="example_4_text" msgid="2043547015979437373">"رنگ این نوشتار زرد است"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"این نوشتار از رنگ اصلی استفاده می‌کند"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"این نوشتار از رنگ فرعی استفاده می‌کند"</string>
     <string name="color_demo" msgid="1822427636476178993">"نمونه رنگ"</string>
     <string name="list_limit" msgid="3023536401535417286">"محدودیت فهرست"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"با این کار، برنامه به‌پایان می‌رسد و وقتی برگردید، صفحه اجازه را اضافه خواهد کرد"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"به‌پایان رساندن نمونه برنامه"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"پیش‌پیگردی «صفحه اجازه» در اجرای بعدی نسخه نمونه"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"پیش‌پیگردی اجازه برای برنامه نمونه"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"پیش‌پیگردی صفحه اجازه در اجرای بعدی نسخه نمونه"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"درحال بار کردن نسخه نمونه"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"بار کردن انجام شد!"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"رفتن به ریشه"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"میزبان سازگار نیست"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"نمونه الگوی پیام"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"پیام اینجا می‌رود.\nنوشتار بیشتر در خط دوم."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"الگوی قاب نمونه"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"نمونه الگوی فهرست مکان"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"مرور مکان‌ها"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"ترسیمی بُرداری، با سایه‌رنگ"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"ترسیمی بُرداری، با مشخصه زمینه برنامه برای رنگ آن"</string>
     <string name="png_res_title" msgid="7437083018336747544">"‏فایل PNG، به‌عنوان منبع ارسال شد"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"‏فایل PNG، به‌عنوان منبع ارسال شد"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"فقط یک عنوان"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"عنوان با نماد برنامه"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"عنوان با تصویر شناسه منبع"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"ردیف‌های نمونه"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"نوشتار و نمادهای نمونه"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"نمونه ردیف‌ها به‌همراه نوشتار و نمادها"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"فهرست‌های قابل‌انتخاب نمونه"</string>
     <string name="option_1_title" msgid="7221252541651471199">"گزینه ١"</string>
     <string name="option_2_title" msgid="1905146448697963818">"گزینه ۲"</string>
@@ -292,6 +296,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"به حد مجاز تکلیف رسیدید\nاگر ادامه دهید، برنامه به‌اجبار متوقف خواهد شد"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"‏مرحله %1$d از %2$d تکلیف"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"برای ادامه دادن، کلیک کنید"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"امتحان کردن تغییر وضعیت"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"تغییرات حالت‌مند مجاز است"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"فعال کردن آزمایش تغییر وضعیت"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"آزمایش تغییر وضعیت غیرفعال شد"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"الگوهای متفرقه نمونه"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"نمایش نمونه‌ها"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"صفحه نمونه دسترسی صوتی"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"تعاملات کاربران"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"درخواست اجازه برای نسخه‌های نمونه"</string>
+    <string name="perm_group" msgid="3834918337351876270">"گروه اجازه"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"گروه اجازه برنامه «ویترین»"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"دسترسی به مکان دقیق"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"اجازه دسترسی به مکان دقیق"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"دسترسی به مکان تقریبی"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"اجازه دسترسی به مکان تقریبی"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"دسترسی به ضبط صدا"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"اجازه دسترسی به ضبط صدا"</string>
     <string name="location_1_description" msgid="4801052291684791371">"بردار منبع با سایه‌رنگ"</string>
     <string name="location_2_description" msgid="3331356135359047166">"بیت‌مپ منبع تصویر"</string>
     <string name="location_3_description" msgid="3982142774088944850">"نشانگر نوشتار رنگی"</string>
     <string name="location_4_description" msgid="6560365445044381911">"بیت‌مپ تصویر"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"برچسب نوشتار"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-fi/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-fi/strings.xml
index 4136295..756acb1 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-fi/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-fi/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Tämän tekstin väri on vihreä"</string>
     <string name="example_3_text" msgid="977269832109695627">"Tämän tekstin väri on sininen"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Tämän tekstin väri on keltainen"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Tämä teksti käyttää pääväriä"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Tämä teksti käyttää väliväriä"</string>
     <string name="color_demo" msgid="1822427636476178993">"Värien esittely"</string>
     <string name="list_limit" msgid="3023536401535417286">"Listaraja"</string>
@@ -232,6 +233,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Yhteensopimaton isäntä"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Viestimallin esittely"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Viesti tulee tähän.\nLisää tekstiä toisella rivillä."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Ruutumallin esittely"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Paikkalistamallin esittely"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Selaa paikkoja"</string>
@@ -267,7 +270,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Vektoripiirros sävytyksellä"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Vektoripiirros, jonka värinä on sovelluksen teema-attribuutti"</string>
     <string name="png_res_title" msgid="7437083018336747544">"PNG, lähetetty resurssina"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"PNG, lähetetty resurssina"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Vain otsikko"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Otsikko sovelluksen kuvakkeen kanssa"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Otsikko resurssin tunnuksen kuvan kanssa"</string>
@@ -279,6 +283,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Rivien esittely"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Tekstin ja kuvakkeiden esittelyt"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Esittely riveistä, joilla on tekstiä ja kuvakkeita"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Valittavien listojen esittely"</string>
     <string name="option_1_title" msgid="7221252541651471199">"Vaihtoehto 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"Vaihtoehto 2"</string>
@@ -292,6 +298,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Tehtäväraja saavutettu\nEteneminen pakottaa sovelluksen sulkeutumaan"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Tehtävän vaihe %1$d/%2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Siirry eteenpäin klikkaamalla"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Vaihtotesti"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Tilattomat muutokset ovat sallittuja"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Ota vaihtotesti käyttöön"</string>
@@ -306,6 +314,10 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Vaihtotesti pois käytöstä"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Sekalaisten mallien esittelyt"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Showcase-esittelyt"</string>
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
+    <skip />
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
+    <skip />
     <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
     <skip />
     <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
@@ -333,4 +345,18 @@
     <string name="location_3_description" msgid="3982142774088944850">"Väritetty tekstimerkki"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Bittikarttakuva"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Tekstitunniste"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-fr-rCA/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-fr-rCA/strings.xml
index 0b59a25..291bc37 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-fr-rCA/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-fr-rCA/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Ce texte a une couleur verte"</string>
     <string name="example_3_text" msgid="977269832109695627">"Ce texte a une couleur bleue"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Ce texte a une couleur jaune"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Ce texte utilise la couleur primaire"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Ce texte utilise la couleur secondaire"</string>
     <string name="color_demo" msgid="1822427636476178993">"Démo de la couleur"</string>
     <string name="list_limit" msgid="3023536401535417286">"Limite de la liste"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"L\'application sera fermée, et un écran d\'autorisation sera ajouté quand vous la rouvrirez"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"Terminer la démo de l\'application"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"Ajout de l\'écran d\'autorisation lors de la prochaine exécution de la démo"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"Ajout d\'autorisations à l\'application de démonstration"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"Ajout de l\'écran d\'autorisation lors de la prochaine exécution de la démo"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"Chargement de la démo en cours…"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"Chargement terminé!"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"Aller à la racine"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Hôte incompatible"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Démo du modèle de message"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Message ici.\nTexte supplémentaire à la deuxième ligne."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Démo du modèle de volet"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Démo du modèle de la liste des lieux"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Parcourir les lieux"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Une vectorielle dessinable, avec teinte"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Une vectorielle dessinable, avec comme couleur l\'attribut du thème d\'une application"</string>
     <string name="png_res_title" msgid="7437083018336747544">"Un PNG, envoyé comme ressource"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"Un PNG, envoyé comme ressource"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Juste un titre"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Titre avec icône d\'application"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Titre avec image d\'identifiant de ressource"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Démo de lignes"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Démos de texte et d\'icônes"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Démo de lignes avec texte et icônes"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Démo de listes sélectionnables"</string>
     <string name="option_1_title" msgid="7221252541651471199">"Option 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"Option 2"</string>
@@ -292,6 +296,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Limite de la tâche atteinte\nAller de l\'avant forcera l\'arrêt de l\'application"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Étape %1$d de %2$d de la tâche"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Cliquez pour avancer"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Essai du commutateur"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Les changements à état sont autorisés"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Activer l\'essai du commutateur"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Essai du commutateur désactivé"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Démos de divers modèles"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Présenter les démos"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"Écran d\'autorisation à l\'accès vocal"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"Interactions avec l\'utilisateur"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"Demande d\'autorisation pour les démos."</string>
+    <string name="perm_group" msgid="3834918337351876270">"Groupe d\'autorisations"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"Groupe d\'autorisations pour l\'application Showcase"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"Accès à la localisation précise"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"Autorisation pour l\'accès à la localisation précise"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"Accès à la localisation imprécise"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"Autorisation pour l\'accès à la localisation imprécise"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"Accès aux fichiers audio"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"Autorisation pour l\'accès aux fichiers audio"</string>
     <string name="location_1_description" msgid="4801052291684791371">"Vecteur de ressource teintée"</string>
     <string name="location_2_description" msgid="3331356135359047166">"Table de bits de la ressource d\'image"</string>
     <string name="location_3_description" msgid="3982142774088944850">"Marqueur de texte coloré"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Table de bits de l\'image"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Étiquette du texte"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-fr/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-fr/strings.xml
index b6348b7..472a6fe 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-fr/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-fr/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Ce texte est vert"</string>
     <string name="example_3_text" msgid="977269832109695627">"Ce texte est bleu"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Ce texte est jaune"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Ce texte utilise la couleur primaire"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Ce texte utilise la couleur secondaire"</string>
     <string name="color_demo" msgid="1822427636476178993">"Démo des couleurs"</string>
     <string name="list_limit" msgid="3023536401535417286">"Limite de liste"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"L\'appli sera fermée et un écran d\'autorisation sera préchargé lorsque vous la relancerez"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"Terminer la démo de l\'appli"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"Précharger l\'écran d\'autorisation lors de la prochaine démo"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"Précharger l\'autorisation de la démo d\'appli"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"Précharger l\'écran d\'autorisation lors de la prochaine démo"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"Chargement de la démo…"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"Chargement terminé !"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"Accéder à la racine"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Hôte incompatible"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Démo du modèle de message"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Emplacement du message.\nPlus de texte sur la 2e ligne."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Démo du modèle de volet"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Démo du modèle de la liste des lieux"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Parcourir les lieux"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Un drawable vectoriel, avec une teinte"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Un drawable vectoriel, avec l\'attribut de thème de l\'appli comme couleur"</string>
     <string name="png_res_title" msgid="7437083018336747544">"Image PNG, envoyée comme ressource"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"Image PNG, envoyée comme ressource"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Titre uniquement"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Titre avec icône d\'appli"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Titre avec image d\'ID de ressource"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Démo des lignes"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Démos du texte et des icônes"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Démo des lignes avec texte et icônes"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Démo des listes sélectionnables"</string>
     <string name="option_1_title" msgid="7221252541651471199">"Option 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"Option 2"</string>
@@ -292,6 +296,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Limite de tâche atteinte\nContinuer forcera l\'arrêt de l\'appli"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Étape %1$d sur %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Cliquer pour continuer"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Activer/Désactiver le test"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Les modifications avec état sont autorisées"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Activer le test d\'activation/de désactivation"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Test d\'activation/de désactivation désactivé"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Démos de divers modèles"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Présenter les démos"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"Écran de démo Voice Access"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"Interactions des utilisateurs"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"Démos de demandes d\'autorisation"</string>
+    <string name="perm_group" msgid="3834918337351876270">"Groupe d\'autorisations"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"Groupe d\'autorisations pour l\'appli Showcase"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"Accès à la position précise"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"Autorisation d\'accès à la position précise"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"Accès à la position approximative"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"Autorisation d\'accès à la position approximative"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"Accès pour enregistrer l\'audio"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"Autorisation d\'accès pour enregistrer l\'audio"</string>
     <string name="location_1_description" msgid="4801052291684791371">"Vecteur de ressource teinté"</string>
     <string name="location_2_description" msgid="3331356135359047166">"Bitmap de ressource d\'image"</string>
     <string name="location_3_description" msgid="3982142774088944850">"Marqueur de texte en couleur"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Image bitmap"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Libellé du texte"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-gl/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-gl/strings.xml
index 3224eec..b828ea7 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-gl/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-gl/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Este texto é de cor verde"</string>
     <string name="example_3_text" msgid="977269832109695627">"Este texto é de cor azul"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Este texto é de cor amarela"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Este texto usa a cor primaria"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Este texto usa a cor secundaria"</string>
     <string name="color_demo" msgid="1822427636476178993">"Demostración de cor"</string>
     <string name="list_limit" msgid="3023536401535417286">"Límite de lista"</string>
@@ -232,6 +233,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Host non compatible"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Demostración de modelo de mensaxe"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"A mensaxe vai aquí.\nMáis texto na segunda liña."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Demostración de modelo de panel"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Demostración de modelo de lista de lugares"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Explorar lugares"</string>
@@ -267,7 +270,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Un debuxable de vector con axuste de ton"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Un debuxable de vector cun atributo de tema da aplicación para a súa cor"</string>
     <string name="png_res_title" msgid="7437083018336747544">"Un ficheiro PNG, enviado como recurso"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"Un ficheiro PNG, enviado como recurso"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Só un título"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Título con icona da aplicación"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Título con imaxe de código de identificación de recurso"</string>
@@ -279,6 +283,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Demostración de filas"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Demostracións de texto e iconas"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Demostración de filas con texto e iconas"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Demostración de listas seleccionables"</string>
     <string name="option_1_title" msgid="7221252541651471199">"Opción 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"Opción 2"</string>
@@ -292,6 +298,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Alcanzouse o límite de tarefas\nSe continúas, forzarase a detención da aplicación"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Paso %1$d de %2$d da tarefa"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Fai clic para continuar"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Proba do interruptor"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Os cambios de estado están permitidos"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Activar proba do interruptor"</string>
@@ -306,6 +314,10 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Desactivouse a proba do interruptor"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Outras demostracións de modelos"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Demostracións de Showcase"</string>
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
+    <skip />
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
+    <skip />
     <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
     <skip />
     <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
@@ -333,4 +345,18 @@
     <string name="location_3_description" msgid="3982142774088944850">"Marcador de texto con cor"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Mapa de bits de imaxe"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Etiqueta de texto"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-gu/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-gu/strings.xml
index 43a447a..8e5895b 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-gu/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-gu/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"આ ટેક્સ્ટનો રંગ લીલો છે"</string>
     <string name="example_3_text" msgid="977269832109695627">"આ ટેક્સ્ટનો રંગ વાદળી છે"</string>
     <string name="example_4_text" msgid="2043547015979437373">"આ ટેક્સ્ટનો રંગ પીળો છે"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"આ ટેક્સ્ટનો રંગ પ્રાથમિક છે"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"આ ટેક્સ્ટનો રંગ ગૌણ છે"</string>
     <string name="color_demo" msgid="1822427636476178993">"રંગનો ડેમો"</string>
     <string name="list_limit" msgid="3023536401535417286">"મર્યાદાની સૂચિ"</string>
@@ -232,6 +233,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"અસંગત હોસ્ટ"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"મેસેજના નમૂનાનો ડેમો"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"મેસેજ અહીં જાય છે.\nબીજી લાઇન પર વધુ ટેક્સ્ટ."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"વિભાગના નમૂનાનો ડેમો"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"જગ્યાની સૂચિના નમૂનાનો ડેમો"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"સ્થાનો બ્રાઉઝ કરો"</string>
@@ -267,7 +270,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"દોરી શકાય તેવું વેક્ટર, રંગની છટાની ગોઠવણી સાથે"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"દોરી શકાય તેવું વેક્ટર, ઍપની થીમની તેના રંગ માટેની વિશેષતા સાથે"</string>
     <string name="png_res_title" msgid="7437083018336747544">"PNGને, સંસાધન તરીકે મોકલવામાં આવી છે"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"PNGને, સંસાધન તરીકે મોકલવામાં આવી છે"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"બસ થોડો"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"ઍપ આઇકનવાળું શીર્ષક"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"સંસાધન IDની છબીવાળું શીર્ષક"</string>
@@ -279,6 +283,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"પંક્તિઓનો ડેમો"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"ટેક્સ્ટ અને આઇકનના ડેમો"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"ટેક્સ્ટ અને આઇકન ડેમો ધરાવતી પંક્તિઓ"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"પસંદ કરી શકાય તેવી સૂચિઓનો ડેમો"</string>
     <string name="option_1_title" msgid="7221252541651471199">"વિકલ્પ 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"વિકલ્પ 2"</string>
@@ -292,6 +298,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"કાર્યની મર્યાદાએ પહોંચી ગયા\nઆગળ વધવાથી ઍપ ફરજિયાત બંધ થઈ જશે"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"%2$dમાંથી %1$d કાર્ય માટેનું પગલું"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"આગળ વધવા માટે ક્લિક કરો"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"પરીક્ષણ ટૉગલ કરો"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"સ્ટેટસમાં થતા ફેરફારનો મંજૂરી છે"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"ટૉગલનું પરીક્ષણ ચાલુ કરો"</string>
@@ -306,6 +314,10 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"ટૉગલનું પરીક્ષણ બંધ કર્યું"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"વિવિધ નમૂનાઓના ડેમો"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"ડેમો બતાવો"</string>
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
+    <skip />
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
+    <skip />
     <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
     <skip />
     <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
@@ -333,4 +345,18 @@
     <string name="location_3_description" msgid="3982142774088944850">"રંગીન ટેક્સ્ટ માટેનું માર્કર"</string>
     <string name="location_4_description" msgid="6560365445044381911">"છબીની પ્રસ્તુતિ"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"ટેક્સ્ટ લેબલ"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-hi/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-hi/strings.xml
index 82116cb..1f53ea8 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-hi/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-hi/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"यह टेक्स्ट हरे रंग का है"</string>
     <string name="example_3_text" msgid="977269832109695627">"यह टेक्स्ट नीले रंग का है"</string>
     <string name="example_4_text" msgid="2043547015979437373">"यह टेक्स्ट पीले रंग का है"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"इस टेक्स्ट को मुख्य रंगों में दिखाया जाता है"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"इस टेक्स्ट को दूसरे रंगों में दिखाया जाता है"</string>
     <string name="color_demo" msgid="1822427636476178993">"रंग का डेमो"</string>
     <string name="list_limit" msgid="3023536401535417286">"सूची की सीमा"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"इससे, ऐप्लिकेशन बंद हो जाएगा. ऐप्लिकेशन को दोबारा लॉन्च करने पर, अनुमतियों का अनुरोध करने की स्क्रीन दिखेगी"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"ऐप्लिकेशन का डेमो बंद करें"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"अगली बार डेमो लॉन्च करने पर, अनुमतियों का अनुरोध करने वाली स्क्रीन दिखाएं"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"ऐप्लिकेशन के डेमो में पिछली स्क्रीन पर जाने की अनुमति"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"अगली बार डेमो लॉन्च करने पर, पिछली स्क्रीन पर ले जाने की अनुमतियों का अनुरोध करने वाली स्क्रीन दिखाएं"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"डेमो लोड हो रहा है"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"लोड हो गया!"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"रूट करने के लिए स्टैक से हटाएं"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"होस्ट काम नहीं कर रहा है"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"मैसेज के टेंप्लेट का डेमो"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"मैसेज यहां पर लिखा जाएगा.\nज़्यादा लिखने के लिए, अगली लाइन पर जाएं."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"पैनल के टेंप्लेट का डेमो"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"जगह की सूची के टेंप्लेट का डेमो"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"जगहें ब्राउज़ करें"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"ड्रॉ करने लायक, रंगीन वेक्टर"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"ऐप्लिकेशन की थीम के ऐट्रिब्यूट के रंग में, ड्रॉ करने लायक वेक्टर"</string>
     <string name="png_res_title" msgid="7437083018336747544">"रिसॉर्स के तौर पर भेजी गई PNG इमेज"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"रिसॉर्स के तौर पर भेजी गई PNG इमेज"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"सिर्फ़ एक शीर्षक है"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"ऐप्लिकेशन आइकॉन के साथ शीर्षक"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"रिसॉर्स आईडी इमेज के साथ शीर्षक"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"पंक्तियों का डेमो"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"टेक्स्ट और आइकॉन के डेमो"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"टेक्स्ट और आइकॉन वाली पंक्तियों का डेमो"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"चुनी जा सकने वाली सूचियों का डेमो"</string>
     <string name="option_1_title" msgid="7221252541651471199">"पहला विकल्प"</string>
     <string name="option_2_title" msgid="1905146448697963818">"दूसरा विकल्प"</string>
@@ -292,6 +296,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"टास्क की सीमा पूरी हुई\nआगे जाने पर, ऐप्लिकेशन को ज़बरदस्ती रोक दिया जाएगा"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"टास्क के %2$d चरणों में से %1$d चरण"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"आगे जाने के लिए क्लिक करें"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"टॉगल टेस्ट"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"स्टेटफ़ुल बदलाव करने की अनुमति है"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"टॉगल टेस्ट चालू करें"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"टॉगल टेस्ट बंद किया गया"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"दूसरे टेंप्लेट के डेमो"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"डेमो दिखाएं"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"Voice Access के डेमो की स्क्रीन"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"यूज़र इंटरैक्शन"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"अनुमतियों के अनुरोध का डेमो"</string>
+    <string name="perm_group" msgid="3834918337351876270">"अनुमतियों का ग्रुप"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"Showcase ऐप्लिकेशन को दी गई अनुमतियों का ग्रुप"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"जगह की सटीक जानकारी का ऐक्सेस"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"जगह की सटीक जानकारी ऐक्सेस करने की अनुमति"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"जगह की अनुमानित जानकारी का ऐक्सेस"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"जगह की अनुमानित जानकारी ऐक्सेस करने की अनुमति"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"ऑडियो रिकॉर्ड करने के लिए माइक्रोफ़ोन का ऐक्सेस"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"ऑडियो रिकॉर्ड करने के लिए माइक्रोफ़ोन ऐक्सेस करने की अनुमति"</string>
     <string name="location_1_description" msgid="4801052291684791371">"रंगीन रिसॉर्स वेक्टर"</string>
     <string name="location_2_description" msgid="3331356135359047166">"इमेज रिसॉर्स का बिट मैप"</string>
     <string name="location_3_description" msgid="3982142774088944850">"रंगीन टेक्स्ट मार्कर"</string>
     <string name="location_4_description" msgid="6560365445044381911">"इमेज का बिट मैप"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"टेक्स्ट का लेबल"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-hr/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-hr/strings.xml
index 0824d91..5a4ab55 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-hr/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-hr/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Ovaj je tekst zelene boje"</string>
     <string name="example_3_text" msgid="977269832109695627">"Ovaj je tekst plave boje"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Ovaj je tekst žute boje"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"U ovom tekstu upotrebljava se primarna boja"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"U ovom tekstu upotrebljava se sekundarna boja"</string>
     <string name="color_demo" msgid="1822427636476178993">"Pokazna verzija boje"</string>
     <string name="list_limit" msgid="3023536401535417286">"Ograničenje popisa"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"Time se aplikacija završava, a kad se vratite, dodat će zaslon sa zahtjevom za dopuštenje prilikom ponovnog pokretanja"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"Završi pokaznu verziju aplikacije"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"Pokazna verzija dodat će zaslon dopuštenja prilikom sljedećeg pokretanja"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"Pokazna verzija aplikacije dodat će dopuštenje"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"Pokazna verzija dodat će zaslon dopuštenja prilikom sljedećeg pokretanja"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"Učitavanje pokazne verzije"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"Učitavanje je dovršeno!"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"Popularno za rute"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Nekompatibilan host"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Pokazna verzija predloška poruke"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Ovdje dolazi poruka.\nViše teksta u drugom retku."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Pokazna verzija predloška okna"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Pokazna verzija predloška popisa mjesta"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Pregledajte mjesta"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Vektorski crtež s nijansom"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Vektorski crtež s atributom teme aplikacije za njenu boju"</string>
     <string name="png_res_title" msgid="7437083018336747544">"PNG, poslan kao resurs"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"PNG, poslan kao resurs"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Samo naslov"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Naslov s ikonom aplikacije"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Naslov sa slikom ID brojem resursa"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Pokazna verzija redaka"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Pokazne verzije teksta i ikona"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Pokazna verzija redaka s tekstom i ikonama"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Pokazna verzija popisa koji se mogu birati"</string>
     <string name="option_1_title" msgid="7221252541651471199">"1. opcija"</string>
     <string name="option_2_title" msgid="1905146448697963818">"2. opcija"</string>
@@ -292,6 +296,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Dosegnuto ograničenje zadatka\nAko nastavite, aplikacija će se prisilno zaustaviti"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Korak zadatka: %1$d od %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Kliknite da biste nastavili"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Prebaci test"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Dopuštene su promjene u praćenju stanja"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Omogući testiranje prekidača"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Testiranje prekidača onemogućeno"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Pokazne verzije raznih predložaka"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Prikaži pokazne verzije"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"Pokazna verzija zaslona za Glasovni pristup"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"Korisničke interakcije"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"Zatraži pokazne verzije dopuštenja"</string>
+    <string name="perm_group" msgid="3834918337351876270">"Grupa dopuštenja"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"Grupa dopuštenja za aplikaciju Odabir urednika"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"Pristup preciznoj lokaciji"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"Dopuštenje za pristup preciznoj lokaciji"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"Pristup približnoj lokaciji"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"Dopuštenje za pristup približnoj lokaciji"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"Pristup snimanju zvuka"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"Dopuštenje za pristup snimanju zvuka"</string>
     <string name="location_1_description" msgid="4801052291684791371">"Vektor nijansiranog izvora"</string>
     <string name="location_2_description" msgid="3331356135359047166">"Bitmapa slikovnog resursa"</string>
     <string name="location_3_description" msgid="3982142774088944850">"Označivač teksta u boji"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Bitmapa slike"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Oznaka teksta"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-hu/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-hu/strings.xml
index 571c58c9..fd78341 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-hu/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-hu/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Ez a szöveg zöld színt használ"</string>
     <string name="example_3_text" msgid="977269832109695627">"Ez a szöveg kék színt használ"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Ez a szöveg sárga színt használ"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Ez a szöveg az elsődleges színt használja"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Ez a szöveg a másodlagos színt használja"</string>
     <string name="color_demo" msgid="1822427636476178993">"Szín – demó"</string>
     <string name="list_limit" msgid="3023536401535417286">"Listakorlát"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"Ez befejezi az alkalmazást, és amikor visszatér hozzá, előkészíti az engedélykérő képernyőt"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"Alkalmazás befejezése – demó"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"Engedély képernyő előkészítése a következő futtatásra – demó"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"Engedély előkészítése alkalmazáshoz – demó"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"Engedély képernyő előkészítése a következő futtatásra – demó"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"Betöltés – demó"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"Betöltés kész!"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"Ugrás a gyökérhez"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Nem kompatibilis gazdagép"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Üzenetsablon – demó"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Ide kerül az üzenet.\nTöbb szöveg a második sorban."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Panelsablon – demó"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Helylistasablon – demó"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Helyek böngészése"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Vektorrajz, árnyalattal"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Vektorrajz, egy alkalmazás témaattribútumával színként"</string>
     <string name="png_res_title" msgid="7437083018336747544">"PNG, forrásként küldve"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"PNG, forrásként küldve"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Csak egy cím"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Cím alkalmazásikonnal"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Cím forrásazonosítóképpel"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Sorok – demó"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Szöveg és ikonok – demók"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Sorok szöveggel és ikonokkal – demó"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Kiválasztható listák – demó"</string>
     <string name="option_1_title" msgid="7221252541651471199">"1. lehetőség"</string>
     <string name="option_2_title" msgid="1905146448697963818">"2. lehetőség"</string>
@@ -292,6 +296,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Feladatkorlát elérve\nA továbblépés az app bezárását kényszeríti"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"%2$d/%1$d. lépés a feladatban"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Kattintson a továbblépéshez"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Kapcsolóteszt"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Az állapotmegőrző módosítások engedélyezettek"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Kapcsolóteszt engedélyezése"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Kapcsolóteszt letiltva"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Egyéb sablonok – demók"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Kirakat – demók"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"Hangalapú hozzáférés képernyő – demó"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"Felhasználói interakciók"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"Engedélyek kérése – demók"</string>
+    <string name="perm_group" msgid="3834918337351876270">"Engedélycsoport"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"Engedélycsoport a bemutató alkalmazáshoz"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"Pontos helymeghatározáshoz való hozzáférés"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"Engedély a pontos helymeghatározáshoz való hozzáféréshez"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"Hozzávetőleges helymeghatározáshoz való hozzáférés"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"Engedély a hozzávetőleges helymeghatározáshoz való hozzáféréshez"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"Hangfelvétel rögzítéséhez való hozzáférés"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"Engedély a hangfelvétel rögzítéséhez való hozzáféréshez"</string>
     <string name="location_1_description" msgid="4801052291684791371">"Árnyalt erőforrásvektor"</string>
     <string name="location_2_description" msgid="3331356135359047166">"Képforrás bittérképe"</string>
     <string name="location_3_description" msgid="3982142774088944850">"Színes szövegkijelölő"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Kép (bittérkép)"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Szövegcímke"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-hy/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-hy/strings.xml
index d1c9e63..29eaa42 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-hy/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-hy/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Այս տեքստը կանաչ է"</string>
     <string name="example_3_text" msgid="977269832109695627">"Այս տեքստը կապույտ է"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Այս տեքստը դեղին է"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Այս տեքստի համար օգտագործվում է հիմնական գույնը"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Այս տեքստի համար օգտագործվում է երկրորդական գույնը"</string>
     <string name="color_demo" msgid="1822427636476178993">"Գույնի դեմո"</string>
     <string name="list_limit" msgid="3023536401535417286">"Ցանկի սահմանափակումներ"</string>
@@ -232,6 +233,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Անհամատեղելի խնամորդ"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Հաղորդագրության ձևանմուշի դեմո"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Հաղորդագրությունը դրվում է այստեղ։\nԵրկրորդ տողում նույնպես տեքստ կա։"</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Վահանակի ձևանմուշի դեմո"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Տեղերի ցանկի ձևանմուշի դեմո"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Դիտել վայրերը"</string>
@@ -267,7 +270,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Վեկտորային գրաֆիկական ռեսուրս՝ երանգավորմամբ"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Վեկտորային գրաֆիկական ռեսուրս՝ հավելվածի թեմայի հատկանիշով իր գույնի համար"</string>
     <string name="png_res_title" msgid="7437083018336747544">"PNG պատկեր՝ ուղարկված որպես ռեսուրս"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"PNG պատկեր՝ ուղարկված որպես ռեսուրս"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Ուղղակի վերնագիր"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Հավելվածի պատկերակով վերնագիր"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Ռեսուրսի ID-ի պատկերով վերնագիր"</string>
@@ -279,6 +283,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Տողերի դեմո"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Տեքստի և պատկերակների դեմոներ"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Տեքստով և պատկերակներով տողերի դեմո"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Ընտրելու տարբերակներով ցանկերի դեմո"</string>
     <string name="option_1_title" msgid="7221252541651471199">"Տարբերակ 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"Տարբերակ 2"</string>
@@ -292,6 +298,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Առաջադրանքների սահմանաչափը սպառված է։\nԵթե շարունակեք, հավելվածի աշխատանքը կկանգնեցվի։"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Առաջադրանքի քայլ %1$d՝ %2$d-ից"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Սեղմեք՝ առաջ անցնելու համար"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Միացնել/անջատել ստուգումը"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Կարգավիճակի փոփոխությունները թույլատրված են"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Միացնել փոխանջատիչի փորձարկումը"</string>
@@ -306,6 +314,10 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Փոխանջատիչի փորձարկումն անջատված է"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Այլ ձևանմուշների դեմոներ"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Ցուցադրել դեմոները"</string>
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
+    <skip />
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
+    <skip />
     <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
     <skip />
     <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
@@ -333,4 +345,18 @@
     <string name="location_3_description" msgid="3982142774088944850">"Գունավոր տեքստի նշիչ"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Պատկերի բիթային քարտեզ"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Տեքստային պիտակ"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-in/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-in/strings.xml
index 5c2dcad..63a05fa 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-in/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-in/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Teks ini berwarna hijau"</string>
     <string name="example_3_text" msgid="977269832109695627">"Teks ini berwarna biru"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Teks ini berwarna kuning"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Teks ini menggunakan warna utama"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Teks ini menggunakan warna sekunder"</string>
     <string name="color_demo" msgid="1822427636476178993">"Demo Warna"</string>
     <string name="list_limit" msgid="3023536401535417286">"Batas Daftar"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"Tindakan ini akan menutup aplikasi, dan saat Anda memulai aplikasi lagi, layar izin akan disiapkan sebelumnya"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"Demo Menutup Aplikasi"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"Demo penyiapan sebelumnya Layar Izin pada peluncuran berikutnya"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"Demo Aplikasi penyiapan sebelumnya izin"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"Demo penyiapan sebelumnya Layar Izin pada peluncuran berikutnya"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"Demo Pemuatan"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"Pemuatan Selesai!"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"Buka root"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Host tidak kompatibel"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Demo Template Pesan"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Pesan akan muncul di sini.\nTeks lainnya ada di baris kedua."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Demo Template Panel"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Demo Template Daftar Tempat"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Jelajahi Tempat"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Vector drawable, dengan tint"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Vector drawable, dengan atribut tema aplikasi untuk warnanya"</string>
     <string name="png_res_title" msgid="7437083018336747544">"PNG, dikirim sebagai resource"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"PNG, dikirim sebagai resource"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Hanya judul"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Judul dengan ikon aplikasi"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Judul dengan gambar ID resource"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Demo Baris"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Demo Teks dan Ikon"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Demo Baris dengan Teks dan Ikon"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Demo Daftar yang Dapat Dipilih"</string>
     <string name="option_1_title" msgid="7221252541651471199">"Opsi 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"Opsi 2"</string>
@@ -292,6 +296,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Batas tugas tercapai\nJika dilanjutkan, aplikasi akan dipaksa berhenti"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Langkah tugas %1$d dari %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Klik untuk melanjutkan"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Pengujian tombol"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Perubahan stateful diizinkan"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Aktifkan Pengujian Tombol"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Pengujian Tombol Dinonaktifkan"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Demo Template Lain-Lain"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Demo Berita Pilihan"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"Layar Demo Voice Access"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"Interaksi Pengguna"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"Demo Permintaan Izin"</string>
+    <string name="perm_group" msgid="3834918337351876270">"Grup Izin"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"Grup Izin untuk Aplikasi Etalase"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"Akses ke Lokasi Terperinci"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"Izin untuk Akses ke Lokasi Terperinci"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"Akses ke Lokasi Sementara"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"Izin untuk Akses ke Lokasi Sementara"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"Akses ke Perekam Audio"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"Izin untuk Akses ke Perekam Audio"</string>
     <string name="location_1_description" msgid="4801052291684791371">"Vektor resource dengan tint"</string>
     <string name="location_2_description" msgid="3331356135359047166">"Bitmap resource gambar"</string>
     <string name="location_3_description" msgid="3982142774088944850">"Penanda teks berwarna"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Bitmap gambar"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Label teks"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-is/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-is/strings.xml
index 66857d6..5f004e5 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-is/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-is/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Þessi texti er grænn"</string>
     <string name="example_3_text" msgid="977269832109695627">"Þessi texti er blár"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Þessi texti er gulur"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Þessi texti notar grunnlit"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Þessi texti notar blandaða liti"</string>
     <string name="color_demo" msgid="1822427636476178993">"Litasýnishorn"</string>
     <string name="list_limit" msgid="3023536401535417286">"Listatakmörk"</string>
@@ -232,6 +233,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Ósamhæfur hýsill"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Sýnishorn skilaboðasniðmáts"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Skilaboð koma hér.\nMeiri texti í næstu línu."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Sýnishorn gluggasniðmáts"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Sýnishorn staðarlistasniðmáts"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Skoða staði"</string>
@@ -267,7 +270,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Teiknanlegur vektor, með lit"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Teiknanlegur vektor, með þemaeigind forrits hvað varðar lit"</string>
     <string name="png_res_title" msgid="7437083018336747544">"PNG, sent sem gögn"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"PNG, sent sem gögn"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Aðeins titill"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Titill með forritstákni"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Titill með mynd gagnaauðkennis"</string>
@@ -279,6 +283,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Sýnishorn lína"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Sýnishorn texta og tákna"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Sýnishorn lína með texta og táknum"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Sýnishorn veljanlegra lista"</string>
     <string name="option_1_title" msgid="7221252541651471199">"Valkostur 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"Valkostur 2"</string>
@@ -292,6 +298,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Verkefnismörkum náð\nEf haldið er áfram verður lokun forrits þvinguð"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Verkefnisskref %1$d af %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Smelltu til að halda áfram"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Velja/afvelja prófun"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Breytingar á stöðu eru leyfðar"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Kveikja á rofaprófun"</string>
@@ -306,6 +314,10 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Slökkt á rofaprófun"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Sýnishorn ýmissa sniðmáta"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Prufuútgáfur Showcase"</string>
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
+    <skip />
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
+    <skip />
     <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
     <skip />
     <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
@@ -333,4 +345,18 @@
     <string name="location_3_description" msgid="3982142774088944850">"Litað textamerki"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Punktamynd myndar"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Textamerki"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-it/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-it/strings.xml
index 4d83dd3a..f9999d3 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-it/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-it/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Questo testo è di colore verde"</string>
     <string name="example_3_text" msgid="977269832109695627">"Questo testo è di colore blu"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Questo testo è di colore giallo"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Questo testo usa il colore principale"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Questo testo usa il colore secondario"</string>
     <string name="color_demo" msgid="1822427636476178993">"Demo Colori"</string>
     <string name="list_limit" msgid="3023536401535417286">"Limite elenco"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"L\'operazione comporta la chiusura dell\'app e al riavvio verrà pre-configurata una schermata di autorizzazione"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"Demo Completa app"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"Preconfigura la schermata di autorizzazione all\'esecuzione successiva della demo"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"Demo app preconfigurazione autorizzazione"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"Demo Preconfigurazione della schermata di autorizzazione all\'esecuzione successiva"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"Caricamento demo in corso…"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"Caricamento completato"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"Vai a principale"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Host non compatibile"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Demo Modello messaggio"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Il messaggio va qui.\nTesto aggiuntivo sulla seconda riga."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Demo Modello riquadro"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Demo Modello elenco luoghi"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Sfoglia luoghi"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Risorsa drawable vettoriale, con tinta"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Risorsa drawable vettoriale, con attributo theme dell\'app per il colore"</string>
     <string name="png_res_title" msgid="7437083018336747544">"Immagine PNG, inviata come risorsa"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"Immagine PNG, inviata come risorsa"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Solo un titolo"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Titolo con icona dell\'app"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Titolo con immagine ID risorsa"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Demo Righe"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Demo Testo e icone"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Demo Righe con testo e icone"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Demo Elenchi selezionabili"</string>
     <string name="option_1_title" msgid="7221252541651471199">"Opzione 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"Opzione 2"</string>
@@ -292,6 +296,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Limite attività raggiunto\nSe prosegui forzerai l\'interruzione dell\'app"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Passaggio attività %1$d di %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Fai clic per proseguire"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Test attivazione/disattivazione"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Sono consentite modifiche stateful"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Abilita test di attivazione/disattivazione"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Test di attivazione/disattivazione disabilitato"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Demo modelli vari"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Demo Showcase"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"Schermata demo Voice Access"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"Interazioni dell\'utente"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"Demo su come richiedere le autorizzazioni"</string>
+    <string name="perm_group" msgid="3834918337351876270">"Gruppo di autorizzazioni"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"Gruppo di autorizzazioni relativo all\'app Showcase"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"Accesso alla posizione precisa"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"Autorizzazione per accedere alla posizione precisa"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"Accesso alla posizione approssimativa"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"Autorizzazione per accedere alla posizione approssimativa"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"Accesso alla registrazione di audio"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"Autorizzazione per accedere alla registrazione di audio"</string>
     <string name="location_1_description" msgid="4801052291684791371">"Vettore risorsa colorata"</string>
     <string name="location_2_description" msgid="3331356135359047166">"Bitmap risorsa immagine"</string>
     <string name="location_3_description" msgid="3982142774088944850">"Indicatore testo colorato"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Immagine bitmap"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Etichetta testo"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-iw/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-iw/strings.xml
index b4ab9bb..bfd8991 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-iw/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-iw/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"הטקסט הזה בצבע ירוק"</string>
     <string name="example_3_text" msgid="977269832109695627">"הטקסט הזה בצבע כחול"</string>
     <string name="example_4_text" msgid="2043547015979437373">"הטקסט הזה בצבע צהוב"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"הטקסט הזה משתמש בצבע הראשי"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"הטקסט הזה משתמש בצבע המשני"</string>
     <string name="color_demo" msgid="1822427636476178993">"הדגמת צבע"</string>
     <string name="list_limit" msgid="3023536401535417286">"הגבלת הרשימה"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"הפעולה הזו תסגור את האפליקציה, ובזמן ההפעלה מחדש היא תאכלס מראש את מסך ההרשאות"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"סיום הדגמת האפליקציה"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"הדגמה של אכלוס מראש של מסך ההרשאות בהפעלה הבאה"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"הדגמת האפליקציה של אכלוס מראש של ההרשאה"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"הדגמה של אכלוס מראש של מסך ההרשאות בהפעלה הבאה"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"ההדגמה נטענת"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"הטעינה הושלמה!"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"הבלטה של הבסיס"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"מארח לא תואם"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"הדגמה של תבנית הודעה"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"ההודעה תופיע כאן.\nטקסט נוסף מופיע בשורה השנייה."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"הדגמה של תבנית החלונית"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"הדגמת התבנית של רשימת המקומות"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"עיון במקומות"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"פריט גרפי וקטורי שניתן לשרטוט, עם גוון"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"פריט גרפי וקטורי שניתן לשרטוט, עם מאפיין העיצוב של האפליקציה עבור הצבע שלו"</string>
     <string name="png_res_title" msgid="7437083018336747544">"‏קובץ PNG, נשלח כמקור מידע"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"‏קובץ PNG, נשלח כמקור מידע"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"רק כותרת"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"כותרת עם סמל האפליקציה"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"כותרת עם התמונה המזהה של מקור המידע"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"הדגמת שורות"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"הדגמות של טקסטים וסמלים"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"הדגמה של שורות עם טקסטים וסמלים"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"הדגמה של הרשימות שאפשר לבחור"</string>
     <string name="option_1_title" msgid="7221252541651471199">"אפשרות 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"אפשרות 2"</string>
@@ -292,6 +296,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"הגעת להגבלת המשימות\nהמשך יוביל לסגירה ידנית של האפליקציה"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"‏שלב %1$d מתוך %2$d במשימה"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"יש ללחוץ כדי להמשיך"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"בדיקה של החלפת המצב"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"מותר לערוך שינויי מצב"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"הפעלת הבדיקה של החלפת המצב"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"הבדיקה של החלפת המצב מושבתת"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"הדגמות של תבניות שונות"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"הדגמות תצוגה"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"‏מסך ההדגמה של אפליקציית Voice Access"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"אינטראקציות של משתמשים"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"הדגמה של בקשת הרשאות"</string>
+    <string name="perm_group" msgid="3834918337351876270">"קבוצת הרשאות"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"‏קבוצת הרשאות לאפליקציית Showcase"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"גישה למיקום המדויק"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"הרשאת גישה למיקום המדויק"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"גישה למיקום המשוער"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"הרשאת גישה למיקום המשוער"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"גישה להקלטת אודיו"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"הרשאת גישה להקלטת אודיו"</string>
     <string name="location_1_description" msgid="4801052291684791371">"וקטור משאבים צבוע"</string>
     <string name="location_2_description" msgid="3331356135359047166">"מקור של תמונת מפת סיביות"</string>
     <string name="location_3_description" msgid="3982142774088944850">"סמן טקסט צבוע"</string>
     <string name="location_4_description" msgid="6560365445044381911">"תמונת מפת סיביות"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"תווית הטקסט"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-ja/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-ja/strings.xml
index 83d01d5..aa67014 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-ja/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-ja/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"このテキストの色は緑です"</string>
     <string name="example_3_text" msgid="977269832109695627">"このテキストの色は青です"</string>
     <string name="example_4_text" msgid="2043547015979437373">"このテキストの色は黄色です"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"このテキストはプライマリ カラーを使用しています"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"このテキストはセカンダリ カラーを使用しています"</string>
     <string name="color_demo" msgid="1822427636476178993">"色のデモ"</string>
     <string name="list_limit" msgid="3023536401535417286">"リストの上限"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"これによりアプリが終了し、戻ったときに権限の画面が事前に埋め込まれます"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"アプリのデモを終了"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"次回実行時に権限画面を事前に埋め込むデモ"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"権限画面を事前に埋め込むアプリのデモ"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"次回実行時に権限画面を事前に埋め込むデモ"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"デモを読み込んでいます"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"読み込みが完了しました!"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"root に移動"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"非対応のホスト"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"メッセージ テンプレートのデモ"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"メッセージはここに表示されます。\nその他のテキストは 2 行目に表示されます。"</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"ペイン テンプレートのデモ"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"場所リスト テンプレートのデモ"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"場所を見る"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"ベクター型ドローアブル、色合い調整あり"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"ベクター型ドローアブル、色に対するアプリのテーマ属性あり"</string>
     <string name="png_res_title" msgid="7437083018336747544">"PNG、リソースとして送信済み"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"PNG、リソースとして送信済み"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"タイトルのみ"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"アプリアイコン付きタイトル"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"リソース ID 画像付きタイトル"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"行のデモ"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"テキストとアイコンのデモ"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"テキストとアイコンが含まれる行のデモ"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"選択可能リストのデモ"</string>
     <string name="option_1_title" msgid="7221252541651471199">"オプション 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"オプション 2"</string>
@@ -292,6 +296,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"タスクの上限に達しました\n続行するとアプリが強制停止されます"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"タスクのステップ %1$d / %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"クリックして続行"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"切り替えのテスト"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"ステートフルな変更が許可されています"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"切り替えのテストを有効にする"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"切り替えのテスト無効"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"その他のテンプレートのデモ"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"デモを表示"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"Voice Access のデモ画面"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"ユーザー操作"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"権限リクエストのデモ"</string>
+    <string name="perm_group" msgid="3834918337351876270">"権限グループ"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"ショーケース アプリの権限グループ"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"精細な位置情報へのアクセス"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"精細な位置情報へのアクセス権限"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"おおよその位置情報へのアクセス"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"おおよその位置情報へのアクセス権限"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"音声録音へのアクセス"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"音声録音へのアクセス権限"</string>
     <string name="location_1_description" msgid="4801052291684791371">"色合い調整されたリソース ベクター"</string>
     <string name="location_2_description" msgid="3331356135359047166">"画像リソースのビットマップ"</string>
     <string name="location_3_description" msgid="3982142774088944850">"色付きのテキスト マーカー"</string>
     <string name="location_4_description" msgid="6560365445044381911">"画像のビットマップ"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"テキストラベル"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-ka/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-ka/strings.xml
index 03b6497..c5546cc 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-ka/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-ka/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"ეს ტექსტი მწვანე ფერისაა"</string>
     <string name="example_3_text" msgid="977269832109695627">"ეს ტექსტი ლურჯი ფერისაა"</string>
     <string name="example_4_text" msgid="2043547015979437373">"ეს ტექსტი ყვითელი ფერისაა"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"ეს ტექსტი იყენებს პირველად ფერს"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"ეს ტექსტი იყენებს მეორეულ ფერს"</string>
     <string name="color_demo" msgid="1822427636476178993">"ფერის დემო"</string>
     <string name="list_limit" msgid="3023536401535417286">"სიის ლიმიტი"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"ამ მოქმედებით აპი გამოირთვება და აპში ხელახლა დაბრუნებისას ნებართვის ეკრანი გამოჩნდება"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"აპის დემოს დასრულება"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"აპის ხელახლა გაშვებისას ნებართვის მოთხოვნის ეკრანის დამატების დემო"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"წინასწარ დაყენების ნებართვის აპლიკაციის დემო"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"აპის ხელახლა გაშვებისას ნებართვის მოთხოვნის ეკრანის დამატების დემო"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"მიმდინარეობს დემოს ჩატვირთვა"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"ჩატვირთვა დასრულდა!"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"ძირეულ საქაღალდეში გადასვლა"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"არათავსებადი ჰოსტი"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"შეტყობინების შაბლონის დემო"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"შეტყობინება.\nმეტი ტექსტი მეორე ხაზზეა."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"პანელის შაბლონის დემო"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"ადგილების სიის შაბლონის დემო"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"ადგილების დათვალიერება"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"ვექტორის დახატვა შესაძლებელია, შეფერილობით"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"ვექტორის დახატვა შესაძლებელია, აპის თემის ფერით"</string>
     <string name="png_res_title" msgid="7437083018336747544">"PNG — გაგზავნილია რესურსის სახით"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"PNG — გაგზავნილია რესურსის სახით"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"სათაური"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"სათაური აპის ხატულით"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"სათაური სურათის რესურსის აიდით"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"მწკრივების დემო"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"ტექსტისა და ხატულების დემო"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"ტექსტიანი და ხატულებიანი მწკრივის დემო"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"არჩევითი სიების დემო"</string>
     <string name="option_1_title" msgid="7221252541651471199">"ვარიანტი 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"ვარიანტი 2"</string>
@@ -292,6 +296,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"მიღწეულია ამოცანების ლიმიტი\nგაგრძელება გამოიწვევს აპის ძალით შეჩერებას"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"ამოცანის ეტაპი: %1$d/%2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"დააწკაპუნეთ გასაგრძელებლად"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"გადამრთველის ტესტი"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"სტატუსის ცვლილებები ნებადართულია"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"გადამრთველის ტესტის ჩართვა"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"გადამრთველის ტესტი გათიშულია"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"სხვადასხვა შაბლონური დემოები"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"დემოების ჩვენება"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"ხმის წვდომის დემო ეკრანი"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"მომხმარებლის ინტერაქციები"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"მოითხოვეთ ნებართვების დემო"</string>
+    <string name="perm_group" msgid="3834918337351876270">"ნებართვის ჯგუფი"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"ნებართვის ჯგუფი Showcase აპისთვის"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"წვდომა კარგ მდებარეობაზე"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"წვდომის ნებართვა კარგ მდებარეობაზე"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"წვდომა უხეშ მდებარეობაზე"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"უხეში მდებარეობაზე წვდომის ნებართვა"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"წვდომა აუდიოს ჩაწერაზე"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"აუდიოს ჩანაწერზე წვდომის ნებართვა"</string>
     <string name="location_1_description" msgid="4801052291684791371">"შეღებილი ვექტორი"</string>
     <string name="location_2_description" msgid="3331356135359047166">"სურათის რესურსი bitmap ფორმატში"</string>
     <string name="location_3_description" msgid="3982142774088944850">"გაფერადებული ტექსტის მარკერი"</string>
     <string name="location_4_description" msgid="6560365445044381911">"სურათი bitmap"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"ტექსტის ლეიბლი"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-kk/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-kk/strings.xml
index 6817ec1..244352e 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-kk/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-kk/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Бұл мәтіннің түсі жасыл."</string>
     <string name="example_3_text" msgid="977269832109695627">"Бұл мәтіннің түсі көк."</string>
     <string name="example_4_text" msgid="2043547015979437373">"Бұл мәтіннің түсі сары."</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Бұл мәтін негізгі түсті қолданады."</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Бұл мәтін қосымша түсті қолданады."</string>
     <string name="color_demo" msgid="1822427636476178993">"Түстің демо нұсқасы"</string>
     <string name="list_limit" msgid="3023536401535417286">"Шектеу аз"</string>
@@ -232,6 +233,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Үйлеспейтін хост"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Хат үлгісінің демо нұсқасы"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Хат осы жерге жазылады.\nТолық мәтін екінші жолға жазылады."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Панель үлгісінің демо нұсқасы"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Орындар тізімі үлгісінің демо нұсқасы"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Орындарды шолу"</string>
@@ -267,7 +270,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Вектор кескінделетін дереккөз, түс реңкімен"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Вектор кескінделетін дереккөз, түсі қолданбаның тақырып төлсипатымен бірдей"</string>
     <string name="png_res_title" msgid="7437083018336747544">"Ресурс ретінде жіберілген PNG суреті"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"Ресурс ретінде жіберілген PNG суреті"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Жай ғана тақырып"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Қолданба белгішесі бар тақырып"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Ресурс идентификаторының суреті бар тақырып"</string>
@@ -279,6 +283,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Жолдардың демо нұсқасы"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Мәтін мен белгішелердің демо нұсқасы"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Мәтіні бар жолдар мен белгішелердің демо нұсқасы"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Таңдауға болатын тізімнің демо нұсқасы"</string>
     <string name="option_1_title" msgid="7221252541651471199">"1-опция"</string>
     <string name="option_2_title" msgid="1905146448697963818">"2-опция"</string>
@@ -292,6 +298,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Тапсырма өз шегіне жетті.\nІлгері жүрсеңіз, қолданба күштеп тоқтатылады."</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"%1$d/%2$d тапсырма қадамы"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Ілгері жүру үшін басыңыз."</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Ауыстырғыш сынағы"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Күй бақыланатын өзгерістерге рұқсат берілген."</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Ауыстырғыш сынағын қосу"</string>
@@ -306,6 +314,10 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Ауыстырғыш сынағы өшірілген."</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"\"Басқалары\" үлгісінің демо нұсқасы"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Презентацияның демо нұсқасы"</string>
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
+    <skip />
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
+    <skip />
     <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
     <skip />
     <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
@@ -333,4 +345,18 @@
     <string name="location_3_description" msgid="3982142774088944850">"Боялған мәтін маркері"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Суреттің биттер картасы"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Мәтін белгісі"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-km/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-km/strings.xml
index a05783f..62a7ba8 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-km/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-km/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"អត្ថបទនេះមានពណ៌បៃតង"</string>
     <string name="example_3_text" msgid="977269832109695627">"អត្ថបទនេះមានពណ៌ខៀវ"</string>
     <string name="example_4_text" msgid="2043547015979437373">"អត្ថបទនេះមានពណ៌លឿង"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"អត្ថបទនេះ​ប្រើពណ៌ចម្បង"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"អត្ថបទនេះ​ប្រើពណ៌បន្ទាប់បន្សំ"</string>
     <string name="color_demo" msgid="1822427636476178993">"គំរូបង្ហាញពណ៌"</string>
     <string name="list_limit" msgid="3023536401535417286">"ដែនកំណត់បញ្ជី"</string>
@@ -232,6 +233,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"ម៉ាស៊ីនមិនត្រូវគ្នា"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"គំរូបង្ហាញនៃ​ទម្រង់គំរូសារ"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"សារស្ថិត​នៅទីនេះ។\nអត្ថបទច្រើន​ទៀតនៅលើជួរទីពីរ។"</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"គំរូបង្ហាញ​ទម្រង់គំរូផ្ទាំង"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"គំរូបង្ហាញទម្រង់​គំរូនៃបញ្ជីទីកន្លែង"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"រុករក​ទីកន្លែង"</string>
@@ -267,7 +270,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"វ៉ិចទ័រដែល​អាចទាញបាន ដែលមានពណ៌ព្រឿងៗ"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"វ៉ិចទ័រដែល​អាចទាញបាន ដែលមានលក្ខណៈ​រចនាប័ទ្មរបស់កម្មវិធី​សម្រាប់ពណ៌របស់វា"</string>
     <string name="png_res_title" msgid="7437083018336747544">"PNG ដែលបាន​ផ្ញើជាធនធាន"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"PNG ដែលបាន​ផ្ញើជាធនធាន"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"ចំណងជើង​តែប៉ុណ្ណោះ"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"ចំណងជើងដែល​មានរូបកម្មវិធី"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"ចំណងជើង​ដែលមានរូបភាព​លេខសម្គាល់ធនធាន"</string>
@@ -279,6 +283,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"គំរូបង្ហាញជួរដេក"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"គំរូបង្ហាញរូបតំណាង និងអត្ថបទ"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"ជួរដេកដែល​មានគំរូបង្ហាញរូបតំណាង និងអត្ថបទ"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"គំរូបង្ហាញបញ្ជីដែល​អាចជ្រើសរើសបាន"</string>
     <string name="option_1_title" msgid="7221252541651471199">"ជម្រើសទី 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"ជម្រើសទី 2"</string>
@@ -292,6 +298,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"បានឈានដល់​ដែនកំណត់កិច្ចការហើយ\nការបន្តទៀត​នឹងបង្ខំឱ្យកម្មវិធីបញ្ឈប់"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"ជំហានកិច្ចការទី %1$d នៃ %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"ចុចដើម្បីបន្ត"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"ការធ្វើតេស្ត​ប៊ូតុងបិទ/បើក"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"ការផ្លាស់ប្ដូរ​តាមស្ថានភាពត្រូវបានអនុញ្ញាត"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"បើកការធ្វើតេស្ត​ប៊ូតុងបិទ/បើក"</string>
@@ -306,6 +314,10 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"បានបិទការធ្វើតេស្ត​ប៊ូតុងបិទ/បើក"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"គំរូបង្ហាញនៃ​ទម្រង់គំរូផ្សេងៗ"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"គំរូបង្ហាញអំពីការតាំងរំលេច"</string>
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
+    <skip />
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
+    <skip />
     <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
     <skip />
     <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
@@ -333,4 +345,18 @@
     <string name="location_3_description" msgid="3982142774088944850">"សញ្ញាសម្គាល់ជាអក្សរ​ដែលមានពណ៌"</string>
     <string name="location_4_description" msgid="6560365445044381911">"ប៊ីតម៉ាបរូបភាព"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"ស្លាកអក្សរ"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-kn/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-kn/strings.xml
index ba97112..b5291c0 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-kn/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-kn/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"ಈ ಪಠ್ಯವು ಹಸಿರು ಬಣ್ಣದಲ್ಲಿದೆ"</string>
     <string name="example_3_text" msgid="977269832109695627">"ಈ ಪಠ್ಯವು ನೀಲಿ ಬಣ್ಣದಲ್ಲಿದೆ"</string>
     <string name="example_4_text" msgid="2043547015979437373">"ಈ ಪಠ್ಯವು ಹಳದಿ ಬಣ್ಣದಲ್ಲಿದೆ"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"ಈ ಪಠ್ಯವು ಪ್ರಾಥಮಿಕ ಬಣ್ಣವನ್ನು ಬಳಸುತ್ತದೆ"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"ಈ ಪಠ್ಯವು ದ್ವಿತೀಯ ಬಣ್ಣವನ್ನು ಬಳಸುತ್ತದೆ"</string>
     <string name="color_demo" msgid="1822427636476178993">"ಬಣ್ಣದ ಡೆಮೋ"</string>
     <string name="list_limit" msgid="3023536401535417286">"ಪಟ್ಟಿಯ ಮಿತಿ"</string>
@@ -232,6 +233,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"ಹೊಂದಾಣಿಕೆಯಾಗದ ಹೋಸ್ಟ್"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"ಸಂದೇಶದ ಟೆಂಪ್ಲೇಟ್ ಡೆಮೋ"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"ಸಂದೇಶವನ್ನು ಇಲ್ಲಿ ಟೈಪ್ ಮಾಡಲಾಗುತ್ತದೆ.\nಹೆಚ್ಚಿನ ಪಠ್ಯವನ್ನು ಎರಡನೇ ಸಾಲಿನಲ್ಲಿ ಸೇರಿಸಬಹುದು."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"ಪೇನ್ ಟೆಂಪ್ಲೇಟ್ ಡೆಮೋ"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"ಸ್ಥಳ ಪಟ್ಟಿಯ ಟೆಂಪ್ಲೇಟ್ ಡೆಮೋ"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"ಸ್ಥಳಗಳನ್ನು ಬ್ರೌಸ್ ಮಾಡಿ"</string>
@@ -267,7 +270,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"ಟಿಂಟ್‌ನೊಂದಿಗೆ ಚಿತ್ರಿಸಬಹುದಾದ ಒಂದು ವೆಕ್ಟರ್"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"ವೆಕ್ಟರ್‌ನ ಬಣ್ಣಕ್ಕಾಗಿ ಆ್ಯಪ್‌ನ ಥೀಮ್ ಗುಣಲಕ್ಷಣದೊಂದಿಗೆ ಚಿತ್ರಿಸಬಹುದಾದ ಒಂದು ವೆಕ್ಟರ್"</string>
     <string name="png_res_title" msgid="7437083018336747544">"PNG, ಸಂಪನ್ಮೂಲವಾಗಿ ಕಳುಹಿಸಲಾಗಿದೆ"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"PNG, ಸಂಪನ್ಮೂಲವಾಗಿ ಕಳುಹಿಸಲಾಗಿದೆ"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"ಶೀರ್ಷಿಕೆ ಮಾತ್ರ"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"ಆ್ಯಪ್ ಐಕಾನ್‌ನೊಂದಿಗೆ ಶೀರ್ಷಿಕೆ"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"ಸಂಪನ್ಮೂಲ ID ಚಿತ್ರದೊಂದಿಗೆ ಶೀರ್ಷಿಕೆ"</string>
@@ -279,6 +283,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"ಸಾಲುಗಳ ಡೆಮೋ"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"ಪಠ್ಯ ಮತ್ತು ಐಕಾನ್‌ಗಳ ಡೆಮೋ"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"ಪಠ್ಯ ಮತ್ತು ಐಕಾನ್‌ಗಳ ಡೆಮೋಗಳನ್ನು ಹೊಂದಿರುವ ಸಾಲುಗಳು"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"ಆಯ್ಕೆಮಾಡಬಹುದಾದ ಪಟ್ಟಿಗಳ ಡೆಮೋ"</string>
     <string name="option_1_title" msgid="7221252541651471199">"ಆಯ್ಕೆ 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"ಆಯ್ಕೆ 2"</string>
@@ -292,6 +298,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"ಕಾರ್ಯದ ಮಿತಿಯನ್ನು ತಲುಪಿದ್ದೀರಿ\nಮುಂದುವರಿಸಿದರೆ ಆ್ಯಪ್ ಅನ್ನು ಬಲವಂತವಾಗಿ ನಿಲ್ಲಿಸಲಾಗುತ್ತದೆ"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"ಕಾರ್ಯದ ಹಂತ %1$d of %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"ಮುಂದೆ ಹೋಗಲು ಕ್ಲಿಕ್ ಮಾಡಿ"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"ಟಾಗಲ್ ಟೆಸ್ಟ್"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"ಪುನಃ ಸ್ಥಾಪಿಸಬಹುದಾದ ಬದಲಾವಣೆಗಳನ್ನು ಅನುಮತಿಸಲಾಗಿದೆ"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"ಟಾಗಲ್ ಟೆಸ್ಟ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಿ"</string>
@@ -306,6 +314,10 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"ಟಾಗಲ್ ಟೆಸ್ಟ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"ಇತರ ಟೆಂಪ್ಲೇಟ್‌ಗಳ ಡೆಮೋಗಳು"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Showcase ಡೆಮೋಗಳು"</string>
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
+    <skip />
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
+    <skip />
     <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
     <skip />
     <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
@@ -333,4 +345,18 @@
     <string name="location_3_description" msgid="3982142774088944850">"ಬಣ್ಣದ ಪಠ್ಯ ಮಾರ್ಕರ್"</string>
     <string name="location_4_description" msgid="6560365445044381911">"ಚಿತ್ರದ ಬಿಟ್‌ಮ್ಯಾಪ್"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"ಪಠ್ಯದ ಲೇಬಲ್"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-ko/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-ko/strings.xml
index 400ec9b..db28c37 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-ko/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-ko/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"이 텍스트는 초록색임"</string>
     <string name="example_3_text" msgid="977269832109695627">"이 텍스트는 파란색임"</string>
     <string name="example_4_text" msgid="2043547015979437373">"이 텍스트는 노란색임"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"이 텍스트는 기본 색상을 사용함"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"이 텍스트는 보조 색상을 사용함"</string>
     <string name="color_demo" msgid="1822427636476178993">"색상 데모"</string>
     <string name="list_limit" msgid="3023536401535417286">"목록 제한"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"이렇게 하면 앱이 종료되고 재실행 시 미리 시드된 권한 화면이 표시됩니다"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"앱 데모 종료"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"다음 주행 데모 시 권한 화면 미리 시드"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"권한 미리 시드 앱 데모"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"다음 실행 시 권한 화면 미리 시드 데모"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"데모 로드 중"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"로드 완료"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"루트로 건너뛰기"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"호환되지 않는 호스트"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"메시지 템플릿 데모"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"여기에 메시지가 들어갑니다.\n추가 텍스트는 두 번째 줄에 입력됩니다."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"창 템플릿 데모"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"장소 목록 템플릿 데모"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"장소 둘러보기"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"벡터 드로어블, 색조 있음"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"벡터 드로어블, 색상에 관한 앱 테마 속성 있음"</string>
     <string name="png_res_title" msgid="7437083018336747544">"PNG, 리소스로 전송됨"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"PNG, 리소스로 전송됨"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"제목만"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"앱 아이콘이 포함된 제목"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"리소스 ID 이미지가 포함된 제목"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"행 데모"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"텍스트 및 아이콘 데모"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"텍스트와 아이콘이 있는 행 데모"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"선택 가능한 목록 데모"</string>
     <string name="option_1_title" msgid="7221252541651471199">"옵션 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"옵션 2"</string>
@@ -292,6 +296,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"작업 제한에 도달함\n계속 진행하면 앱이 강제 종료됩니다"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"작업 단계 %1$d/%2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"클릭하여 진행"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"전환 테스트"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"스테이트풀(Stateful) 변경은 허용됨"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"전환 테스트 사용 설정"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"전환 테스트 사용 중지됨"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"기타 템플릿 데모"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"쇼케이스 데모"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"음성 액세스 데모 화면"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"사용자 상호작용"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"권한 요청 데모"</string>
+    <string name="perm_group" msgid="3834918337351876270">"권한 그룹"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"쇼케이스 앱에 대한 권한 그룹"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"정확한 위치 액세스"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"정확한 위치 액세스 권한"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"대략적 위치 액세스"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"대략적 위치 액세스 권한"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"오디오 녹음 액세스"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"오디오 녹음 액세스 권한"</string>
     <string name="location_1_description" msgid="4801052291684791371">"색조가 들어간 리소스 벡터"</string>
     <string name="location_2_description" msgid="3331356135359047166">"이미지 리소스 비트맵"</string>
     <string name="location_3_description" msgid="3982142774088944850">"색상이 지정된 텍스트 마커"</string>
     <string name="location_4_description" msgid="6560365445044381911">"이미지 비트맵"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"텍스트 라벨"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-ky/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-ky/strings.xml
index 95f3022..6dd8744 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-ky/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-ky/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Бул тексттин түсү жашыл"</string>
     <string name="example_3_text" msgid="977269832109695627">"Бул тексттин түсү көк"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Бул тексттин түсү сары"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Бул текстте негизги түс колдонулган"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Бул текстте кошумча түс колдонулган"</string>
     <string name="color_demo" msgid="1822427636476178993">"Демону жабуу"</string>
     <string name="list_limit" msgid="3023536401535417286">"Тизме чеги"</string>
@@ -232,6 +233,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Шайкеш келбеген башкы түйүн"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Билдирүүнүн үлгүсүнүн демосу"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Билдирүүлөр бул жерде болот.\nТексттин калганы экинчи сапта болот."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Такта үлгүсүнүн демосу"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Орундар тизмесинин үлгүсүнүн демосу"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Жерлерди карап чыгуу"</string>
@@ -267,7 +270,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Тартылуучу вектор, кошумча түс менен"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Тартылуучу вектор, түс катары колдонмонун темасынын атрибуту"</string>
     <string name="png_res_title" msgid="7437083018336747544">"PNG, булак катары жөнөтүлгөн"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"PNG, булак катары жөнөтүлгөн"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Жөн эле аталыш"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Колдонмонун сүрөтчөсү бар аталыш"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Ресуртун ID сүрөтү бар аталыш"</string>
@@ -279,6 +283,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Саптар демосу"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Текст жана сүрөтчөлөр демосу"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Текст жана сүрөтчөлөр бар саптар демосу"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Тандалуучу тизмелердин демосу"</string>
     <string name="option_1_title" msgid="7221252541651471199">"1-параметр"</string>
     <string name="option_2_title" msgid="1905146448697963818">"2-параметр"</string>
@@ -292,6 +298,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Тапшырманын чегине жетти\nАлдыга жылсаңыз, колдонмо мажбурлап токтотулат"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Тапшырма кадамы %1$d of %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Алдыга өтүү үчүн чыкылдатыңыз"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Өчүрүү/күйгүзүү сыноосу"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Абалы сакталган өзгөртүүлөргө уруксат берилген"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Өчүрүү/күйгүзүү сыноосун иштетүү"</string>
@@ -306,6 +314,10 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Өчүрүү/күйгүзүү сыноосу өчүрүлдү"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Башка үлгүлөрдүн демолору"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Showcase демолору"</string>
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
+    <skip />
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
+    <skip />
     <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
     <skip />
     <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
@@ -333,4 +345,18 @@
     <string name="location_3_description" msgid="3982142774088944850">"Түстүү текст маркери"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Сүрөттүн бит. картасы"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Текст белгиси"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-lo/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-lo/strings.xml
index 90aa08d..b348199 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-lo/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-lo/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"ຂໍ້ຄວາມນີ້ມີສີຂຽວ"</string>
     <string name="example_3_text" msgid="977269832109695627">"ຂໍ້ຄວາມນີ້ມີສີຟ້າ"</string>
     <string name="example_4_text" msgid="2043547015979437373">"ຂໍ້ຄວາມນີ້ມີສີເຫຼືອງ"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"ຂໍ້ຄວາມນີ້ໃຊ້ສີຫຼັກ"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"ຂໍ້ຄວາມນີ້ໃຊ້ສີສຳຮອງ"</string>
     <string name="color_demo" msgid="1822427636476178993">"ເດໂມສີ"</string>
     <string name="list_limit" msgid="3023536401535417286">"ຂີດຈຳກັດລາຍຊື່"</string>
@@ -232,6 +233,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"ໂຮສເຂົ້າກັນບໍ່ໄດ້"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"ເດໂມແມ່ແບບຂໍໍ້ຄວາມ"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"ຂໍ້ຄວາມຢູ່ບ່ອນນີ້.\nຂໍ້ຄວາມເພີ່ມເຕີມຢູ່ແຖວທີສອງ."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"ເດໂມແມ່ແບບແຖບ"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"ເດໂມແມ່ແບບລາຍຊື່ສະຖານທີ່"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"ເລືອກເບິ່ງສະຖານທີ່"</string>
@@ -267,7 +270,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"ແຕ້ມເປັນເວັກເຕີໄດ້, ໂດຍມີສີອ່ອນ"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"ແຕ້ມເປັນເວັກເຕີໄດ້, ທີ່ມີຄຸນສົມບັດຮູບແບບສີສັນຂອງແອັບສຳລັບສີຂອງມັນ"</string>
     <string name="png_res_title" msgid="7437083018336747544">"PNG, ສົ່ງເປັນຊັບພະຍາກອນ"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"PNG, ສົ່ງເປັນຊັບພະຍາກອນ"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"ສະເພາະຊື່"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"ຊື່ທີ່ໄອຄອນແອັບ"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"ຊື່ທີ່ມີຮູບ ID ຊັບພະຍາກອນ"</string>
@@ -279,6 +283,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"ເດໂມແຖວ"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"ເດໂມຂໍ້ຄວາມ ແລະ ໄອຄອນ"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"ແຖວທີ່ມີຂໍ້ຄວາມ ແລະ ເດໂມໄອຄອນ"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"ເດໂມລາຍຊື່ທີ່ເລືອກໄດ້"</string>
     <string name="option_1_title" msgid="7221252541651471199">"ຕົວເລືອກ 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"ຕົວເລືອກ 2"</string>
@@ -292,6 +298,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"ຮອດຂີດຈຳກັດໜ້າວຽກແລ້ວ\nຕໍ່ໄປຈະບັງຄັບຢຸດແອັບ"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"ຂັ້ນຕອນໜ້າວຽກທີ %1$d ຈາກທັງໝົດ %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"ຄລິກເພື່ອໄປໜ້າ"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"ສະຫຼັບການທົດສອບ"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"ອະນຸຍາດໃຫ້ມີການປ່ຽນແປງສະຖານະໄດ້"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"ເປີດການນຳໃຊ້ການທົດສອບການສະຫຼັບ"</string>
@@ -306,6 +314,10 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"ປິດການນຳໃຊ້ການທົດສອບການສະຫຼັບ"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"ເດໂມແມ່ແບບອື່ນໆ"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"ເດໂມ Showcase"</string>
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
+    <skip />
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
+    <skip />
     <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
     <skip />
     <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
@@ -333,4 +345,18 @@
     <string name="location_3_description" msgid="3982142774088944850">"ຕົວໝາຍຂໍ້ຄວາມທີ່ມີສີ"</string>
     <string name="location_4_description" msgid="6560365445044381911">"ບິດແມັບຮູບ"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"ປ້າຍກຳກັບຂໍ້ຄວາມ"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-lt/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-lt/strings.xml
index 620a174..3d19e0b 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-lt/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-lt/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Šis tekstas žalios spalvos"</string>
     <string name="example_3_text" msgid="977269832109695627">"Šis tekstas mėlynos spalvos"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Šis tekstas geltonos spalvos"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Šiam tekstui naudojama pagrindinė spalva"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Šiam tekstui naudojama antrinė spalva"</string>
     <string name="color_demo" msgid="1822427636476178993">"Spalvos demonstracinė versija"</string>
     <string name="list_limit" msgid="3023536401535417286">"Sąrašo apribojimas"</string>
@@ -232,6 +233,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Nesuderinama priegloba"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Pranešimo šablono demonstracinė versija"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Čia pateikiamas pranešimas.\nDaugiau teksto antroje eilutėje."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Srities šablono demonstracinė versija"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Vietų sąrašo šablono demonstracinė versija"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Naršyti vietas"</string>
@@ -267,7 +270,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Braižomasis vektorius su atspalviu"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Braižomasis vektorius su programos temos atributu pagal jo spalvą"</string>
     <string name="png_res_title" msgid="7437083018336747544">"PNG, išsiųsta kaip šaltinis"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"PNG, išsiųsta kaip šaltinis"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Tik pavadinimas"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Pavadinimas su programos piktograma"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Pavadinimas su šaltinio ID vaizdu"</string>
@@ -279,6 +283,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Eilučių demonstracinė versija"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Teksto ir piktogramų demonstracinės versijos"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Eilučių su tekstu ir piktogramomis demonstracinė versija"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Pasirenkamų sąrašų demonstracinė versija"</string>
     <string name="option_1_title" msgid="7221252541651471199">"1 parinktis"</string>
     <string name="option_2_title" msgid="1905146448697963818">"2 parinktis"</string>
@@ -292,6 +298,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Pasiektas užduočių apribojimas\nTęsiant programa bus priverstinai sustabdyta"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"%1$d užduoties veiksmas iš %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Spustelėkite, jei norite tęsti"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Perjungti bandymą"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Leidžiami būsenos pakeitimai"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Įgalinti bandymo perjungimą"</string>
@@ -306,6 +314,10 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Bandymo perjungimas išjungtas"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Įvairių šablonų demonstracinės versijos"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Rodyti demonstracines versijas"</string>
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
+    <skip />
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
+    <skip />
     <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
     <skip />
     <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
@@ -333,4 +345,18 @@
     <string name="location_3_description" msgid="3982142774088944850">"Spalvoto teksto žymeklis"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Vaizdo taškinė grafika"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Teksto etiketė"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-lv/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-lv/strings.xml
index ef0df3d..767fd21 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-lv/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-lv/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Šis teksts ir zaļā krāsā"</string>
     <string name="example_3_text" msgid="977269832109695627">"Šis teksts ir zilā krāsā"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Šis teksts ir dzeltenā krāsā"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Šajā tekstā tiek izmantota primārā krāsa."</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Šajā tekstā tiek izmantota sekundārā krāsa."</string>
     <string name="color_demo" msgid="1822427636476178993">"Krāsas demonstrācija"</string>
     <string name="list_limit" msgid="3023536401535417286">"Saraksta ierobežojums"</string>
@@ -232,6 +233,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Nesaderīgs saimniekdators"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Ziņojuma veidnes demonstrācija"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Šeit ir ziņojums.\nPapildu teksts ir otrajā rindiņā."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Rūts veidnes demonstrācija"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Atrašanās vietu saraksta veidnes demonstrācija"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Vietu pārlūkošana"</string>
@@ -267,7 +270,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Zīmējams vektors, ar tonējumu"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Zīmējams vektors, ar lietotnes motīva atribūtu tā krāsai"</string>
     <string name="png_res_title" msgid="7437083018336747544">"PNG fails, nosūtīts kā resurss"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"PNG fails, nosūtīts kā resurss"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Tikai nosaukums"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Nosaukums ar lietotnes ikonu"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Nosaukums ar resursa ID attēlu"</string>
@@ -279,6 +283,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Rindiņu demonstrācija"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Teksta un ikonu demonstrācijas"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Rindiņu ar tekstu un ikonām demonstrācija"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Atlasāmu sarakstu demonstrācija"</string>
     <string name="option_1_title" msgid="7221252541651471199">"1. opcija"</string>
     <string name="option_2_title" msgid="1905146448697963818">"2. opcija"</string>
@@ -292,6 +298,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Sasniegts uzdevumu ierobežojums\nTurpinot lietotnes darbība tiks apturēta piespiedu kārtā."</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Uzdevuma darbība: %1$d. no %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Noklikšķiniet, lai dotos tālāk"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Pārslēgšanas tests"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Stāvokļa izmaiņas ir atļautas"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Iespējot pārslēgšanas testu"</string>
@@ -306,6 +314,10 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Pārslēgšanas tests ir atspējots"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Dažādu veidņu demonstrācijas"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Showcase demonstrācijas"</string>
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
+    <skip />
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
+    <skip />
     <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
     <skip />
     <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
@@ -333,4 +345,18 @@
     <string name="location_3_description" msgid="3982142774088944850">"Teksta krāsas marķieris"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Attēla bitkarte"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Teksta iezīme"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-mk/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-mk/strings.xml
index 4d7fba0..49a2324 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-mk/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-mk/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Текстов има зелена боја"</string>
     <string name="example_3_text" msgid="977269832109695627">"Текстов има сина боја"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Текстов има жолта боја"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Текстов ја користи примарната боја"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Текстов ја користи секундарната боја"</string>
     <string name="color_demo" msgid="1822427636476178993">"Демо за бои"</string>
     <string name="list_limit" msgid="3023536401535417286">"Ограничување на список"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"Ова ќе ја затвори апликацијата, а кога ќе ја отворите повторно, однапред ќе се постави екран за дозволи"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"Заврши го демото на апликацијата"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"Однапред додај го екранот за дозволи при следното извршување демо"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"Дозвола однапред за демо на апликација"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"Однапред додај го екранот за дозволи при следното извршување демо"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"Се вчитува демо"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"Вчитувањето заврши!"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"Оди до администраторски права"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Некомпатибилен хост"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Демо за шаблон на порака"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Пораката оди овде.\nУште текст во вториот ред."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Демо за шаблон на окно"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Демо за шаблон на список со места"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Прелистувајте места"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Векторски цртеж, со нијанса"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Векторски цртеж, со атрибут за тема на апликација за нејзината боја"</string>
     <string name="png_res_title" msgid="7437083018336747544">"PNG, испратено како ресурс"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"PNG, испратено како ресурс"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Само наслов"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Икона за наслов со апликација"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Слика за наслов со ID на ресурс"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Демо за редови"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Демоа за текст и икони"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Демо за редови со текст и икони"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Демо за списоци што може да се изберат"</string>
     <string name="option_1_title" msgid="7221252541651471199">"Опција 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"Опција 2"</string>
@@ -292,6 +296,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Достигнато е ограничувањето за задачи\nАко продолжите, апликацијата ќе се исклучи присилно"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Преземете чекор %1$d од %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Кликнете за да одите нанапред"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Тест за вклучување/исклучување"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Дозволени се промени на зачувувањето на состојбата"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Овозможете тест за вклучување/исклучување"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Оневозможено тест за вклучување/исклучување"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Разни демоа за шаблони"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Демоа за прикажување"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"Екран за демо за „Пристап со глас“"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"Кориснички интеракции"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"Побарајте дозволи за демо"</string>
+    <string name="perm_group" msgid="3834918337351876270">"Група дозволи"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"Група дозволи за апликација за вести избрани од издавачи"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"Пристап до точна локација"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"Дозвола за пристап до точна локација"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"Пристап до приближна локација"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"Дозвола за пристап до приближна локација"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"Пристап за снимање аудио"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"Дозвола за пристап за снимање аудио"</string>
     <string name="location_1_description" msgid="4801052291684791371">"Вектор за нијансиран ресурс"</string>
     <string name="location_2_description" msgid="3331356135359047166">"Мапа со битови на ресурсот за сликата"</string>
     <string name="location_3_description" msgid="3982142774088944850">"Означувач за текст во боја"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Мапа со битови на слика"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Текстуална ознака"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-ml/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-ml/strings.xml
index 76669e1..9921b2ab 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-ml/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-ml/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"ഈ ടെക്സ്റ്റിൽ പച്ച നിറമുണ്ട്"</string>
     <string name="example_3_text" msgid="977269832109695627">"ഈ ടെക്സ്റ്റിൽ നീല നിറമുണ്ട്"</string>
     <string name="example_4_text" msgid="2043547015979437373">"ഈ ടെക്സ്റ്റിൽ മഞ്ഞ നിറമുണ്ട്"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"ഈ ടെക്സ്റ്റ് പ്രാഥമിക നിറം ഉപയോഗിക്കുന്നു"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"ഈ ടെക്സ്റ്റ് ദ്വിതീയ നിറം ഉപയോഗിക്കുന്നു"</string>
     <string name="color_demo" msgid="1822427636476178993">"നിറത്തിന്റെ ഡെമോ"</string>
     <string name="list_limit" msgid="3023536401535417286">"ലിസ്റ്റ് പരിധി"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"ഇത് ആപ്പിന്റെ പ്രവർത്തനം നിർത്തും, നിങ്ങൾ തിരികെ വരുമ്പോൾ ഇത് ഒരു അനുമതി സ്ക്രീൻ പ്രീ-സീഡ് ചെയ്യും"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"ആപ്പ് ഡെമോ പൂർത്തിയാക്കുക"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"അടുത്ത തവണ റൺ ചെയ്യുമ്പോൾ അനുമതി സ്ക്രീൻ പ്രീ-സീഡ് ചെയ്യുന്നതിന്റെ ഡെമോ"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"പ്രീ-സീഡ് അനുമതി ആപ്പ് ഡെമോ"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"അടുത്ത തവണ ഡെമോ റൺ ചെയ്യുമ്പോൾ അനുമതി സ്ക്രീൻ പ്രീ-സീഡ് ചെയ്യുക"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"ലോഡ് ചെയ്യൽ ഡെമോ"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"ലോഡ് ചെയ്യൽ പൂർത്തിയായി!"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"പ്രധാന സ്ക്രീൻ ദൃശ്യമാക്കുക"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"അനുയോജ്യമല്ലാത്ത ഹോസ്റ്റ്"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"സന്ദേശ ടെംപ്ലേറ്റ് ഡെമോ"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"സന്ദേശങ്ങൾ ഇവിടെ കാണാം.\nകൂടുതലുള്ള ടെക്സ്റ്റ് രണ്ടാമത്തെ വരിയിലും."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"പെയിൻ ടെംപ്ലേറ്റ് ഡെമോ"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"സ്ഥലങ്ങളുടെ ലിസ്റ്റിന്റെ ടെംപ്ലേറ്റ് ഡെമോ"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"സ്ഥലങ്ങൾ ബ്രൗസ് ചെയ്യുക"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"വെക്ടർ വരയ്ക്കാനാകും, നിറം നൽകിക്കൊണ്ട്"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"വെക്ടർ വരയ്ക്കാനാകും, അതിന്റെ നിറത്തിനായി ഒരു ആപ്പിന്റെ തീം ആട്രിബ്യൂട്ട് ഉപയോഗിച്ച്"</string>
     <string name="png_res_title" msgid="7437083018336747544">"ഒരു PNG, റിസോഴ്‌സ് ആയി അയച്ചു"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"ഒരു PNG, റിസോഴ്‌സ് ആയി അയച്ചു"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"വെറുമൊരു പേരാണ്"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"പേരും ആപ്പ് ഐക്കണും"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"റിസോഴ്‌സ് ഐഡി ചിത്രമുള്ള പേര്"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"വരികളുടെ ഡെമോ"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"ടെക്സ്റ്റിന്റെയും ഐക്കണുകളുടെയും ഡെമോകൾ"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"ടെക്സ്റ്റും ഐക്കണുകളുമുള്ള വരികളുടെ ഡെമോ"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"തിരഞ്ഞെടുത്ത ലിസ്റ്റുകളുടെ ഡെമോ"</string>
     <string name="option_1_title" msgid="7221252541651471199">"ഓപ്ഷൻ 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"ഓപ്ഷൻ 2"</string>
@@ -292,6 +296,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"ടാസ്ക്ക് പരിധിയെത്തി\nമുന്നോട്ട് പോകുന്നത് ആപ്പ് നിർബന്ധിതമായി നിർത്താൻ കാരണമാകും"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"%2$d ടാസ്ക്ക് ഘട്ടങ്ങളിൽ %1$d -ാമത്തേത്"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"മുന്നോട്ട് പോകാൻ ക്ലിക്ക് ചെയ്യുക"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"ടെസ്റ്റ് മാറ്റുക"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"സ്റ്റേറ്റ്ഫുള്ളായ മാറ്റങ്ങൾ അനുവദനീയമാണ്"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"ടോഗിൾ ടെസ്‌റ്റ് പ്രവർത്തനക്ഷമമാക്കുക"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"ടോഗിൾ ടെസ്‌റ്റ് പ്രവർത്തനരഹിതമാക്കി"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"പലവക ടെംപ്ലേറ്റ് ഡെമോകൾ"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"ഡെമോകൾ ഷോക്കേസ് ചെയ്യുക"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"Voice Access ഡെമോ സ്ക്രീൻ"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"ഉപയോക്തൃ ഇടപഴകലുകൾ"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"അനുമതി ഡെമോകൾ അഭ്യർത്ഥിക്കുക"</string>
+    <string name="perm_group" msgid="3834918337351876270">"അനുമതി ഗ്രൂപ്പ്"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"Showcase ആപ്പിനുള്ള അനുമതി ഗ്രൂപ്പ്"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"ഫൈൻ ലൊക്കേഷനിലേക്കുള്ള ആക്സസ്"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"ഫൈൻ ലൊക്കേഷനിലേക്ക് ആക്സസിനുള്ള അനുമതി"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"കോഴ്സ് ലൊക്കേഷനിലേക്കുള്ള ആക്സസ്"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"കോഴ്സ് ലൊക്കേഷനിലേക്ക് ആക്സസിനുള്ള അനുമതി"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"ഓഡിയോ റെക്കോർഡ് ചെയ്യാനുള്ള ആക്സസ്"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"ഓഡിയോ റെക്കോർഡ് ചെയ്യാനുള്ള ആക്സസിനുള്ള അനുമതി"</string>
     <string name="location_1_description" msgid="4801052291684791371">"നിറമുള്ള റിസോഴ്‌സ് വെക്‌ടർ"</string>
     <string name="location_2_description" msgid="3331356135359047166">"ഇമേജ് റിസോഴ്‌സ് ബിറ്റ്മാപ്പ്"</string>
     <string name="location_3_description" msgid="3982142774088944850">"ടെക്സ്റ്റ് മാർക്കറിന് നിറം നൽകി"</string>
     <string name="location_4_description" msgid="6560365445044381911">"ഇമേജ് ബിറ്റ്മാപ്പ്"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"ടെക്സ്റ്റ് ലേബൽ"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-mn/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-mn/strings.xml
index 4ad951a..f614337 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-mn/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-mn/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Энэ текст ногоон өнгөтэй байна"</string>
     <string name="example_3_text" msgid="977269832109695627">"Энэ текст хөх өнгөтэй байна"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Энэ текст шар өнгөтэй байна"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Энэ текст үндсэн өнгийг ашиглаж байна"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Энэ текст хоёрдогч өнгийг ашиглаж байна"</string>
     <string name="color_demo" msgid="1822427636476178993">"Өнгөний демо"</string>
     <string name="list_limit" msgid="3023536401535417286">"Жагсаалтын хязгаар"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"Энэ нь аппыг дуусгаж, таныг үүнийг буцаах үед зөвшөөрлийн дэлгэцийг урьдчилан бэлтгэнэ"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"Аппын демог дуусгах"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"Демог дараагийн удаа ажиллуулах үед Зөвшөөрлийн дэлгэцийг урьдчилан бэлтгэнэ"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"Аппын демог урьдчилан бэлтгэх зөвшөөрөл"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"Демог дараагийн удаа ажиллуулах үед Зөвшөөрлийн дэлгэцийг урьдчилан бэлтгэнэ"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"Демог ачаалж байна"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"Ачаалж дууслаа!"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"Үндсэн хандалт руу үсрэх"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Тохиромжгүй хост"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Мессежийн загварын демо"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Мессеж энд ирнэ.\nХоёр дахь мөрд бусад текст бий."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Хэсгийн загварын демо"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Газрын жагсаалтын загварын демо"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Газруудыг үзэх"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Зурах боломжтой өнгө оруулсан вектор"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Аппын загвар атрибутын өнгийг ашигласан зурах боломжтой вектор"</string>
     <string name="png_res_title" msgid="7437083018336747544">"PNG, нөөцөөр илгээсэн"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"PNG, нөөцөөр илгээсэн"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Зөвхөн гарчиг"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Аппын дүрс тэмдэгтэй гарчиг"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Нөөцийн ID-ны зурагтай гарчиг"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Мөрийн демо"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Текст болон дүрс тэмдгийн демо"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Текст болон дүрс тэмдэгтэй мөрийн демо"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Сонгох боломжтой жагсаалтын демо"</string>
     <string name="option_1_title" msgid="7221252541651471199">"Сонголт 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"Сонголт 2"</string>
@@ -292,6 +296,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Ажлын хязгаарт хүрсэн\nҮргэлжлүүлснээр аппыг хүчээр зогсооно"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Ажлын %2$d-н %1$d-р алхам"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Үргэлжлүүлэхийн тулд товшино уу"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Асаах/Унтраах туршилт"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Төлөвтэй өөрчлөлтийг зөвшөөрнө"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Асаах/Унтраах туршилтыг идэвхжүүлэх"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Асаах/Унтраах туршилтыг идэвхгүй болгосон"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Холимог загварын демо"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Showcase-н демо"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"Voice Access-н демо дэлгэц"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"Хэрэглэгчийн харилцан үйлдлүүд"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"Зөвшөөрлийн демогийн хүсэлт тавих"</string>
+    <string name="perm_group" msgid="3834918337351876270">"Зөвшөөрлийн бүлэг"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"Showcase аппын зөвшөөрлийн бүлэг"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"Нарийвчилсан байршилд хандах"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"Нарийвчилсан байршилд хандах зөвшөөрөл"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"Тодорхойгүй байршилд хандах"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"Тодорхойгүй байршилд хандах зөвшөөрөл"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"Аудио бичихэд хандах"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"Аудио бичихэд хандах зөвшөөрөл"</string>
     <string name="location_1_description" msgid="4801052291684791371">"Өнгө оруулсан нөөцийн вектор"</string>
     <string name="location_2_description" msgid="3331356135359047166">"Зургийн нөөцийн растер"</string>
     <string name="location_3_description" msgid="3982142774088944850">"Өнгөтэй текстийн тэмдэглэгээ"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Зургийн растер"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Текстийн шошго"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-mr/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-mr/strings.xml
index 64a129a..487e380 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-mr/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-mr/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"या मजकुरामध्ये हिरवा रंग आहे"</string>
     <string name="example_3_text" msgid="977269832109695627">"या मजकुरामध्ये निळा रंग आहे"</string>
     <string name="example_4_text" msgid="2043547015979437373">"या मजकुरामध्ये पिवळा रंग आहे"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"हा मजकूर प्राथमिक रंग वापरतो"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"हा मजकूर दुय्यम रंग वापरतो"</string>
     <string name="color_demo" msgid="1822427636476178993">"रंगाचा डेमो"</string>
     <string name="list_limit" msgid="3023536401535417286">"सूचीची मर्यादा"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"यामुळे ॲप बंद केले जाईल आणि तुम्ही ते रीस्टार्ट कराल, तेव्हा ते परवानगीची स्क्रीन प्री-सेट करेल"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"अ‍ॅप बंद केल्याचा डेमो"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"पुढच्यावेळी डेमो रन करताना परवानगीची स्क्रीन प्री-सेट करा"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"प्री-सीड परवानगी अ‍ॅप डेमो"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"पुढील वेळी डेमो रन करताना परवानगी स्क्रीन प्री-सीड करा"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"डेमो लोड करत आहे"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"लोड करणे पूर्ण झाले!"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"मुख्य स्क्रीनवर जा"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"कंपॅटिबल नसलेला होस्ट"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"मेसेजच्या टेंप्लेटचा डेमो"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"मेसेज येथे दिसतात.\nदुसऱ्या ओळीवर आणखी मजकूर आहे."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"पेनशी संबंधित टेंप्लेटचा डेमो"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"ठिकाणाच्या सूचीशी संबंधित टेंप्लेटचा डेमो"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"ठिकाणे ब्राउझ करा"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"छटा वापरून रेखांकन करण्यायोग्य व्हेक्टर"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"रंग म्हणून अ‍ॅपच्या थीमची ॲट्रिब्यूट वापरून रेखांकन करण्यायोग्य व्हेक्टर"</string>
     <string name="png_res_title" msgid="7437083018336747544">"एक PNG, जी स्रोत म्हणून पाठवली आहे"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"एक PNG, जी स्रोत म्हणून पाठवली आहे"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"फक्त एक शीर्षक"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"अ‍ॅपचा आयकन असलेले शीर्षक"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"स्रोत आयडीची इमेज असलेले शीर्षक"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"पंक्तींचा डेमो"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"मजकूर आणि आयकनचे डेमो"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"मजकूर आणि आयकन असलेल्या पंक्तींचा डेमो"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"निवडण्यायोग्य सूचींचा डेमो"</string>
     <string name="option_1_title" msgid="7221252541651471199">"पर्याय १"</string>
     <string name="option_2_title" msgid="1905146448697963818">"पर्याय २"</string>
@@ -292,6 +296,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"टास्कची मर्यादा गाठली आहे\nपुढे सुरू ठेवल्यास, अ‍ॅप सक्तीने थांबवले जाईल"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"टास्कची %1$d पैकी %2$d पायरी"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"पुढे जाण्यासाठी क्लिक करा"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"टॉगल करण्याशी संबंधित चाचणी"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"स्थितीशी संबंधित बदलांना अनुमती आहे"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"टॉगल करण्याशी संबंधित चाचणी सुरू करा"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"टॉगल करण्याशी संबंधित चाचणी बंद केली"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"इतर टेंप्लेटचे डेमो"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"डेमो दाखवा"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"Voice Access डेमो स्क्रीन"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"वापरकर्ता संवाद"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"परवानग्या डेमोची विनंती करा"</string>
+    <string name="perm_group" msgid="3834918337351876270">"परवानगी गट"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"Showcase अ‍ॅपसाठी परवानगी गट"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"अचूक स्थान याचा अ‍ॅक्सेस"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"अचूक स्थान याच्या अ‍ॅक्सेसची परवानगी"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"अंदाजे स्थान याचा अ‍ॅक्सेस"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"अंदाजे स्थान याच्या अ‍ॅक्सेसची परवानगी"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"ऑडिओ रेकॉर्ड करण्याचा अ‍ॅक्सेस"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"ऑडिओ रेकॉर्ड करण्याच्या अ‍ॅक्सेसची परवानगी"</string>
     <string name="location_1_description" msgid="4801052291684791371">"छटा असलेले स्रोत व्हेक्टर"</string>
     <string name="location_2_description" msgid="3331356135359047166">"इमेज स्रोताचा बिटमॅप"</string>
     <string name="location_3_description" msgid="3982142774088944850">"मजकुराचा रंगीत मार्कर"</string>
     <string name="location_4_description" msgid="6560365445044381911">"इमेजचा बिटमॅप"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"मजकुराचे लेबल"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-ms/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-ms/strings.xml
index 4524605..b9b2c74f 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-ms/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-ms/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Teks ini mempunyai warna hijau"</string>
     <string name="example_3_text" msgid="977269832109695627">"Teks ini mempunyai warna biru"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Teks ini mempunyai warna kuning"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Teks ini menggunakan warna utama"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Teks ini menggunakan warna sekunder"</string>
     <string name="color_demo" msgid="1822427636476178993">"Demo Warna"</string>
     <string name="list_limit" msgid="3023536401535417286">"Had Senarai"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"Hal ini akan menyelesaikan apl dan apabila anda kembali, skrin kebenaran akan disemai terlebih dahulu"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"Selesaikan Demo Apl"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"Semai Kebenaran Skrin terlebih dahulu pada larian Demo seterusnya"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"Semai kebenaran Demo Apl terlebih dahulu"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"Semai Kebenaran Skrin terlebih dahulu pada larian Demo yang seterusnya"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"Memuatkan Demo"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"Pemuatan Selesai!"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"Pergi ke akar"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Hos tidak serasi"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Demo Templat Mesej"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Mesej di sini.\nLebih banyak teks pada baris kedua."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Demo Templat Anak Tetingkap"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Demo Templat Senarai Tempat"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Semak Imbas Tempat"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Vektor yang boleh dilukis dengan seri warna"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Vektor yang boleh dilukis dengan atribut tema apl untuk warna"</string>
     <string name="png_res_title" msgid="7437083018336747544">"PNG, dihantar sebagai sumber"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"PNG, dihantar sebagai sumber"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Hanya tajuk"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Tajuk dengan ikon apl"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Tajuk dengan imej ID sumber"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Demo Baris"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Demo Teks dan Ikon"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Baris dengan Demo Teks dan Ikon"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Demo Senarai yang Boleh Dipilih"</string>
     <string name="option_1_title" msgid="7221252541651471199">"Pilihan 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"Pilihan 2"</string>
@@ -292,6 +296,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Had tugasan dicapai\nMaju ke hadapan akan henti paksa apl"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Langkah tugasan %1$d daripada %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Klik untuk maju"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Togol ujian"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Perubahan keadaan dibenarkan"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Dayakan Ujian Togol"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Ujian Togol Dilumpuhkan"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Pelbagai Demo Templat"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Demo Wadah"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"Skrin Demo Akses Suara"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"Interaksi Pengguna"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"Demo Minta Kebenaran"</string>
+    <string name="perm_group" msgid="3834918337351876270">"Kumpulan Kebenaran"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"Kumpulan Kebenaran untuk Apl Wadah"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"Akses kepada Lokasi Halus"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"Kebenaran untuk Mengakses Lokasi Halus"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"Akses kepada Lokasi Kasar"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"Kebenaran untuk Mengakses Lokasi Kasar"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"Akses untuk Merakam Audio"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"Kebenaran bagi Akses untuk Merakam Audio"</string>
     <string name="location_1_description" msgid="4801052291684791371">"Vektor sumber diwarnai"</string>
     <string name="location_2_description" msgid="3331356135359047166">"Peta bit sumber imej"</string>
     <string name="location_3_description" msgid="3982142774088944850">"Penanda teks berwarna"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Peta bit imej"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Label teks"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-my/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-my/strings.xml
index a6bfbf1..e241439 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-my/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-my/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"ဤစာသားတွင် အစိမ်းရောင် ပါဝင်သည်"</string>
     <string name="example_3_text" msgid="977269832109695627">"ဤစာသားတွင် အပြာရောင် ပါဝင်သည်"</string>
     <string name="example_4_text" msgid="2043547015979437373">"ဤစာသားတွင် အဝါရောင် ပါဝင်သည်"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"ဤစာသားတွင် ပင်မအရောင် သုံးထားသည်"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"ဤစာသားတွင် ဒုတိယအရောင် သုံးထားသည်"</string>
     <string name="color_demo" msgid="1822427636476178993">"အရောင် သရုပ်ပြချက်"</string>
     <string name="list_limit" msgid="3023536401535417286">"စာရင်းကန့်သတ်ချက်"</string>
@@ -232,6 +233,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"ဆာဗာပင်ရင်း သဟဇာတ မဖြစ်ပါ"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"မက်ဆေ့ဂျ် ပုံစံသရုပ်ပြချက်"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"မက်ဆေ့ဂျ်များ ဤနေရာတွင်ပြမည်။\nဒုတိယစာကြောင်းတွင် စာသားပိုထည့်မည်။"</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"အကန့် ပုံစံနမူနာ"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"နေရာစာရင်း ပုံစံသရုပ်ပြချက်"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"နေရာများကြည့်ရှုရန်"</string>
@@ -267,7 +270,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"အရောင်ထည့်သွင်းမှု ပါသော ဗက်တာရုပ်ပုံ"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"၎င်း၏အရောင်အတွက် အက်ပ်၏အပြင်အဆင် ရည်ညွှန်းချက်ပါသော ဗက်တာရုပ်ပုံ"</string>
     <string name="png_res_title" msgid="7437083018336747544">"PNG၊ ရင်းမြစ်အဖြစ် ပို့ထားသည်"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"PNG၊ ရင်းမြစ်အဖြစ် ပို့ထားသည်"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"ခေါင်းစဉ်သာ"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"အက်ပ်သင်္ကေတပါသော ခေါင်းစဉ်"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"ရင်းမြစ် ID ပုံပါသော ခေါင်းစဉ်"</string>
@@ -279,6 +283,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"အတန်းများ သရုပ်ပြချက်"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"စာသားနှင့် သင်္ကေတ သရုပ်ပြချက်များ"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"စာသားနှင့် သင်္ကေတများ ပါဝင်သော အတန်းများ သရုပ်ပြချက်"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"ရွေးချယ်နိုင်သည့်စာရင်းများ သရုပ်ပြချက်"</string>
     <string name="option_1_title" msgid="7221252541651471199">"နည်းလမ်း ၁"</string>
     <string name="option_2_title" msgid="1905146448697963818">"နည်းလမ်း ၂"</string>
@@ -292,6 +298,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"လုပ်ဆောင်စရာကန့်သတ်ချက် ရောက်သွားပြီ\nရှေ့ဆက်သွားခြင်းက အက်ပ်ကို မဖြစ်မနေရပ်ခိုင်းမည်"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"လုပ်ဆောင်စရာအဆင့် %2$d ခုအနက် %1$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"ရှေ့ဆက်သွားရန် နှိပ်ပါ"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"စစ်ဆေးမှု ပြောင်းခြင်း"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"အနေအထားအပြည့် အပြောင်းအလဲများ ခွင့်ပြုထားသည်"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"စမ်းသပ်ခလုတ် ဖွင့်ရန်"</string>
@@ -306,6 +314,10 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"စမ်းသပ်ခလုတ် ပိတ်ထားသည်"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"အထွေထွေ ပုံစံသရုပ်ပြချက်များ"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Showcase သရုပ်ပြချက်များ"</string>
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
+    <skip />
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
+    <skip />
     <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
     <skip />
     <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
@@ -333,4 +345,18 @@
     <string name="location_3_description" msgid="3982142774088944850">"အရောင်ထည့်ထားသော စာသားညွှန်မှတ်"</string>
     <string name="location_4_description" msgid="6560365445044381911">"ပုံ bitmap"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"စာသားအညွှန်း"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-nb/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-nb/strings.xml
index f0145d9..dda2754 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-nb/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-nb/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Denne teksten har en grønn farge"</string>
     <string name="example_3_text" msgid="977269832109695627">"Denne teksten har en blå farge"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Denne teksten har en gul farge"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Denne teksten bruker hovedfargen"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Denne fargen bruker sekundærfargen"</string>
     <string name="color_demo" msgid="1822427636476178993">"Fargedemo"</string>
     <string name="list_limit" msgid="3023536401535417286">"Listegrense"</string>
@@ -232,6 +233,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Inkompatibel vert"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Demo av meldingsmal"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Meldingen skal skrives her.\nMer tekst i den andre linjen."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Demo av panelmal"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Demo av mal for stedsliste"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Bla gjennom steder"</string>
@@ -267,7 +270,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"En vektor-drawable, med fargetone"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"En vektor-drawable, med temaattributten til en app som farge"</string>
     <string name="png_res_title" msgid="7437083018336747544">"En PNG-fil, sendt som en ressurs"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"En PNG-fil, sendt som en ressurs"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Bare en tittel"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Tittel med appikon"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Tittel med bilde av ressurs-ID"</string>
@@ -279,6 +283,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Demo av rader"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Demoer for tekst og ikoner"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Demo av rader med tekst og ikoner"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Demo av velgbare lister"</string>
     <string name="option_1_title" msgid="7221252541651471199">"Alternativ 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"Alternativ 2"</string>
@@ -292,6 +298,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Oppgavegrensen er nådd\nHvis du fortsetter, blir appen tvunget til å avslutte"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Oppgavetrinn %1$d av %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Klikk for å fortsette"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Test av/på-knapp"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Dynamiske endringer er tillatt"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Aktiver test av av/på-knapp"</string>
@@ -306,6 +314,10 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Test av av/på-knapp er deaktivert"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Demoer av diverse maler"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Demoer i fokus"</string>
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
+    <skip />
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
+    <skip />
     <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
     <skip />
     <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
@@ -333,4 +345,18 @@
     <string name="location_3_description" msgid="3982142774088944850">"Farget tekstmarkør"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Punktgrafikkbilde"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Tekstetikett"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-ne/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-ne/strings.xml
index acb3fd7..a046537 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-ne/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-ne/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"यो टेक्स्ट हरियो रङको हो"</string>
     <string name="example_3_text" msgid="977269832109695627">"यो टेक्स्ट निलो रङको हो"</string>
     <string name="example_4_text" msgid="2043547015979437373">"यो टेक्स्ट पहेँलो रङको हो"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"यो टेक्स्टले मुख्य रङ प्रयोग गर्छ"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"यो टेक्स्टले सहायक रङ प्रयोग गर्छ"</string>
     <string name="color_demo" msgid="1822427636476178993">"रङको डेमो"</string>
     <string name="list_limit" msgid="3023536401535417286">"सूचीको सीमा"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"यस कार्यले एप बन्द हुने छ र तपाईंले एप पुनः सुरु गर्नुभयो भने अनुमतिका लागि अनुरोध गर्ने स्क्रिन देखिने छ"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"एपको डेमो बन्द गर्नुहोस्"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"तपाईंले अर्को पटक डेमो सुरु गर्दा अनुमति माग्न अनुरोध गर्ने स्क्रिन थपिने छ"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"एपको डेमो सुरु गर्ने अनुमति"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"अर्को पटक डेमो सुरु गर्दा अनुमति माग्ने गर्ने स्क्रिन देखाइयोस्"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"डेमो लोड हुँदै छ"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"लोड गर्ने कार्य पूरा भयो!"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"पहिलो स्क्रिनमा जानुहोस्"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"अमिल्दो होस्ट"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"म्यासेजको टेम्प्लेटको डेमो"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"म्यासेज यहाँ लेखिने छ।\nथप टेक्स्ट लेख्न दोस्रो हरफमा जानुहोस्।"</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"पेनको टम्प्लेटको डेमो"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"ठाउँको सूचीको टेम्प्लेटको डेमो"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"ठाउँहरू ब्राउज गर्नुहोस्"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"रङ भएको चित्र बनाउन मिल्ने भेक्टर"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"एपको थिमको विशेषता भएको रङमा चित्र बनाउन मिल्ने भेक्टर"</string>
     <string name="png_res_title" msgid="7437083018336747544">"स्रोतका रूपमा पठाइएको एउटा PNG फाइल"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"स्रोतका रूपमा पठाइएको एउटा PNG फाइल"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"शीर्षक मात्र हो"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"एपको आइकन भएको शीर्षक"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"स्रोत ID को फोटो भएको शीर्षक"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"रोहरूको डेमो"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"टेक्स्ट र आइकनहरूको डेमो"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"टेक्स्ट र आइकनहरू भएका रोहरूको डेमो"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"चयन गर्न मिल्ने सूचीहरूको डेमो"</string>
     <string name="option_1_title" msgid="7221252541651471199">"विकल्प १"</string>
     <string name="option_2_title" msgid="1905146448697963818">"विकल्प २"</string>
@@ -292,6 +296,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"कार्यको सीमा सकियो\nतपाईं अगाडि बढ्नुभयो भने एप जबरजस्ती रोकिने छ"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"%2$d कार्यको %1$d औँ चरण"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"अगाडि बढ्न क्लिक गर्नुहोस्"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"टगल टेस्ट"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"स्टेटफुल परिवर्तन गर्ने अनुमति छ"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"टगल टेस्ट अन गर्नुहोस्"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"टगल टेस्ट अफ गरिएको छ"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"टेम्प्लेटका विविध डेमोहरू"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"सोकेसहरूको डेमो"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"Voice Access को डेमो स्क्रिन"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"प्रयोगकर्ताले गरेका अन्तर्क्रिया"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"अनुमतिहरूका डेमोहरू माग्नुहोस्"</string>
+    <string name="perm_group" msgid="3834918337351876270">"अनुमतिको समूह"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"Showcase एपलाई दिइएको अनुमतिको समूह"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"सटीक लोकेसन प्रयोग गर्ने अनुमति"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"सटीक लोकेसन प्रयोग गर्ने अनुमति"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"अनुमानित लोकेसन प्रयोग गर्ने अनुमति"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"अनुमानित लोकेसन प्रयोग गर्ने अनुमति"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"अडियो रेकर्ड गर्ने अनुमति"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"अडियो रेकर्ड गर्ने अनुमति"</string>
     <string name="location_1_description" msgid="4801052291684791371">"रङ्गीन स्रोतको भेक्टर"</string>
     <string name="location_2_description" msgid="3331356135359047166">"फोटो स्रोतको बिटम्याप"</string>
     <string name="location_3_description" msgid="3982142774088944850">"रङ्गीन टेक्स्ट मार्कर"</string>
     <string name="location_4_description" msgid="6560365445044381911">"फोटोको बिटम्याप"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"टेक्स्टको लेबल"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-nl/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-nl/strings.xml
index 66684e4..d5b169c 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-nl/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-nl/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Deze tekst heeft een groene kleur"</string>
     <string name="example_3_text" msgid="977269832109695627">"Deze tekst heeft een blauwe kleur"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Deze tekst heeft een gele kleur"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Deze tekst gebruikt de primaire kleur"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Deze tekst gebruikt de secundaire kleur"</string>
     <string name="color_demo" msgid="1822427636476178993">"Demo van kleur"</string>
     <string name="list_limit" msgid="3023536401535417286">"Lijstlimiet"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"Hiermee wordt de app gesloten. Als je terugkeert, zie je een toestemmingsscherm."</string>
     <string name="finish_app_title" msgid="9013328479438745074">"App-demo beëindigen"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"Toestemmingsscherm tonen bij volgende uitvoering van Demo"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"Toestemming tonen voor app-demo"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"Toestemmingsscherm tonen bij volgende uitvoering van Demo"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"Demo laden"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"Laden afgerond"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"Spring naar root"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Incompatibele host"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Demo van berichttemplate"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Bericht komt hier.\nMeer tekst op tweede regel."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Demo van deelvenstertemplate"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Demo template voor plaatslijst"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Browsen door plaatsen"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Een tekenbare vector, met een tint"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Een tekenbare vector, met het themakenmerk van een app voor de kleur"</string>
     <string name="png_res_title" msgid="7437083018336747544">"Een png, gestuurd als bron"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"Een png, gestuurd als bron"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Gewoon een titel"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Titel met app-icoon"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Titel met afbeelding van bron-ID"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Demo van rijen"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Demo\'s van tekst en iconen"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Demo van rijen met tekst en iconen"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Demo selecteerbare lijsten"</string>
     <string name="option_1_title" msgid="7221252541651471199">"Optie 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"Optie 2"</string>
@@ -292,6 +296,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Taaklimiet bereikt\nAls je doorgaat, wordt de app geforceerd gestopt"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Taakstap %1$d van %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Klik om verder te gaan"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Test aan-/uitzetten"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Stateful wijzigingen zijn toegestaan"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Schakeltest aanzetten"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Schakeltest uitgezet"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Diverse templatedemo\'s"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Demo\'s laten zien"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"Demoscherm voor Spraaktoegang"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"Gebruikersinteracties"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"Rechtendemo\'s aanvragen"</string>
+    <string name="perm_group" msgid="3834918337351876270">"Rechtengroep"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"Rechtengroep voor Showcase-app"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"Toegang tot exacte locatie"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"Recht voor toegang tot exacte locatie"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"Toegang tot geschatte locatie"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"Recht voor toegang tot geschatte locatie"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"Toegang tot Audio opnemen"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"Recht voor toegang tot Audio opnemen"</string>
     <string name="location_1_description" msgid="4801052291684791371">"Getinte bronvector"</string>
     <string name="location_2_description" msgid="3331356135359047166">"Bitmap afbeeldingsbron"</string>
     <string name="location_3_description" msgid="3982142774088944850">"Gekleurde tekstmarkering"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Bitmap van afbeelding"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Tekstlabel"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-or/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-or/strings.xml
index 2a557bef..4462d3a 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-or/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-or/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"ଏହି ଟେକ୍ସଟରେ ସବୁଜ ରଙ୍ଗ ଅଛି"</string>
     <string name="example_3_text" msgid="977269832109695627">"ଏହି ଟେକ୍ସଟରେ ନୀଳ ରଙ୍ଗ ଅଛି"</string>
     <string name="example_4_text" msgid="2043547015979437373">"ଏହି ଟେକ୍ସଟରେ ହଳଦିଆ ରଙ୍ଗ ଅଛି"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"ଏହି ଟେକ୍ସଟ ପ୍ରାଥମିକ ରଙ୍ଗ ବ୍ୟବହାର କରେ"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"ଏହି ଟେକ୍ସଟ ଦ୍ୱିତୀୟ ରଙ୍ଗ ବ୍ୟବହାର କରେ"</string>
     <string name="color_demo" msgid="1822427636476178993">"ରଙ୍ଗର ଡେମୋ"</string>
     <string name="list_limit" msgid="3023536401535417286">"ତାଲିକାର ସୀମା"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"ଏହା ଆପକୁ ସମ୍ପୂର୍ଣ୍ଣ କରିବ ଏବଂ ଆପଣ ଫେରିଆସିଲେ ଏହା ଏକ ଅନୁମତିର ସ୍କ୍ରିନକୁ ପ୍ରି-ସିଡ କରିବ"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"ଆପର ଡେମୋ ସମ୍ପୂର୍ଣ୍ଣ କରନ୍ତୁ"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"ପରବର୍ତ୍ତୀ ଥର ଡେମୋ ଚଲାଇବା ସମୟରେ ଅନୁମତି ସ୍କ୍ରିନକୁ ପ୍ରି-ସିଡ କରନ୍ତୁ"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"ଆପର ଡେମୋ ପାଇଁ ପ୍ରି-ସିଡ ଅନୁମତି"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"ପରବର୍ତ୍ତୀ ଥର ଡେମୋ ଚଲାଇବା ସମୟରେ ଅନୁମତି ସ୍କ୍ରିନକୁ ପ୍ରି-ସିଡ କରନ୍ତୁ"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"ଡେମୋ ଲୋଡ କରାଯାଉଛି"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"ଲୋଡ ହେବା ସମ୍ପୂର୍ଣ୍ଣ ହୋଇଛି!"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"ରୁଟରେ ପପ କରନ୍ତୁ"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"ଇନକମ୍ପାଟିବଲ ହୋଷ୍ଟ"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"ମେସେଜ ଟେମ୍ପଲେଟର ଡେମୋ"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"ମେସେଜ ଏଠାକୁ ଯାଏ।\nଦ୍ୱିତୀୟ ଲାଇନରେ ଅଧିକ ଟେକ୍ସଟ।"</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"ପେନ ଟେମ୍ପଲେଟର ଡେମୋ"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"ସ୍ଥାନର ତାଲିକାର ଟେମ୍ପଲେଟର ଡେମୋ"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"ସ୍ଥାନଗୁଡ଼ିକୁ ବ୍ରାଉଜ କରନ୍ତୁ"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"କୌଣସି ଟିଣ୍ଟ ଥିବା ଡ୍ର କରାଯାଇପାରୁଥିବା ଏକ ଭେକ୍ଟର"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"ଆପର ରଙ୍ଗ ପାଇଁ ଏହାର ଥିମର ଆଟ୍ରିବ୍ୟୁଟ ସହ ଡ୍ର କରାଯାଇପାରୁଥିବା ଏକ ଭେକ୍ଟର"</string>
     <string name="png_res_title" msgid="7437083018336747544">"ଏକ ରିସୋର୍ସ ଭାବରେ ପଠାଯାଇଥିବା PNG"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"ଏକ ରିସୋର୍ସ ଭାବରେ ପଠାଯାଇଥିବା PNG"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"କେବଳ ଏକ ଟାଇଟେଲ ଅଟେ"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"ଆପର ଆଇକନ ସହିତ ଟାଇଟେଲ"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"ରିସୋର୍ସ IDର ଇମେଜ ସହିତ ଟାଇଟେଲ"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"ଧାଡ଼ିଗୁଡ଼ିକର ଡେମୋ"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"ଟେକ୍ସଟ ଏବଂ ଆଇକନର ଡେମୋ"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"ଟେକ୍ସଟ ଏବଂ ଆଇକନ ଥିବା ଧାଡ଼ିଗୁଡ଼ିକର ଡେମୋ"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"ଚୟନ କରାଯାଇପାରୁଥିବା ତାଲିକାଗୁଡ଼ିକର ଡେମୋ"</string>
     <string name="option_1_title" msgid="7221252541651471199">"ବିକଳ୍ପ 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"ବିକଳ୍ପ 2"</string>
@@ -292,6 +296,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"ଟାସ୍କର ସୀମାରେ ପହଞ୍ଚିଯାଇଛି\nଆଗକୁ ଗଲେ ଆପଟି ବାଧ୍ୟତାର ସହ ବନ୍ଦ ହୋଇଯିବ"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"%2$dଟିରୁ %1$d ନମ୍ବର ଟାସ୍କର ଷ୍ଟେପ"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"ଆଗକୁ ଯିବା ପାଇଁ କ୍ଲିକ କରନ୍ତୁ"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"ପରୀକ୍ଷା ଟୋଗଲ କରନ୍ତୁ"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"ଷ୍ଟେଟଫୁଲ ପରିବର୍ତ୍ତନଗୁଡ଼ିକୁ ଅନୁମତି ଦିଆଯାଇଛି"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"\"ପରୀକ୍ଷା ଟୋଗଲ କରିବା\"କୁ ସକ୍ଷମ କରନ୍ତୁ"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"\"ପରୀକ୍ଷା ଟୋଗଲ କରିବା\" ଅକ୍ଷମ କରାଯାଇଛି"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"ବିବିଧ ଟେମ୍ପଲେଟର ଡେମୋ"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Showcase ଡେମୋ"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"ଡେମୋ ସ୍କ୍ରିନକୁ ଭଏସ ଆକ୍ସେସ"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"ଉପଯୋଗକର୍ତ୍ତାଙ୍କ ଇଣ୍ଟରାକ୍ସନ"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"ଅନୁମତିର ଡେମୋ ପାଇଁ ଅନୁରୋଧ"</string>
+    <string name="perm_group" msgid="3834918337351876270">"ଅନୁମତି ଗୋଷ୍ଠୀ"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"Showcase ଆପ ପାଇଁ ଅନୁମତି ଗୋଷ୍ଠୀ"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"ସଠିକ୍ ଲୋକେସନକୁ ଆକ୍ସେସ"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"ସଠିକ୍ ଲୋକେସନକୁ ଆକ୍ସେସ ପାଇଁ ଅନୁମତି"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"ଆନୁମାନିକ ଲୋକେସନକୁ ଆକ୍ସେସ"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"ଆନୁମାନିକ ଲୋକେସନକୁ ଆକ୍ସେସ ପାଇଁ ଅନୁମତି"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"ଅଡିଓ ରେକର୍ଡ କରିବାକୁ ଅକ୍ସେସ"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"ଅଡିଓ ରେକର୍ଡ କରିବାକୁ ଆକ୍ସେସ ପାଇଁ ଅନୁମତି"</string>
     <string name="location_1_description" msgid="4801052291684791371">"ଟିଣ୍ଟ କରାଯାଇଥିବା ରିସୋର୍ସ ଭେକ୍ଟର"</string>
     <string name="location_2_description" msgid="3331356135359047166">"ଇମେଜ ରିସୋର୍ସର ବିଟମ୍ୟାପ"</string>
     <string name="location_3_description" msgid="3982142774088944850">"ରଙ୍ଗୀନ ଟେକ୍ସଟ ମାର୍କର"</string>
     <string name="location_4_description" msgid="6560365445044381911">"ଇମେଜର ବିଟମ୍ୟାପ"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"ଟେକ୍ସଟର ଲେବଲ"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-pa/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-pa/strings.xml
index aec3a627..aa5d42e 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-pa/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-pa/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"ਇਸ ਲਿਖਤ ਦਾ ਰੰਗ ਹਰਾ ਹੈ"</string>
     <string name="example_3_text" msgid="977269832109695627">"ਇਸ ਲਿਖਤ ਦਾ ਰੰਗ ਨੀਲਾ ਹੈ"</string>
     <string name="example_4_text" msgid="2043547015979437373">"ਇਸ ਲਿਖਤ ਦਾ ਰੰਗ ਪੀਲਾ ਹੈ"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"ਇਹ ਲਿਖਤ ਪ੍ਰਾਇਮਰੀ ਰੰਗ ਦੀ ਵਰਤੋਂ ਕਰਦੀ ਹੈ"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"ਇਹ ਲਿਖਤ ਸੈਕੰਡਰੀ ਰੰਗ ਦੀ ਵਰਤੋਂ ਕਰਦੀ ਹੈ"</string>
     <string name="color_demo" msgid="1822427636476178993">"ਰੰਗ ਦਾ ਡੈਮੋ"</string>
     <string name="list_limit" msgid="3023536401535417286">"ਸੂਚੀ ਦੀ ਸੀਮਾ"</string>
@@ -232,6 +233,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"ਗੈਰ-ਅਨੁਕੂਲ ਹੋਸਟ"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"ਸੁਨੇਹਾ ਟੈਮਪਲੇਟ ਦਾ ਡੈਮੋ"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"ਸੁਨੇਹਾ ਇੱਥੇ ਜਾਂਦਾ ਹੈ।\nਦੂਜੀ ਲਾਈਨ ਵਿੱਚ ਹੋਰ ਲਿਖਤ।"</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"ਪੂਰਵ-ਝਲਕ ਟੈਮਪਲੇਟ ਦਾ ਡੈਮੋ"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"ਥਾਂ ਸੰਬੰਧੀ ਸੂਚੀ ਟੈਮਪਲੇਟ ਦਾ ਡੈਮੋ"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"ਥਾਵਾਂ ਬ੍ਰਾਊਜ਼ ਕਰੋ"</string>
@@ -267,7 +270,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"ਰੰਗਤ ਨਾਲ, ਵੈਕਟਰ ਖਿੱਚਣਯੋਗ ਹੈ"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"ਵੈਕਟਰ ਆਪਣੇ ਰੰਗ ਲਈ ਐਪ ਦੀ ਥੀਮ ਵਿਸ਼ੇਸ਼ਤਾ ਨਾਲ ਖਿੱਚਣਯੋਗ ਹੈ"</string>
     <string name="png_res_title" msgid="7437083018336747544">"ਕਿਸੇ PNG ਨੂੰ ਸਰੋਤ ਵਜੋਂ ਭੇਜਿਆ ਗਿਆ"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"ਕਿਸੇ PNG ਨੂੰ ਸਰੋਤ ਵਜੋਂ ਭੇਜਿਆ ਗਿਆ"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"ਸਿਰਫ਼ ਇੱਕ ਸਿਰਲੇਖ ਹੈ"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"ਐਪ ਪ੍ਰਤੀਕ ਵਾਲਾ ਸਿਰਲੇਖ"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"ਸਰੋਤ ਆਈਡੀ ਚਿੱਤਰ ਵਾਲਾ ਸਿਰਲੇਖ"</string>
@@ -279,6 +283,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"ਕਤਾਰਾਂ ਦਾ ਡੈਮੋ"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"ਲਿਖਤ ਅਤੇ ਪ੍ਰਤੀਕਾਂ ਦਾ ਡੈਮੋ"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"ਲਿਖਤ ਅਤੇ ਪ੍ਰਤੀਕਾਂ ਵਾਲੀਆਂ ਕਤਾਰਾਂ ਦਾ ਡੈਮੋ"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"ਚੁਣਨਯੋਗ ਸੂਚੀਆਂ ਦਾ ਡੈਮੋ"</string>
     <string name="option_1_title" msgid="7221252541651471199">"ਵਿਕਲਪ 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"ਵਿਕਲਪ 2"</string>
@@ -292,6 +298,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"ਕਾਰਜ ਸੀਮਾ ਪੂਰੀ ਹੋ ਗਈ\nਜਾਰੀ ਰੱਖਣ \'ਤੇ ਐਪ ਜ਼ਬਰਦਸਤੀ ਬੰਦ ਹੋ ਜਾਵੇਗੀ"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"%2$d ਵਿੱਚੋਂ %1$d ਕਾਰਜ ਪੜਾਅ"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"ਅੱਗੇ ਜਾਣ ਲਈ ਕਲਿੱਕ ਕਰੋ"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"ਟੈਸਟ ਨੂੰ ਟੌਗਲ ਕਰੋ"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"ਸਪਸ਼ਟ ਤਬਦੀਲੀਆਂ ਕਰਨ ਦੀ ਆਗਿਆ ਹੈ"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"\'ਟੈਸਟ ਨੂੰ ਟੌਗਲ ਕਰੋ\' ਨੂੰ ਚਾਲੂ ਕਰੋ"</string>
@@ -306,6 +314,10 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"\'ਟੈਸਟ ਨੂੰ ਟੌਗਲ ਕਰੋ\' ਬੰਦ ਹੈ"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"ਫੁਟਕਲ ਟੈਮਪਲੇਟਾਂ ਦੇ ਡੈਮੋ"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"ਸ਼ੋਅਕੇਸ ਦੇ ਡੈਮੋ"</string>
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
+    <skip />
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
+    <skip />
     <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
     <skip />
     <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
@@ -333,4 +345,18 @@
     <string name="location_3_description" msgid="3982142774088944850">"ਰੰਗੀਨ ਲਿਖਤ ਮਾਰਕਰ"</string>
     <string name="location_4_description" msgid="6560365445044381911">"ਚਿੱਤਰ ਬਿਟ ਮੈਪ"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"ਲਿਖਤ ਦਾ ਲੇਬਲ"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-pl/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-pl/strings.xml
index 3fdf1ca..76ecb24 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-pl/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-pl/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Ten tekst ma zielony kolor"</string>
     <string name="example_3_text" msgid="977269832109695627">"Ten tekst ma niebieski kolor"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Ten tekst ma żółty kolor"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"W ten tekście użyto koloru podstawowego"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"W ten tekście użyto koloru dodatkowego"</string>
     <string name="color_demo" msgid="1822427636476178993">"Wersja demonstracyjna koloru"</string>
     <string name="list_limit" msgid="3023536401535417286">"Limit listy"</string>
@@ -232,6 +233,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Niezgodny serwer"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Wersja demonstracyjna szablonu wiadomości"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Tu będzie wiadomość.\nWięcej tekstu w następnej linii."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Wersja demonstracyjna szablonu panelu"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Wersja demonstracyjna szablonu listy miejsc"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Przeglądaj miejsca"</string>
@@ -267,7 +270,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Obiekt rysowalny wektorowo, z zabarwieniem"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Obiekt rysowalny wektorowo, z atrybutem motywu aplikacji jako kolorem"</string>
     <string name="png_res_title" msgid="7437083018336747544">"Plik PNG, wysłany jako zasób"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"Plik PNG, wysłany jako zasób"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Po prostu tytuł"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Tytuł z ikoną aplikacji"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Tytuł z grafiką identyfikatora zasobu"</string>
@@ -279,6 +283,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Wersja demonstracyjna wierszy"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Wersja demonstracyjna tekstu i ikon"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Wersja demonstracyjna wierszy z tekstem i ikonami"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Wersja demonstracyjna list z możliwością wyboru"</string>
     <string name="option_1_title" msgid="7221252541651471199">"Opcja 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"Opcja 2"</string>
@@ -292,6 +298,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Osiągnięto limit zadań\nKontynuowanie spowoduje wymuszenie zatrzymania aplikacji"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Krok zadania %1$d z %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Kliknij, aby przejść dalej"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Test przełączania"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Zmiany stanu są dozwolone"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Włącz test przełączania"</string>
@@ -306,6 +314,10 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Test przełączania został wyłączony"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Wersje demonstracyjne różnych szablonów"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Wersje demonstracyjne do prezentacji"</string>
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
+    <skip />
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
+    <skip />
     <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
     <skip />
     <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
@@ -333,4 +345,18 @@
     <string name="location_3_description" msgid="3982142774088944850">"Znacznik kolorowego tekstu"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Bitmapa graficzna"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Etykieta tekstu"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-pt-rBR/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-pt-rBR/strings.xml
index b01f359..3a701b4 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-pt-rBR/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-pt-rBR/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Este texto usa a cor verde"</string>
     <string name="example_3_text" msgid="977269832109695627">"Este texto usa a cor azul"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Este texto usa a cor amarela"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Este texto usa a cor primária"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Este texto usa a cor secundária"</string>
     <string name="color_demo" msgid="1822427636476178993">"Demonstração de cor"</string>
     <string name="list_limit" msgid="3023536401535417286">"Limite de lista"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"Isso encerra o app e quando você retornar, ele vai configurar com antecedência uma tela de permissão"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"Encerrar demonstração do app"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"Configurar com antecedência a tela de permissões na próxima demonstração"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"Configurar com antecedência a permissão da demonstração do app"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"Configurar com antecedência a tela de permissões na próxima demonstração"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"Carregando a demonstração"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"Carregamento concluído"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"Ir até a raiz"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Host incompatível"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Demonstração do modelo de mensagem"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"A mensagem fica aqui.\nMais texto na segunda linha."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Demonstração do modelo de painel"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Demonstração do modelo de lista de lugares"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Procurar lugares"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Um drawable vetorial, com uma tonalidade"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Um drawable vetorial, com um atributo de tema para cor do app"</string>
     <string name="png_res_title" msgid="7437083018336747544">"Um PNG, enviado como recurso"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"Um PNG, enviado como recurso"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Apenas um título"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Título com ícone do app"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Título com imagem do ID de recurso"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Demonstração de linhas"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Demonstrações de texto e ícones"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Demonstrações de linhas com texto e ícones"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Demonstração de listas selecionáveis"</string>
     <string name="option_1_title" msgid="7221252541651471199">"1ª opção"</string>
     <string name="option_2_title" msgid="1905146448697963818">"2ª opção"</string>
@@ -292,6 +296,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Limite da tarefa atingido\nContinuar vai forçar a parada do app"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Etapa da tarefa: %1$d de %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Clique para continuar"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Alternar teste"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Mudanças com estado são permitidas"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Ativar alternância do teste"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Alternância de teste desativada"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Demonstração de modelos diversos"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Demonstrações em destaque"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"Tela de demonstração do Acesso por voz"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"Interações do usuário"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"Solicitar demonstração de permissões"</string>
+    <string name="perm_group" msgid="3834918337351876270">"Grupo de permissões"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"Grupo de permissões do app Showcase"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"Acesso à localização precisa"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"Permissão para acessar a localização precisa"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"Acesso à localização aproximada"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"Permissão para acessar a localização aproximada"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"Acesso à gravação de áudio"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"Permissão para acessar a gravação de áudio"</string>
     <string name="location_1_description" msgid="4801052291684791371">"Vetor de recurso de tonalidade"</string>
     <string name="location_2_description" msgid="3331356135359047166">"Bitmap de recurso de imagem"</string>
     <string name="location_3_description" msgid="3982142774088944850">"Marcador de texto colorido"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Bitmap de imagem"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Etiqueta de texto"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-pt-rPT/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-pt-rPT/strings.xml
index 9520341..91de491 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-pt-rPT/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-pt-rPT/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Este texto tem cor verde"</string>
     <string name="example_3_text" msgid="977269832109695627">"Este texto tem cor azul"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Este texto tem cor amarela"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Este texto usa a cor primária"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Este texto usa a cor secundária"</string>
     <string name="color_demo" msgid="1822427636476178993">"Demonstração de cor"</string>
     <string name="list_limit" msgid="3023536401535417286">"Limite de listas"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"A app vai ser concluída e, quando voltar, vai ser adicionado um ecrã de autorização"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"Demonstração sobre como concluir a app"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"Demonstração sobre como adicionar um ecrã de autorização na próxima execução"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"Demonstração da app sobre como adicionar a autorização"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"Demonstração sobre como adicionar um ecrã de autorização na próxima execução"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"A carregar demonstração"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"Carregamento concluído!"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"Ir para raiz"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Anfitrião incompatível"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Demonstração do modelo de mensagem"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"A mensagem é colocada aqui.\nMais texto na segunda linha."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Demonstração do modelo de painel"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Demonstração do modelo de lista de locais"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Procurar locais"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Um deslizante vetorial, com matiz"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Um deslizante vetorial, com um atributo de tema da app para a respetiva cor"</string>
     <string name="png_res_title" msgid="7437083018336747544">"Um PNG, enviado como recurso"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"Um PNG, enviado como recurso"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Apenas um título"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Título com ícone da app"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Título com imagem do ID do recurso"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Demonstração de linhas"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Demonstrações de texto e ícones"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Demonstração de linhas com texto e ícones"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Demonstração de listas selecionáveis"</string>
     <string name="option_1_title" msgid="7221252541651471199">"Opção 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"Opção 2"</string>
@@ -292,6 +296,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"O limite de tarefas foi atingido\nSe avançar, vai forçar a paragem da app"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Passo da tarefa %1$d de %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Clique para avançar"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Ativar/desativar teste"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"São permitidas alterações com estado"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Ativar teste de botão"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Teste de botão desativado"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Demonstrações de modelos diversos"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Demonstrações de destaque"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"Ecrã de demonstração do Voice Access"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"Interações do utilizador"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"Demonstrações sobre como pedir autorizações"</string>
+    <string name="perm_group" msgid="3834918337351876270">"Grupo de autorizações"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"Grupo de autorizações da app Showcase"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"Acesso à localização exata"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"Autorização para aceder à localização exata"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"Acesso à localização aproximada"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"Autorização para aceder à localização aproximada"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"Acesso à gravação de áudio"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"Autorização para aceder à gravação de áudio"</string>
     <string name="location_1_description" msgid="4801052291684791371">"Vetor do recurso com matiz"</string>
     <string name="location_2_description" msgid="3331356135359047166">"Mapa de bits dos recursos da imagem"</string>
     <string name="location_3_description" msgid="3982142774088944850">"Marcador de texto a cores"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Mapa de bits da imagem"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Etiqueta de texto"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-pt/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-pt/strings.xml
index b01f359..3a701b4 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-pt/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-pt/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Este texto usa a cor verde"</string>
     <string name="example_3_text" msgid="977269832109695627">"Este texto usa a cor azul"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Este texto usa a cor amarela"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Este texto usa a cor primária"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Este texto usa a cor secundária"</string>
     <string name="color_demo" msgid="1822427636476178993">"Demonstração de cor"</string>
     <string name="list_limit" msgid="3023536401535417286">"Limite de lista"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"Isso encerra o app e quando você retornar, ele vai configurar com antecedência uma tela de permissão"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"Encerrar demonstração do app"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"Configurar com antecedência a tela de permissões na próxima demonstração"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"Configurar com antecedência a permissão da demonstração do app"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"Configurar com antecedência a tela de permissões na próxima demonstração"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"Carregando a demonstração"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"Carregamento concluído"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"Ir até a raiz"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Host incompatível"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Demonstração do modelo de mensagem"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"A mensagem fica aqui.\nMais texto na segunda linha."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Demonstração do modelo de painel"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Demonstração do modelo de lista de lugares"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Procurar lugares"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Um drawable vetorial, com uma tonalidade"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Um drawable vetorial, com um atributo de tema para cor do app"</string>
     <string name="png_res_title" msgid="7437083018336747544">"Um PNG, enviado como recurso"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"Um PNG, enviado como recurso"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Apenas um título"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Título com ícone do app"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Título com imagem do ID de recurso"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Demonstração de linhas"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Demonstrações de texto e ícones"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Demonstrações de linhas com texto e ícones"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Demonstração de listas selecionáveis"</string>
     <string name="option_1_title" msgid="7221252541651471199">"1ª opção"</string>
     <string name="option_2_title" msgid="1905146448697963818">"2ª opção"</string>
@@ -292,6 +296,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Limite da tarefa atingido\nContinuar vai forçar a parada do app"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Etapa da tarefa: %1$d de %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Clique para continuar"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Alternar teste"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Mudanças com estado são permitidas"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Ativar alternância do teste"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Alternância de teste desativada"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Demonstração de modelos diversos"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Demonstrações em destaque"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"Tela de demonstração do Acesso por voz"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"Interações do usuário"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"Solicitar demonstração de permissões"</string>
+    <string name="perm_group" msgid="3834918337351876270">"Grupo de permissões"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"Grupo de permissões do app Showcase"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"Acesso à localização precisa"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"Permissão para acessar a localização precisa"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"Acesso à localização aproximada"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"Permissão para acessar a localização aproximada"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"Acesso à gravação de áudio"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"Permissão para acessar a gravação de áudio"</string>
     <string name="location_1_description" msgid="4801052291684791371">"Vetor de recurso de tonalidade"</string>
     <string name="location_2_description" msgid="3331356135359047166">"Bitmap de recurso de imagem"</string>
     <string name="location_3_description" msgid="3982142774088944850">"Marcador de texto colorido"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Bitmap de imagem"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Etiqueta de texto"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-ro/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-ro/strings.xml
index 0fa576a..704163b 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-ro/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-ro/strings.xml
@@ -19,11 +19,11 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="back_caps_action_title" msgid="6392829425035919422">"ÎNAPOI"</string>
     <string name="home_caps_action_title" msgid="4853167242566949502">"ECRAN DE PORNIRE"</string>
-    <string name="exit_action_title" msgid="9086586388884500731">"Ieșiți"</string>
+    <string name="exit_action_title" msgid="9086586388884500731">"Ieși"</string>
     <string name="refresh_action_title" msgid="3674260822403151377">"Actualizează"</string>
     <string name="close_action_title" msgid="2661907510124308560">"Închide"</string>
     <string name="grant_access_action_title" msgid="4033140828804350723">"Acordați accesul"</string>
-    <string name="enable_location_action_title" msgid="8181862247222797044">"Activați locația"</string>
+    <string name="enable_location_action_title" msgid="8181862247222797044">"Activează locația"</string>
     <string name="cancel_action_title" msgid="1149738685397349236">"Anulează"</string>
     <string name="stop_action_title" msgid="1187619482795416314">"Oprește"</string>
     <string name="more_action_title" msgid="1039516575011403837">"Mai mult"</string>
@@ -39,14 +39,14 @@
     <string name="accept_action_title" msgid="4899660585470647578">"Acceptați"</string>
     <string name="reject_action_title" msgid="6730366705938402668">"Respingeți"</string>
     <string name="ok_action_title" msgid="7128494973966098611">"OK"</string>
-    <string name="throw_action_title" msgid="7163710562670220163">"Întrerupeți"</string>
+    <string name="throw_action_title" msgid="7163710562670220163">"Întrerupe"</string>
     <string name="commute_action_title" msgid="2585755255290185096">"Navetă"</string>
     <string name="sign_out_action_title" msgid="1653943000866713010">"Deconectează-te"</string>
     <string name="try_anyway_action_title" msgid="7384500054249311718">"Încearcă oricum"</string>
     <string name="yes_action_title" msgid="5507096013762092189">"Da"</string>
     <string name="no_action_title" msgid="1452124604210014010">"Nu"</string>
-    <string name="disable_all_rows" msgid="3003225080532928046">"Dezactivați toate rândurile"</string>
-    <string name="enable_all_rows" msgid="7274285275711872091">"Activați toate rândurile"</string>
+    <string name="disable_all_rows" msgid="3003225080532928046">"Dezactivează toate rândurile"</string>
+    <string name="enable_all_rows" msgid="7274285275711872091">"Activează toate rândurile"</string>
     <string name="bug_reported_toast_msg" msgid="2487119172744644317">"Eroarea a fost raportată!"</string>
     <string name="zoomed_in_toast_msg" msgid="8915301497303842649">"Mărit"</string>
     <string name="zoomed_out_toast_msg" msgid="6260981223227212493">"Micșorat"</string>
@@ -77,7 +77,7 @@
     <string name="first_row_text" msgid="3887390298628338716">"Text text text"</string>
     <string name="other_row_title_prefix" msgid="4702355788835253197">"Titlul rândului"</string>
     <string name="other_row_text" msgid="7510279447493169945">"Textul de pe rând"</string>
-    <string name="navigate" msgid="2713090390373996139">"Navigați"</string>
+    <string name="navigate" msgid="2713090390373996139">"Navighează"</string>
     <string name="dial" msgid="3145707439707628311">"Apelați"</string>
     <string name="address" msgid="9010635942573581302">"Adresă"</string>
     <string name="phone" msgid="2504766809811627577">"Telefon"</string>
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Textul este verde"</string>
     <string name="example_3_text" msgid="977269832109695627">"Textul este albastru"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Textul este galben"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Textul folosește culoarea principală"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Textul folosește culoarea secundară"</string>
     <string name="color_demo" msgid="1822427636476178993">"Demonstrație cu culori"</string>
     <string name="list_limit" msgid="3023536401535417286">"Limita listei"</string>
@@ -113,23 +114,21 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"Astfel, aplicația se va încheia și, când reveniți, va pregăti un ecran pentru permisiuni"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"Finalizați demonstrația aplicației"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"Pregătiți ecranul pentru permisiuni la următoarea rulare a demonstrației"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"Pregătește demonstrația privind aplicația de permisiune"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"Pregătește ecranul pentru permisiuni la următoarea rulare a demonstrației"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"Se încarcă demonstrația"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"Încărcarea s-a finalizat!"</string>
-    <string name="pop_to_root" msgid="2078277386355064198">"Accesați ecranul rădăcină"</string>
-    <string name="pop_to_marker" msgid="5007078308762725207">"Accesați marcatorul pentru demonstrații diverse"</string>
+    <string name="pop_to_root" msgid="2078277386355064198">"Accesează ecranul rădăcină"</string>
+    <string name="pop_to_marker" msgid="5007078308762725207">"Accesează marcatorul pentru demonstrații diverse"</string>
     <string name="push_stack" msgid="2433062141810168976">"Împingeți mai departe în stivă"</string>
-    <string name="pop_to_prefix" msgid="4288884615669751608">"Accesați"</string>
-    <string name="pop_to_title" msgid="3924696281273379455">"Accesați demonstrația"</string>
+    <string name="pop_to_prefix" msgid="4288884615669751608">"Accesează"</string>
+    <string name="pop_to_title" msgid="3924696281273379455">"Accesează demonstrația"</string>
     <string name="package_not_found_error_msg" msgid="7525619456883627939">"Pachetul nu a fost găsit."</string>
     <string name="permissions_granted_msg" msgid="2348556088141992714">"Toate permisiunile au fost acordate. Revocați permisiunile din Setări."</string>
     <string name="needs_access_msg_prefix" msgid="2204136858798832382">"Aplicația are nevoie de acces la următoarele permisiuni:\n"</string>
     <string name="phone_screen_permission_msg" msgid="3599815596923367256">"Acordați permisiunea pe ecranul telefonului"</string>
     <string name="enable_location_permission_on_device_msg" msgid="472752487966156897">"Activați permisiunile pentru locație pe dispozitiv"</string>
-    <string name="enable_location_permission_on_phone_msg" msgid="5082615523959139121">"Activați locația pe ecranul telefonului"</string>
+    <string name="enable_location_permission_on_phone_msg" msgid="5082615523959139121">"Activează locația pe ecranul telefonului"</string>
     <string name="required_permissions_title" msgid="5351791879153568211">"Permisiuni necesare"</string>
     <string name="request_permissions_title" msgid="7456426341142412300">"Demonstrație pentru solicitarea permisiunii"</string>
     <string name="cancel_reservation_title" msgid="1374986823057959608">"Ecran de anulare a rezervării"</string>
@@ -140,7 +139,7 @@
     <string name="arrived_exclamation_msg" msgid="9132265698563096988">"Ați sosit!"</string>
     <string name="travel_est_trip_text" msgid="5134365408383171144">"Luați-o pe Alice din drum"</string>
     <string name="send_notification_title" msgid="4731688444696028193">"Trimite o notificare"</string>
-    <string name="start_notifications_title" msgid="8699668027543530460">"Activați notificările"</string>
+    <string name="start_notifications_title" msgid="8699668027543530460">"Activează notificările"</string>
     <string name="stop_notifications_title" msgid="3703892710275206239">"Oprește notificările"</string>
     <string name="notification_title" msgid="5507590705935298176">"Notificare"</string>
     <string name="importance_title" msgid="9034862997821839831">"Importanță"</string>
@@ -158,7 +157,7 @@
     <string name="nav_template_demos_title" msgid="8215835368932160866">"Demonstrații cu șabloane pentru navigare"</string>
     <string name="map_template_pane_demo_title" msgid="4849450903277412004">"Demonstrație cu șablon pentru hartă și panou"</string>
     <string name="map_template_list_demo_title" msgid="1473810899303903185">"Demonstrație cu șablon pentru hartă și listă"</string>
-    <string name="start_notification_title" msgid="2208831088632818681">"Activați notificarea"</string>
+    <string name="start_notification_title" msgid="2208831088632818681">"Activează notificarea"</string>
     <string name="stop_notification_title" msgid="3709643750540881176">"Oprește notificarea"</string>
     <string name="nav_notification_demo_title" msgid="4448683262984308442">"Demonstrație cu notificări privind navigarea"</string>
     <string name="go_straight" msgid="2301747728609198718">"Mergeți drept înainte"</string>
@@ -169,8 +168,8 @@
     <string name="less_busy" msgid="310625272281710983">"Mai puțin aglomerat"</string>
     <string name="hov_friendly" msgid="6956152104754594971">"Acceptă vehicule cu mai mulți pasageri"</string>
     <string name="long_route" msgid="4737969235741057506">"Traseu lung"</string>
-    <string name="continue_start_nav" msgid="6231797535084469163">"Continuați pentru a începe navigarea"</string>
-    <string name="continue_route" msgid="5172258139245088080">"Accesați traseul"</string>
+    <string name="continue_start_nav" msgid="6231797535084469163">"Continuă pentru a începe navigarea"</string>
+    <string name="continue_route" msgid="5172258139245088080">"Accesează traseul"</string>
     <string name="routes_title" msgid="7799772149932075357">"Trasee"</string>
     <string name="place_list_nav_template_demo_title" msgid="8019588508812955290">"Demonstrație cu șablon pentru navigarea în lista de locații"</string>
     <string name="route_preview_template_demo_title" msgid="7878704357953167555">"Demonstrație cu șablon pentru previzualizarea traseului"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Gazdă incompatibilă"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Demonstrație cu șablon pentru mesaj"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Introdu mesajul aici.\nMai mult text pe al doilea rând."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Demonstrație cu șablonul pentru panou"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Demonstrație cu șablon pentru lista de locații"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Răsfoiți locații"</string>
@@ -239,7 +240,7 @@
     <string name="search_hint" msgid="978495498991026792">"Caută aici"</string>
     <string name="additional_text" msgid="8410289578276941586">"Consultați Termenii și condițiile noastre"</string>
     <string name="google_sign_in" msgid="6556259799319701727">"Conectare cu Google"</string>
-    <string name="use_pin" msgid="7850893299484337431">"Folosiți PIN-ul"</string>
+    <string name="use_pin" msgid="7850893299484337431">"Folosește PIN-ul"</string>
     <string name="qr_code" msgid="5487041647280777397">"Cod QR"</string>
     <string name="sign_in_template_not_supported_text" msgid="7184733753948837646">"Gazda nu acceptă șablonul pentru conectare"</string>
     <string name="sign_in_template_not_supported_title" msgid="4892883228898541764">"Gazdă incompatibilă"</string>
@@ -254,7 +255,7 @@
     <string name="pin_sign_in_instruction" msgid="2288691296234360441">"Introdu acest cod PIN pe telefon"</string>
     <string name="qr_code_sign_in_title" msgid="8137070561006464518">"Scanați codul QR pentru a vă conecta"</string>
     <string name="sign_in_with_google_title" msgid="8043752000786977249">"Conectează-te cu Google"</string>
-    <string name="provider_sign_in_instruction" msgid="7586815688292506743">"Folosiți acest buton pentru a finaliza conectarea cu Google"</string>
+    <string name="provider_sign_in_instruction" msgid="7586815688292506743">"Folosește acest buton pentru a finaliza conectarea cu Google"</string>
     <string name="sign_in_complete_text" msgid="8423984266325680606">"V-ați conectat!"</string>
     <string name="sign_in_complete_title" msgid="8919868148773983428">"Conectare finalizată"</string>
     <string name="sign_in_template_demo_title" msgid="6052035424941410249">"Demonstrație cu șablon pentru conectare"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Resursă care se poate desena în vectori colorată"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Resursă care se poate desena în vectori, cu atributul temei unei aplicații pentru culoare"</string>
     <string name="png_res_title" msgid="7437083018336747544">"PNG trimis ca resursă"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"PNG trimis ca resursă"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Doar un titlu"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Titlu cu pictograma aplicației"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Titlu cu imaginea codului resursei"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Demonstrație pentru rânduri"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Demonstrații pentru text și pictograme"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Demonstrație pentru rânduri cu text și pictograme"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Demonstrație cu liste care se pot selecta"</string>
     <string name="option_1_title" msgid="7221252541651471199">"Opțiunea 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"Opțiunea 2"</string>
@@ -292,9 +296,11 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"A fost atinsă limita pentru activități\nDacă alegeți să continuați, aplicația se va opri forțat"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Pasul activității: %1$d din %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Dați clic pentru a merge înainte"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Activați / dezactivați testul"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Modificările cu menținere de stare sunt permise"</string>
-    <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Activați testul de comutare"</string>
+    <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Activează testul de comutare"</string>
     <string name="toggle_test_first_toggle_text" msgid="5914741538328669668">"Bifați opțiunea pentru a activa testul de comutare"</string>
     <string name="toggle_test_second_toggle_title" msgid="1083594617400613969">"Test de comutare"</string>
     <string name="toggle_test_second_toggle_text" msgid="1813071017415876745">"Modificările cu menținere de stare sunt permise"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Testul de comutare este dezactivat"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Demonstrații diverse cu șabloane"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Demonstrații pentru Showcase"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"Ecran demonstrativ pentru accesul vocal"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"Interacțiunile utilizatorilor"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"Solicită demonstrații privind permisiunile"</string>
+    <string name="perm_group" msgid="3834918337351876270">"Grup de permisiuni"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"Grup de permisiuni pentru aplicația Showcase"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"Acces la locația fină"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"Permisiune pentru acces la locația fină"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"Acces la locația brută"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"Permisiune pentru acces la locația brută"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"Acces pentru înregistrare audio"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"Permisiune de acces pentru înregistrare audio"</string>
     <string name="location_1_description" msgid="4801052291684791371">"Vector de resursă colorat"</string>
     <string name="location_2_description" msgid="3331356135359047166">"Bitmap cu resursele imaginii"</string>
     <string name="location_3_description" msgid="3982142774088944850">"Marcator de text colorat"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Bitmap pentru imagine"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Eticheta textului"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-ru/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-ru/strings.xml
index 3a9873b..2235024 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-ru/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-ru/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Это зеленый текст"</string>
     <string name="example_3_text" msgid="977269832109695627">"Это синий текст"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Это желтый текст"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Это текст основного цвета"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Это текст дополнительного цвета"</string>
     <string name="color_demo" msgid="1822427636476178993">"Демонстрация цвета"</string>
     <string name="list_limit" msgid="3023536401535417286">"Ограничения для списка"</string>
@@ -232,6 +233,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Несовместимый хост"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Демонстрация шаблона сообщения"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Здесь указывается сообщение.\nНа второй строке есть ещё текст."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Демонстрация шаблона панели"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Демонстрация шаблона списка мест"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Просмотр мест"</string>
@@ -267,7 +270,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Класс VectorDrawable с оттенком"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Класс VectorDrawable с атрибутом темы приложения в качестве цвета"</string>
     <string name="png_res_title" msgid="7437083018336747544">"Изображение PNG, отправленное в виде ресурса"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"Изображение PNG, отправленное в виде ресурса"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Только заголовок"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Название со значком приложения"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Название с изображением идентификатора ресурса"</string>
@@ -279,6 +283,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Демонстрация строк"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Демонстрации текста и значков"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Демонстрация строк с текстом и значками"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Демонстрация списков с возможностью выбора"</string>
     <string name="option_1_title" msgid="7221252541651471199">"Вариант 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"Вариант 2"</string>
@@ -292,6 +298,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Достигнут предел по числу задач.\nЕсли продолжить, работа приложения будет остановлена."</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Шаг задачи: %1$d из %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Нажмите, чтобы продолжить"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Проверка переключения"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Изменения с отслеживанием состояния разрешены"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Включить проверку переключения"</string>
@@ -306,6 +314,10 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Проверка переключения отключена"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Демонстрации прочих шаблонов"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Демонстрации Showcase"</string>
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
+    <skip />
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
+    <skip />
     <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
     <skip />
     <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
@@ -333,4 +345,18 @@
     <string name="location_3_description" msgid="3982142774088944850">"Цветной текстовый маркер"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Изображение (растровое)"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Текстовая метка"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-si/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-si/strings.xml
index 4b80c81..c99758f 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-si/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-si/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"මෙම පෙළට කොළ පැහැයක් ඇත"</string>
     <string name="example_3_text" msgid="977269832109695627">"මෙම පෙළට නිල් පැහැයක් ඇත"</string>
     <string name="example_4_text" msgid="2043547015979437373">"මෙම පෙළට කහ පැහැයක් ඇත"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"මෙම පෙළ මූලික වර්ණය භාවිත කරයි"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"මෙම පෙළ ද්විතීයික වර්ණය භාවිත කරයි"</string>
     <string name="color_demo" msgid="1822427636476178993">"වර්ණ ආදර්ශනය"</string>
     <string name="list_limit" msgid="3023536401535417286">"ලැයිස්තු සීමාව"</string>
@@ -232,6 +233,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"නොගැළපෙන සංග්‍රාහක"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"පණිවිඩ අච්චු ආදර්ශනය"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"පණිවිඩය මෙතැනට යයි.\nදෙවන පේළියේ තවත් පෙළ."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"කවුළු අච්චු ආදර්ශනය"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"ස්ථාන ලැයිස්තු අච්චු ආදර්ශනය"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"ස්ථාන බ්‍රවුස් කරන්න"</string>
@@ -267,7 +270,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"වර්ණ ගැන්වීමක් සහිතව, ඇඳිය හැකි දෛශිකයක්"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"යෙදුමක එහි වර්ණය සඳහා තේමා ගුණාංගය සහිත, ඇඳිය හැකි දෛශිකයක්"</string>
     <string name="png_res_title" msgid="7437083018336747544">"PNG, සම්පතක් ලෙස යවන ලදී"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"PNG, සම්පතක් ලෙස යවන ලදී"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"මාතෘකාවක් පමණයි"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"යෙදුම් නිරූපකය සහිත මාතෘකාව"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"සම්පත් ID රූපය සහිත මාතෘකාව"</string>
@@ -279,6 +283,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"පේළි ආදර්ශනය"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"පෙළ සහ නිරූපක ආදර්ශන"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"පෙළ සහ නිරූපණ ආදර්ශන සහිත පේළි"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"තෝරා ගත හැකි ලැයිස්තු ආදර්ශනය"</string>
     <string name="option_1_title" msgid="7221252541651471199">"විකල්පය 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"විකල්පය 2"</string>
@@ -292,6 +298,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"කාර්ය සීමාව ළඟා විය\nඉදිරියට යාම යෙදුම බලෙන් නවත්වනු ඇත"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"%2$d කින් %1$dවන කාර්ය පියවර"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"ඉදිරියට යාමට ක්ලික් කරන්න"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"ටොගල පරීක්ෂාව"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"රාජ්‍ය වෙනස් කිරීම්වලට ඉඩ දේ"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"ටොගල පරීක්ෂාව සබල කරන්න"</string>
@@ -306,6 +314,10 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"ටොගල පරීක්ෂාව අබලයි"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"විවිධ අච්චු ආදර්ශන"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"ප්‍රකාශක තේරූ ආදර්ශන"</string>
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
+    <skip />
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
+    <skip />
     <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
     <skip />
     <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
@@ -333,4 +345,18 @@
     <string name="location_3_description" msgid="3982142774088944850">"වර්ණ ගැන්වූ පෙළ ලකුණුකරය"</string>
     <string name="location_4_description" msgid="6560365445044381911">"රූප බිටු සිතියම"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"පෙළ ලේබලය"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-sk/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-sk/strings.xml
index a6df9f3..039e947 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-sk/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-sk/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Tento text je zelený"</string>
     <string name="example_3_text" msgid="977269832109695627">"Tento text je modrý"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Tento text je žltý"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Tento text používa primárnu farbu"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Tento text používa sekundárnu farbu"</string>
     <string name="color_demo" msgid="1822427636476178993">"Farba – demo"</string>
     <string name="list_limit" msgid="3023536401535417286">"Obmedzenie zoznamu"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"Týmto sa ukončí aplikácia a pri návrate sa zobrazí obrazovka so žiadosťou o povolenie"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"Ukončenie aplikácie – demo"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"Zobraziť so žiadosťou o povolenie pri nasledujúcom spustení dema"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"Prednačítať povolenie demo verzie aplikácie"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"Prednačítať obrazovku povolení pri nasledujúcom spustení dema"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"Načítava sa demo"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"Načítavanie sa dokončilo."</string>
     <string name="pop_to_root" msgid="2078277386355064198">"Prejsť na koreň"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Nekompatibilný hostiteľ"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Šablóna správy – demo"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Tu patrí správa.\nViac textu v druhom riadku."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Šablóna panela – demo"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Šablóna zoznamu miest – demo"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Prehliadanie miest"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Vektorový grafický objekt, s tónovaním"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Vektorový grafický objekt, s atribútom motívu aplikácie pre farbu"</string>
     <string name="png_res_title" msgid="7437083018336747544">"Obrázok PNG, odoslaný ako zdroj"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"Obrázok PNG, odoslaný ako zdroj"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Iba názov"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Názov s ikonou aplikácie"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Názov s obrázkom identifikátora zdroja"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Riadky – demo"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Text a ikony – demá"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Riadky s textom a ikonami – demo"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Vybrateľné zoznamy – demo"</string>
     <string name="option_1_title" msgid="7221252541651471199">"1. možnosť"</string>
     <string name="option_2_title" msgid="1905146448697963818">"2. možnosť"</string>
@@ -292,6 +296,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Bolo dosiahnuté obmedzenie úlohy\nAk budete pokračovať, aplikácia sa vynútene zastaví"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Krok úlohy: %1$d z %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Pokračujte kliknutím"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Test prepínača"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Zmeny so stavom sú povolené"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Aktivovať test prepínača"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Test prepínača bol deaktivovaný"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Rôzne šablóny – demá"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Výber – demá"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"Obrazovka demo verzie aplikácie Voice Access"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"Interakcie používateľov"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"Vyžadovať demá povolení"</string>
+    <string name="perm_group" msgid="3834918337351876270">"Skupina povolení"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"Skupina povolení pre aplikáciu Showcase"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"Prístup k presnej polohe"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"Povolenie na prístup k presnej polohe"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"Prístup k približnej polohe"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"Povolenie na prístup k približnej polohe"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"Prístup k nahrávaniu zvuku"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"Povolenie na prístup k nahrávaniu zvuku"</string>
     <string name="location_1_description" msgid="4801052291684791371">"Tónovaný vektor zdroja"</string>
     <string name="location_2_description" msgid="3331356135359047166">"Bitmapa obrázkového zdroja"</string>
     <string name="location_3_description" msgid="3982142774088944850">"Farebná značka textu"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Bitmapa obrázka"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Textový štítok"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-sl/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-sl/strings.xml
index e76a5ae..7cb44c7 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-sl/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-sl/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"To besedilo je zelene barve."</string>
     <string name="example_3_text" msgid="977269832109695627">"To besedilo je modre barve."</string>
     <string name="example_4_text" msgid="2043547015979437373">"To besedilo je rumene barve."</string>
-    <string name="example_5_text" msgid="4387859825054561488">"To besedilo uporablja primarno barvo."</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"To besedilo uporablja sekundarno barvo."</string>
     <string name="color_demo" msgid="1822427636476178993">"Predstavitvena različica barv"</string>
     <string name="list_limit" msgid="3023536401535417286">"Omejitev seznama"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"S tem boste končali izvajanje aplikacije. Ko se boste vanjo vrnili, bo vnaprej izpolnjena z zaslonom za dovoljenje."</string>
     <string name="finish_app_title" msgid="9013328479438745074">"Končanje predstavitvene različice aplikacije"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"Predstavitvena različica za vnaprejšnje izpolnjevanje zaslona za dovoljenja ob naslednjem zagonu"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"Predstavitvena različica aplikacije za vnaprejšnje izpolnjevanje dovoljenja"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"Predstavitvena različica za vnaprejšnje izpolnjevanje zaslona za dovoljenja ob naslednjem zagonu"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"Nalaganje predstavitvene različice"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"Nalaganje je dokončano."</string>
     <string name="pop_to_root" msgid="2078277386355064198">"Koren za »Prikaz v«"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Nezdružljiv gostitelj"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Predstavitvena različica predloge sporočila"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Sporočilo bo prikazano tukaj.\nVeč besedila bo v drugi vrstici."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Predstavitvena različica predloge podokna"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Predstavitvena različica predloge seznama mest"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Brskanje po mestih"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Narisati je mogoče obarvano vektorsko sliko"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Narisati je mogoče vektorsko sliko, katere barvni atribut je tema aplikacije"</string>
     <string name="png_res_title" msgid="7437083018336747544">"Slika PNG, poslana kot vir"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"Slika PNG, poslana kot vir"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Samo naslov"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Naslov z ikono aplikacije"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Naslov s sliko ID-ja vira"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Predstavitvena različica vrstic"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Predstavitvene različice besedila in ikon"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Predstavitvena različica vrstic z besedilom in ikonami"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Predstavitvena različica seznamov, ki omogočajo izbiro"</string>
     <string name="option_1_title" msgid="7221252541651471199">"1. možnost"</string>
     <string name="option_2_title" msgid="1905146448697963818">"2. možnost"</string>
@@ -292,6 +296,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Dosežena je omejitev opravil.\nČe nadaljujete, bo aplikacija prisilno ustavljena."</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Korak opravila %1$d od %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Kliknite, če želite nadaljevati."</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Preizkus preklopa"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Spremembe stanj so dovoljene."</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Omogoči preizkus preklopa"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Preizkus preklopa je onemogočen."</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Predstavitvene različice različnih predlog"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Predstavitvene različice izpostavljenih stvari"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"Predstavitvena različica zaslona za glasovni dostop"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"Uporabniške interakcije"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"Predstavitvene različice zahtev za dovoljenja"</string>
+    <string name="perm_group" msgid="3834918337351876270">"Skupina dovoljenj"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"Skupina dovoljenj za aplikacijo Predstavitev"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"Dostop do natančne lokacije"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"Dovoljenje za dostop do natančne lokacije"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"Dostop do grobe lokacije"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"Dovoljenje za dostop do grobe lokacije"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"Dostop do snemanja zvoka"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"Dovoljenje za dostop do snemanja zvoka"</string>
     <string name="location_1_description" msgid="4801052291684791371">"Obarvana vektorska slika virov."</string>
     <string name="location_2_description" msgid="3331356135359047166">"Bitna slika virov."</string>
     <string name="location_3_description" msgid="3982142774088944850">"Označevalnik obarvanega besedila."</string>
     <string name="location_4_description" msgid="6560365445044381911">"Bitna slika."</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Besedilna oznaka."</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-sq/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-sq/strings.xml
index 562e09a..13dfee2 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-sq/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-sq/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Ky tekst ka ngjyrë të gjelbër"</string>
     <string name="example_3_text" msgid="977269832109695627">"Ky tekst ka ngjyrë blu"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Ky tekst ka ngjyrë të verdhë"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Ky tekst përdor ngjyrën kryesore"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Ky tekst përdor ngjyrën dytësore"</string>
     <string name="color_demo" msgid="1822427636476178993">"Demonstrimi i ngjyrës"</string>
     <string name="list_limit" msgid="3023536401535417286">"Kufizimi i listës"</string>
@@ -232,6 +233,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Organizator i papërputhshëm"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Demonstrimi i shabllonit të mesazhit"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Mesazhi shkruhet këtu.\nMë shumë tekst në rreshtin e dytë."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Demonstrimi i shabllonit të panelit"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Demonstrimi i shabllonit të listës së vendeve"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Shfleto vendet"</string>
@@ -267,7 +270,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Një vektor i vizatueshëm, me nuancë"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Një vektor i vizatueshëm, me atributin e temës së aplikacionit për ngjyrën e tij"</string>
     <string name="png_res_title" msgid="7437083018336747544">"Një PNG, e dërguar si burim"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"Një PNG, e dërguar si burim"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Thjesht një titull"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Titulli me ikonën e aplikacionit"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Titulli me imazhin e ID-së së burimit"</string>
@@ -279,6 +283,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Demonstrimi i rreshtave"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Demonstrimet e tekstit dhe ikonave"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Demonstrimi i rreshtave me tekst dhe i ikonave"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Demonstrimi i listave të zgjedhshme"</string>
     <string name="option_1_title" msgid="7221252541651471199">"Opsioni 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"Opsioni 2"</string>
@@ -292,6 +298,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"U arrit kufiri i detyrës\nVazhdimi përpara do ta ndalojë aplikacionin me forcë"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Hapi i detyrës: %1$d nga %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Kliko për të vazhduar përpara"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Testimi i butonit aktivizo/çaktivizo"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Lejohen ndryshimet në monitorim"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Aktivizo testimin e butonit aktivizo/çaktivizo"</string>
@@ -306,6 +314,10 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Testimi i butonit aktivizo/çaktivizo u çaktivizua"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Demonstrime shabllonesh të ndryshme"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Demonstrime të prezantimit"</string>
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
+    <skip />
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
+    <skip />
     <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
     <skip />
     <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
@@ -333,4 +345,18 @@
     <string name="location_3_description" msgid="3982142774088944850">"Shënues teksti me ngjyra"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Bitmap i imazhit"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Etiketa e tekstit"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-sr/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-sr/strings.xml
index 5988b63..5fb2a03 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-sr/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-sr/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Овај текст има зелену боју"</string>
     <string name="example_3_text" msgid="977269832109695627">"Овај текст има плаву боју"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Овај текст има жуту боју"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Овај текст користи примарну боју"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Овај текст користи секундарну боју"</string>
     <string name="color_demo" msgid="1822427636476178993">"Демонстрација за боју"</string>
     <string name="list_limit" msgid="3023536401535417286">"Ограничење листе"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"Тиме ће се апликација завршити, а када је вратите, предучитаће екран са дозволама"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"Демонстрација завршетка апликације"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"Демонстрација предучитавања екрана са дозволама при следећем покретању"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"Демонстрација предучитавања дозвола за апликацију"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"Демонстрација предучитавања екрана са дозволама при следећем покретању"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"Учитава се демонстрација"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"Учитавање је довршено!"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"Пређи на основни ниво"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Некомпатибилан хост"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Демонстрација шаблона поруке"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Овде иде порука.\nВише текста у другом реду."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Демонстрација шаблона окна"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Демонстрација шаблона листе места"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Прегледајте места"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Вектор који може да се црта, са тоналитетом"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Вектор који може да се црта, са атрибутом теме апликације за његову боју"</string>
     <string name="png_res_title" msgid="7437083018336747544">"PNG фајл, послат као ресурс"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"PNG фајл, послат као ресурс"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Само наслов"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Наслов са иконом апликације"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Наслов са сликом ИД-а ресурса"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Демонстрација редова"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Демонстрације текста и икона"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Демонстрација редова са текстом и иконама"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Демонстрација листа које могу да се изаберу"</string>
     <string name="option_1_title" msgid="7221252541651471199">"1. опција"</string>
     <string name="option_2_title" msgid="1905146448697963818">"2. опција"</string>
@@ -292,6 +296,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Достигнуто је ограничење задатака\nАко наставите, апликација ће се принудно зауставити"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"%1$d. корак задатка од %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Кликните да бисте ишли напред"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Укључи/искључи тест"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Промене стања су дозвољене"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Омогућите тест укључивања/искључивања"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Тест укључивања/искључивања је онемогућен"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Демонстрације различитих шаблона"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Демонстрације приказивања"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"Екран демонстрације приступа гласу"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"Корисничке интеракције"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"Демонстрације захтева за дозволе"</string>
+    <string name="perm_group" msgid="3834918337351876270">"Група дозвола"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"Група дозвола за истицање апликације"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"Приступ прецизној локацији"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"Дозвола за приступ прецизној локацији"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"Приступ приближној локацији"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"Дозвола за приступ приближној локацији"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"Приступ снимању звука"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"Дозвола за приступ снимању звука"</string>
     <string name="location_1_description" msgid="4801052291684791371">"Вектор ресурса са тоналитетом"</string>
     <string name="location_2_description" msgid="3331356135359047166">"Бит мапа ресурса слике"</string>
     <string name="location_3_description" msgid="3982142774088944850">"Маркер текста у боји"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Бит мапа слике"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Ознака текста"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-sv/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-sv/strings.xml
index df6c7a2..84617c6 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-sv/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-sv/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Den här texten är grön"</string>
     <string name="example_3_text" msgid="977269832109695627">"Den här texten är blå"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Den här texten är gul"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Den här texten är den primära färgen"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Den här texten är den sekundära färgen"</string>
     <string name="color_demo" msgid="1822427636476178993">"Färgdemo"</string>
     <string name="list_limit" msgid="3023536401535417286">"Listgräns"</string>
@@ -232,6 +233,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Inkompatibel värd"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Demo för meddelandemall"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Här skrivs meddelandet.\nMer text på andra raden."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Demo för rutmall"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Demo för platslistmall"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Bläddra bland platser"</string>
@@ -267,7 +270,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"En vektorutdragbar, med toning"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"En vektorutdragbar, med en apps tema som färger"</string>
     <string name="png_res_title" msgid="7437083018336747544">"En PNG-fil, skickad som en resurs"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"En PNG-fil, skickad som en resurs"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Bara en titel"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Namn med appikon"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Namn med resurs-id-bild"</string>
@@ -279,6 +283,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Demo för rader"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Demor för text och ikoner"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Demo för rader med text och ikoner"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Demo för valbara listor"</string>
     <string name="option_1_title" msgid="7221252541651471199">"Alternativ 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"Alternativ 2"</string>
@@ -292,6 +298,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Gränsen för antal uppgifter har uppnåtts\nOm du fortsätter tvingas appen att avslutas"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Uppgiftssteg %1$d av %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Klicka för att gå vidare"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Test för att aktivera och inaktivera"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Tillståndsbaserade ändringar är tillåtna"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Aktivera test av aktivera/inaktivera"</string>
@@ -306,6 +314,10 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Test av aktivera/inaktivera har inaktiverats"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Demor för övriga mallar"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Visa demor"</string>
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
+    <skip />
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
+    <skip />
     <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
     <skip />
     <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
@@ -333,4 +345,18 @@
     <string name="location_3_description" msgid="3982142774088944850">"Färgad textmarkör"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Bitmapbild"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Textetikett"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-sw/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-sw/strings.xml
index 87cc070..f3bf196 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-sw/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-sw/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Maandishi haya yana rangi ya kijani"</string>
     <string name="example_3_text" msgid="977269832109695627">"Maandishi haya yana rangi ya buluu"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Maandishi haya yana rangi ya njano"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Maandishi haya yanatumia rangi ya msingi"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Maandishi haya yanatumia rangi iliyochanganywa"</string>
     <string name="color_demo" msgid="1822427636476178993">"Onyesho la Rangi"</string>
     <string name="list_limit" msgid="3023536401535417286">"Kikomo cha Orodha"</string>
@@ -232,6 +233,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Mpangishi haoani"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Onyesho la Kiolezo cha Ujumbe"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Ujumbe unaandikwa hapa.\nMaandishi ya ziada kwenye mstari wa pili."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Onyesho la Kiolezo cha Kijisehemu"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Onyesho la Kiolezo cha Orodha ya Mahali"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Vinjari Maeneo"</string>
@@ -267,7 +270,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Vekta inayoweza kuchomolewa, yenye rangi maalum"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Vekta inayoweza kuchomolewa, yenye sifa ya mandhari ya programu kama rangi yake"</string>
     <string name="png_res_title" msgid="7437083018336747544">"PNG, imetumwa kama nyenzo"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"PNG, imetumwa kama nyenzo"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Jina pekee"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Jina lenye aikoni ya programu"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Jina lenye picha ya kitambulisho cha nyenzo"</string>
@@ -279,6 +283,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Onyesho la Safu Mlalo"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Maonyesho ya Maandishi na Aikoni"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Onyesho la Safu Mlalo Zenye Maandishi na Aikoni"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Onyesho la Orodha Zinazoweza Kuchaguliwa"</string>
     <string name="option_1_title" msgid="7221252541651471199">"Chaguo la 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"Chaguo la 2"</string>
@@ -292,6 +298,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Kikomo cha shughuli kimefikiwa\nKuendelea kutalazimisha kuzima programu"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Hatua ya shughuli %1$d kati ya %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Bofya ili uendelee"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Jaribio la kipengele cha kuwasha/kuzima"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Mabadiliko yanayoweza kurudiwa mara kwa mara yanaruhusiwa"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Washa Jaribio la Kipengele cha Kuwasha/Kuzima"</string>
@@ -306,6 +314,10 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Jaribio la Kipengele cha Kuwasha/Kuzima Limezimwa"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Maonyesho ya Violezo Anuwai"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Maonyesho ya Kuangazia"</string>
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
+    <skip />
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
+    <skip />
     <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
     <skip />
     <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
@@ -333,4 +345,18 @@
     <string name="location_3_description" msgid="3982142774088944850">"Alama ya maandishi yenye rangi"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Bitmap ya picha"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Lebo ya maandishi"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-ta/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-ta/strings.xml
index f196a93..dc76b25 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-ta/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-ta/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"இந்த உரை பச்சை வண்ணத்தில் உள்ளது"</string>
     <string name="example_3_text" msgid="977269832109695627">"இந்த உரை நீல வண்ணத்தில் உள்ளது"</string>
     <string name="example_4_text" msgid="2043547015979437373">"இந்த உரை மஞ்சள் வண்ணத்தில் உள்ளது"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"இந்த உரை முதன்மை வகை வண்ணத்தைப் பயன்படுத்துகிறது"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"இந்த உரை இரண்டாம் வகை வண்ணத்தைப் பயன்படுத்துகிறது"</string>
     <string name="color_demo" msgid="1822427636476178993">"வண்ணத்தின் டெமோ"</string>
     <string name="list_limit" msgid="3023536401535417286">"பட்டியல் வரம்பு"</string>
@@ -232,6 +233,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"இணக்கமற்ற ஹோஸ்ட்"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"மெசேஜ் டெம்ப்ளேட்டின் டெமோ"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"மெசேஜ்கள் இங்கே செல்லும்.\nகூடுதல் உரைகள் இரண்டாவது வரியில் இருக்கும்."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"பெட்டி டெம்ப்ளேட்டின் டெமோ"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"இருப்பிடப் பட்டியல் டெம்ப்ளேட்டின் டெமோ"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"இடங்களைக் கண்டறியுங்கள்"</string>
@@ -267,7 +270,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"மென்னிறமாக வரையக்கூடிய வெக்டார்"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"ஆப்ஸ் தீமின் பண்புக்கூறுடன் அதன் நிறத்திற்காக வரையக்கூடிய வெக்டார்"</string>
     <string name="png_res_title" msgid="7437083018336747544">"ரிசோர்ஸாக அனுப்பப்பட்ட PNG"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"ரிசோர்ஸாக அனுப்பப்பட்ட PNG"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"வெறும் தலைப்பு"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"ஆப்ஸ் ஐகானுடன் தலைப்பு"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"ரிசோர்ஸ் ஐடி படத்துடன் கூடிய தலைப்பு"</string>
@@ -279,6 +283,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"வரிசைகளின் டெமோ"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"உரை மற்றும் ஐகான்களின் டெமோக்கள்"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"உரை மற்றும் ஐகான்கள் உள்ள டெமோவுடன் கூடிய வரிசைகள்"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"தேர்ந்தெடுக்கக்கூடிய பட்டியல்களின் டெமோ"</string>
     <string name="option_1_title" msgid="7221252541651471199">"விருப்பம் 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"விருப்பம் 2"</string>
@@ -292,6 +298,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"பணி வரம்பை எட்டிவிட்டது.\nமேலும் தொடர்ந்தால் ஆப்ஸ் உடனே நிறுத்தப்படும்"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"%1$d / %2$d படியை எடுங்கள்"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"முன்னேறிச் செல்ல கிளிக் செய்யவும்"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"நிலைமாற்றப் பரிசோதனை"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"நிலை மாற்றங்கள் அனுமதிக்கப்படுகின்றன"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"நிலைமாற்றப் பரிசோதனையை இயக்கு"</string>
@@ -306,6 +314,10 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"நிலைமாற்றப் பரிசோதனை முடக்கப்பட்டது"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"மற்ற டெம்ப்ளேட்டுகளின் டெமோக்கள்"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"ஷோகேஸின் டெமோக்கள்"</string>
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
+    <skip />
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
+    <skip />
     <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
     <skip />
     <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
@@ -333,4 +345,18 @@
     <string name="location_3_description" msgid="3982142774088944850">"வண்ண உரை அடையாளங்காட்டி"</string>
     <string name="location_4_description" msgid="6560365445044381911">"பட பிட்மேப்"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"உரை லேபிள்"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-te/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-te/strings.xml
index 6599818..1bc1550 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-te/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-te/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"ఈ టెక్స్ట్ ఆకుపచ్చ రంగులో ఉంది"</string>
     <string name="example_3_text" msgid="977269832109695627">"ఈ టెక్స్ట్ నీలం రంగులో ఉంది"</string>
     <string name="example_4_text" msgid="2043547015979437373">"ఈ టెక్స్ట్ పసుపు రంగులో ఉంది"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"ఈ టెక్స్ట్‌లో ప్రాథమిక రంగు ఉపయోగించబడుతుంది"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"ఈ టెక్స్ట్‌లో ద్వితీయ రంగు ఉపయోగించబడుతుంది"</string>
     <string name="color_demo" msgid="1822427636476178993">"కలర్ డెమో"</string>
     <string name="list_limit" msgid="3023536401535417286">"లిస్ట్ పరిమితి"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"ఇది యాప్‌ను పూర్తి చేస్తుంది, మీరు రిటర్న్ వచ్చినప్పుడు ఈ అనుమతి స్క్రీన్‌ను ముందే సీడ్ చేస్తుంది"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"యాప్ డెమోను ముగించండి"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"తర్వాతి డెమోను రన్ చేసేటప్పుడు అనుమతి స్క్రీన్‌ను ప్రీ-సీడ్ చేయండి"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"ప్రీ-సీడ్ అనుమతి యాప్ డెమో"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"తర్వాతి డెమోను రన్ చేసేటప్పుడు అనుమతి స్క్రీన్‌ను ప్రీ-సీడ్ చేయండి"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"డెమో లోడ్ అవుతోంది"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"లోడ్ చేయడం పూర్తయింది!"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"రూట్‌కు పాప్ చేయండి"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"అనుకూలం కాని హోస్ట్"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"మెసేజ్ టెంప్లేట్ డెమో"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"మెసేజ్‌ను ఇక్కడ టైప్ చేయాలి.\nరెండవ లైన్‌లో మరింత టెక్స్ట్‌ను జోడించవచ్చు."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"పేన్ టెంప్లేట్ డెమో"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"స్థలాల లిస్ట్ టెంప్లేట్ డెమో"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"స్థలాలను బ్రౌజ్ చేయండి"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"టింట్‌తో డ్రా చేయదగిన ఒక వెక్టార్"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"రంగు కోసం యాప్ రూపం లక్షణంతో డ్రా చేయదగిన వెక్టార్"</string>
     <string name="png_res_title" msgid="7437083018336747544">"PNG, ఒక రిసోర్స్‌గా పంపబడింది"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"PNG, ఒక రిసోర్స్‌గా పంపబడింది"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"ఒక టైటిల్ మాత్రమే"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"యాప్ చిహ్నంతో టైటిల్"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"రిసోర్స్ ID ఇమేజ్‌తో టైటిల్"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"అడ్డు వరుసల డెమో"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"టెక్స్ట్, చిహ్నాల డెమోలు"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"టెక్స్ట్, చిహ్నాల డెమోతో అడ్డు వరుసలు"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"ఎంచుకోదగిన లిస్ట్‌ల డెమో"</string>
     <string name="option_1_title" msgid="7221252541651471199">"ఆప్షన్ 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"ఆప్షన్ 2"</string>
@@ -292,6 +296,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"టాస్క్‌ల పరిమితిని చేరుకున్నారు\nఇంకా టాస్క్‌లను ఎంచుకుంటే యాప్ ఫోర్స్ స్టాప్ అవుతుంది"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"%2$dలో %1$d టాస్క్ దశ"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"ముందుకు వెళ్లడానికి క్లిక్ చేయండి"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"టోగుల్ టెస్ట్"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"స్టేట్‌ఫుల్ మార్పులు అనుమతించబడతాయి"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"టోగుల్ టెస్ట్‌ను ఎనేబుల్ చేయండి"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"టోగుల్ టెస్ట్ డిజేబుల్ చేయబడింది"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"ఇతర టెంప్లేట్‌ల డెమోలు"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"డెమోలను ప్రదర్శించండి"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"Voice Access డెమో స్క్రీన్"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"యూజర్ ఇంటరాక్షన్‌లు"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"అనుమతుల డెమోలను రిక్వెస్ట్ చేయండి"</string>
+    <string name="perm_group" msgid="3834918337351876270">"అనుమతి గ్రూప్"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"Showcase యాప్ కోసం అనుమతి గ్రూప్"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"ఖచ్చితమైన లొకేషన్ యాక్సెస్"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"ఖచ్చితమైన లొకేషన్ యాక్సెస్ కోసం అనుమతి"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"సుమారు లొకేషన్‌కు యాక్సెస్"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"సుమారు లొకేషన్‌కు యాక్సెస్ కోసం అనుమతి"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"ఆడియోను రికార్డ్ చేయడానికి యాక్సెస్"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"ఆడియోను రికార్డ్ చేయడానికి యాక్సెస్ కోసం అనుమతి"</string>
     <string name="location_1_description" msgid="4801052291684791371">"టింట్డ్ రిసోర్స్ వెక్టార్"</string>
     <string name="location_2_description" msgid="3331356135359047166">"ఇమేజ్ రిసోర్స్ బిట్‌మ్యాప్"</string>
     <string name="location_3_description" msgid="3982142774088944850">"రంగుల టెక్స్ట్ మార్కర్"</string>
     <string name="location_4_description" msgid="6560365445044381911">"ఇమేజ్ బిట్‌మ్యాప్"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"టెక్స్ట్ లేబుల్"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-th/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-th/strings.xml
index 295e06d..f0e028f 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-th/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-th/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"ข้อความนี้มีสีเขียว"</string>
     <string name="example_3_text" msgid="977269832109695627">"ข้อความนี้มีสีน้ำเงิน"</string>
     <string name="example_4_text" msgid="2043547015979437373">"ข้อความนี้มีสีเหลือง"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"ข้อความนี้ใช้แม่สี"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"ข้อความนี้ใช้สีขั้นที่ 2"</string>
     <string name="color_demo" msgid="1822427636476178993">"การสาธิตสี"</string>
     <string name="list_limit" msgid="3023536401535417286">"ขีดจำกัดรายการ"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"การดำเนินการนี้จะหยุดแอปและเพิ่มหน้าจอสิทธิ์เมื่อคุณกลับมาเรียกใช้แอปอีกครั้ง"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"การสาธิตการหยุดแอป"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"สาธิตหน้าจอการให้สิทธิ์เมื่อเรียกใช้การสาธิตครั้งถัดไป"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"สาธิตการให้สิทธิ์แอป"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"สาธิตหน้าจอการให้สิทธิ์เมื่อเรียกใช้การสาธิตครั้งถัดไป"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"กำลังโหลดการสาธิต"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"โหลดเสร็จสมบูรณ์"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"แวะไปที่รูท"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"โฮสต์ใช้ร่วมกันไม่ได้"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"การสาธิตเทมเพลตข้อความ"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"ข้อความจะแสดงที่นี่\nข้อความเพิ่มเติมจะอยู่ในบรรทัดที่ 2"</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"การสาธิตเทมเพลตแผง"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"การสาธิตเทมเพลตรายการสถานที่"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"เรียกดูสถานที่"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Vector Drawable พร้อมการปรับสมดุลสีเขียว-แดง"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Vector Drawable พร้อมแอตทริบิวต์ธีมของแอปสำหรับสีของตน"</string>
     <string name="png_res_title" msgid="7437083018336747544">"ไฟล์ PNG ส่งเป็นทรัพยากร"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"ไฟล์ PNG ส่งเป็นทรัพยากร"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"เพียงแค่ชื่อ"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"ชื่อพร้อมไอคอนแอป"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"ชื่อพร้อมรูปภาพรหัสทรัพยากร"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"การสาธิตแถว"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"การสาธิตข้อความและไอคอน"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"การสาธิตแถวที่มีข้อความและไอคอน"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"การสาธิตรายการที่เลือกได้"</string>
     <string name="option_1_title" msgid="7221252541651471199">"ตัวเลือกที่ 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"ตัวเลือกที่ 2"</string>
@@ -292,6 +296,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"ถึงขีดจำกัดงานแล้ว\nการดำเนินการต่อจะบังคับให้แอปหยุด"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"งานขั้นตอนที่ %1$d จาก %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"คลิกเพื่อดำเนินการต่อ"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"การทดสอบการสลับ"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"อนุญาตการเปลี่ยนแปลงแบบเก็บสถานะ"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"เปิดใช้การทดสอบการสลับ"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"การทดสอบการสลับปิดอยู่"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"การสาธิตเทมเพลตเบ็ดเตล็ด"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"การสาธิต Showcase"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"หน้าจอสาธิตการเข้าถึงด้วยเสียง"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"การโต้ตอบของผู้ใช้"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"การสาธิตการขอสิทธิ์"</string>
+    <string name="perm_group" msgid="3834918337351876270">"กลุ่มสิทธิ์"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"กลุ่มสิทธิ์สำหรับแอป Showcase"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"เข้าถึงตำแหน่งอย่างละเอียด"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"สิทธิ์ในการเข้าถึงตำแหน่งอย่างละเอียด"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"เข้าถึงตำแหน่งคร่าวๆ"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"สิทธิ์ในการเข้าถึงตำแหน่งคร่าวๆ"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"เข้าถึงเสียงบันทึก"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"สิทธิ์ในการเข้าถึงเสียงบันทึก"</string>
     <string name="location_1_description" msgid="4801052291684791371">"ปรับสมดุลสีเขียว-แดงของเวกเตอร์ทรัพยากรแล้ว"</string>
     <string name="location_2_description" msgid="3331356135359047166">"บิตแมปของทรัพยากรรูปภาพ"</string>
     <string name="location_3_description" msgid="3982142774088944850">"ตัวทำเครื่องหมายข้อความที่มีสี"</string>
     <string name="location_4_description" msgid="6560365445044381911">"บิตแมปของรูปภาพ"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"ป้ายกำกับข้อความ"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-tl/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-tl/strings.xml
index 0e801c43..bfd703e 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-tl/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-tl/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"May kulay berde sa text na ito"</string>
     <string name="example_3_text" msgid="977269832109695627">"May kulay asul sa text na ito"</string>
     <string name="example_4_text" msgid="2043547015979437373">"May kulay dilaw sa text na ito"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Gumagamit ang text na ito ng pangunahing kulay"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Gumagamit ang text na ito ng pangalawang kulay"</string>
     <string name="color_demo" msgid="1822427636476178993">"Demo ng Kulay"</string>
     <string name="list_limit" msgid="3023536401535417286">"Limitasyon ng Listahan"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"Wawakasan nito ang app, at pagbalik mo, magpe-preseed ito ng screen ng pahintulot"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"Demo ng Wakasan ang App"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"Demo ng I-pre Seed ang Screen ng Pahintulot sa susunod na pagpapatakbo"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"Demo ng I-preseed ng pahintulot sa App"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"Demo ng I-preseed ang Screen ng Pahintulot sa susunod na pagpapatakbo"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"Demo ng Naglo-load"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"Tapos nang Mag-load!"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"Pop to root"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Hindi compatible na host"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Demo ng Template ng Mensahe"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Dito lalabas ang mensahe.\nHigit pang text sa ikalawang linya."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Demo ng Template ng Pane"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Demo ng Template ng Listahan ng Lugar"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Mag-browse ng Mga Lugar"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Vector na drawable na may tint"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Vector na drawable na may attribute ng tema ng app para sa kulay nito"</string>
     <string name="png_res_title" msgid="7437083018336747544">"PNG na ipinadala bilang resource"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"PNG na ipinadala bilang resource"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Pamagat lang"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Pamagat na may icon ng app"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Pamagat na may larawan ng resource ID"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Demo ng Mga Row"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Mga Demo ng Text at Mga Icon"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Demo ng Mga Row na may Text at Mga Icon"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Demo ng Mga Mapipiling Listahan"</string>
     <string name="option_1_title" msgid="7221252541651471199">"Opsyon 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"Opsyon 2"</string>
@@ -292,6 +296,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Naabot na ang limitasyon ng gawain\nSapilitang ihihinto ang app kapag nagpatuloy"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Gawin ang hakbang %1$d sa %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Mag-click para magpatuloy"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"I-toggle ang test"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Pinapayagan ang mga pagbabago sa status"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"I-enable ang Pagsusuri sa Toggle"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Na-disable ang Pagsusuri sa Toggle"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Iba Pang Demo ng Mga Template"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Itampok ang Mga Demo"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"Screen ng Demo ng Pag-access gamit ang Boses"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"Mga Pakikipag-ugnayan ng User"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"Humiling ng Mga Demo ng Pahintulot"</string>
+    <string name="perm_group" msgid="3834918337351876270">"Grupo ng Pahintulot"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"Grupo ng Pahintulot para sa Showcase App"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"Access sa Eksaktong Lokasyon"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"Pahintulot para sa Access sa Eksaktong Lokasyon"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"Access sa Tinatayang Lokasyon"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"Pahintulot para sa Access sa Tinatayang Lokasyon"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"Access sa Pag-record ng Audio"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"Pahintulot para sa Access sa Pag-record ng Audio"</string>
     <string name="location_1_description" msgid="4801052291684791371">"Tinted resource vector"</string>
     <string name="location_2_description" msgid="3331356135359047166">"Resource bitmap ng larawan"</string>
     <string name="location_3_description" msgid="3982142774088944850">"May kulay na text marker"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Bitmap ng larawan"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Label ng text"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-tr/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-tr/strings.xml
index d2326b2..f8ecf4a 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-tr/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-tr/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Bu metnin rengi yeşil"</string>
     <string name="example_3_text" msgid="977269832109695627">"Bu metnin rengi mavi"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Bu metnin rengi sarı"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Bu metinde birincil renk kullanılıyor"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Bu metinde ikincil renk kullanılıyor"</string>
     <string name="color_demo" msgid="1822427636476178993">"Renk Demosu"</string>
     <string name="list_limit" msgid="3023536401535417286">"Liste Sınırı"</string>
@@ -232,6 +233,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Uyumsuz ana makine"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Mesaj Şablonu Demosu"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Mesaj buraya gelir.\nİkinci satırda daha fazla metin bulunur."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Bölme Şablonu Demosu"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Yer Listesi Şablonu Demosu"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Yerlere Göz At"</string>
@@ -267,7 +270,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Tonlama içeren drawable vektör"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Bir uygulamanın rengiyle ilgili tema özelliği içeren drawable vektör"</string>
     <string name="png_res_title" msgid="7437083018336747544">"Kaynak olarak gönderilen bir PNG"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"Kaynak olarak gönderilen bir PNG"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Sadece başlık"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Uygulama simgesi içeren başlık"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Kaynak kimliği resmi içeren başlık"</string>
@@ -279,6 +283,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Satırlar Demosu"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Metin ve Simge Demoları"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Metin ve Simge İçeren Satırlar Demosu"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Seçilebilir Listeler Demosu"</string>
     <string name="option_1_title" msgid="7221252541651471199">"1. Seçenek"</string>
     <string name="option_2_title" msgid="1905146448697963818">"2. Seçenek"</string>
@@ -292,6 +298,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Görev sınırına ulaşıldı\nDevam ederseniz uygulama zorla durdurulacak"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"%1$d/%2$d görev adımı"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Devam etmek için tıklayın"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Açma/kapatma testi"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Durum bilgili değişikliklere izin verilir"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Açma/Kapatma Testini Etkinleştir"</string>
@@ -306,6 +314,10 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Açma/Kapatma Testi Devre Dışı"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Çeşitli Şablon Demoları"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Öne Çıkan Demoları"</string>
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
+    <skip />
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
+    <skip />
     <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
     <skip />
     <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
@@ -333,4 +345,18 @@
     <string name="location_3_description" msgid="3982142774088944850">"Renkli metin işaretçisi"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Resim bit eşlemi"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Metin etiketi"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-uk/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-uk/strings.xml
index 5f7ba3b..82e4b4d 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-uk/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-uk/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Цей текст зеленого кольору"</string>
     <string name="example_3_text" msgid="977269832109695627">"Цей текст блакитного кольору"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Цей текст жовтого кольору"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Для цього тексту використано основний колір"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Для цього тексту використано додатковий колір"</string>
     <string name="color_demo" msgid="1822427636476178993">"Демонстрація екрана \"Колір\""</string>
     <string name="list_limit" msgid="3023536401535417286">"Обмеження списку"</string>
@@ -232,6 +233,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Несумісний хост"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Демонстрація шаблона повідомлення"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Тут відображається повідомлення.\nБільше тексту – у другому рядку."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Демонстрація шаблона панелі"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Демонстрація шаблона \"Список місць\""</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Перегляд місць"</string>
@@ -267,7 +270,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Векторний графічний ресурс, з відтінком"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Векторний графічний ресурс, з атрибутом теми додатка для його кольору"</string>
     <string name="png_res_title" msgid="7437083018336747544">"Файл у форматі PNG, надіслано як ресурс"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"Файл у форматі PNG, надіслано як ресурс"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Лише назва"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Назва зі значком програми"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Назва із зображенням ідентифікатора ресурсу"</string>
@@ -279,6 +283,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Демонстрація рядків"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Демонстрації тексту та значків"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Демонстрація рядків із текстом і значками"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Демонстрація списків, які можна вибрати"</string>
     <string name="option_1_title" msgid="7221252541651471199">"Варіант 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"Варіант 2"</string>
@@ -292,6 +298,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Досягнуто ліміту завдань\nЯкщо продовжити, програму буде примусово зупинено"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Крок завдання %1$d з %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Натисніть, щоб продовжити"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Змінити перевірку"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Дозволено змінювати стан"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Увімкнути перевірку перемикача"</string>
@@ -306,6 +314,10 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Перевірку перемикача вимкнено"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Демонстрації інших шаблонів"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Увімкнути демонстрації"</string>
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
+    <skip />
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
+    <skip />
     <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
     <skip />
     <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
@@ -333,4 +345,18 @@
     <string name="location_3_description" msgid="3982142774088944850">"Кольоровий маркер тексту"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Бітова карта зображення"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Текстова мітка"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-ur/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-ur/strings.xml
index 2132d7b..719d630 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-ur/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-ur/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"اس ٹیکسٹ کا رنگ سبز ہے"</string>
     <string name="example_3_text" msgid="977269832109695627">"اس ٹیکسٹ کا رنگ نیلا ہے"</string>
     <string name="example_4_text" msgid="2043547015979437373">"اس ٹیکسٹ کا رنگ پیلا ہے"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"یہ ٹیکسٹ بنیادی رنگ کا استعمال کرتا ہے"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"یہ ٹیکسٹ ثانوی رنگ کا استعمال کرتا ہے"</string>
     <string name="color_demo" msgid="1822427636476178993">"رنگ کا ڈیمو"</string>
     <string name="list_limit" msgid="3023536401535417286">"فہرست کی حد"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"اس سے ایپ بند ہو جائے گی اور آپ کے اس پر واپس آنے پر یہ اجازت کی اسکرین کو پری سیڈ کرے گی"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"ایپ کا ڈیمو ختم کریں"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"اگلی بار ڈیمو چلانے پر اجازت کی اسکرین کو پری سیڈ کریں"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"ایپ ڈیمو کی اجازت کو پری سیڈ کریں"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"اگلی بار ڈیمو چلانے پر اجازت کی اسکرین کو پری سیڈ کریں"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"ڈیمو لوڈ ہو رہا ہے"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"لوڈنگ کا عمل مکمل ہو گیا!"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"روٹ پر پاپ کریں"</string>
@@ -234,6 +233,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"غیر موافق میزبان"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"پیغام کی تمثیل کا ڈیمو"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"پیغام یہاں جاتا ہے۔\nدوسری لان پر مزید ٹیکسٹ۔"</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"پین کی تمثیل کا ڈیمو"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"مقام کی فہرست کی تمثیل کا ڈیمو"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"مقامات براؤز کریں"</string>
@@ -271,7 +272,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"ٹِنٹ کے ساتھ ڈرائنگ کے قابل ویکٹر"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"اس کے رنگ کے لیے کسی ایپ کی تھیم کے انتساب کے ساتھ ڈرائنگ کے قابل ویکٹر"</string>
     <string name="png_res_title" msgid="7437083018336747544">"‏PNG، وسیلے کے طور پر بھیجا گیا"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"‏PNG، وسیلے کے طور پر بھیجا گیا"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"صرف ایک عنوان"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"ایپ آئیکن کے ساتھ عنوان"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"‏وسیلہ ID کی تصویر کے ساتھ عنوان"</string>
@@ -283,6 +285,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"قطاروں کا ڈیمو"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"ٹیکسٹ اور آئیکنز کے ڈیموز"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"ٹیکسٹ اور آئیکنز والی قطاروں کا ڈیمو"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"قابل انتخاب فہرستوں کا ڈیمو"</string>
     <string name="option_1_title" msgid="7221252541651471199">"اختیار 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"اختیار 2"</string>
@@ -296,6 +300,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"ٹاسک کی حد پوری ہو گئی\nآگے بڑھنے سے ایپ کو زبردستی روک دیا جائے گا"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"‏%2$d میں سے ‎%1$d ٹاسک کا مرحلہ"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"آگے بڑھنے کے لیے کلک کریں"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"ٹیسٹ کو ٹوگل کریں"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"اسٹیٹ فل تبدیلیوں کی اجازت ہے"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"ٹیسٹ ٹوگل کرنے کی سہولت فعال کریں"</string>
@@ -310,31 +316,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"ٹیسٹ ٹوگل کرنے کی سہولت غیر فعال ہے"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"متفرق تمثیلات کے ڈیموز"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"ڈیموز دکھائیں"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"صوتی رسائی کی ڈیمو سکرین"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"صارف کے تعاملات"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"اجازتوں کے ڈیموز کی درخواست کریں"</string>
+    <string name="perm_group" msgid="3834918337351876270">"اجازت کا گروپ"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"شوکیس ایپ کے لیے اجازت کا گروپ"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"درست مقام تک رسائی"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"درست مقام تک رسائی کی اجازت"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"تخمینی مقام تک رسائی"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"تخمینی مقام تک رسائی کی اجازت"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"آڈیو ریکارڈ کرنے تک رسائی"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"آڈیو ریکارڈ کرنے تک رسائی کی اجازت"</string>
     <string name="location_1_description" msgid="4801052291684791371">"ٹِنٹڈ وسیلے کا ویکٹر"</string>
     <string name="location_2_description" msgid="3331356135359047166">"تصویر کے وسیلے کا بٹ میپ"</string>
     <string name="location_3_description" msgid="3982142774088944850">"رنگین ٹیکسٹ مارکر"</string>
     <string name="location_4_description" msgid="6560365445044381911">"تصویر کا بٹ میپ"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"ٹیکسٹ کا لیبل"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-uz/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-uz/strings.xml
index a27a6fd..9e39d37 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-uz/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-uz/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Bu matnda yashil rang bor"</string>
     <string name="example_3_text" msgid="977269832109695627">"Bu matnda moviy rang bor"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Bu matnda sariq rang bor"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Bu matn asosiy rangdan foydalanadi"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Bu matn ikkilamchi rangdan foydalanadi"</string>
     <string name="color_demo" msgid="1822427636476178993">"Rang namoyishi"</string>
     <string name="list_limit" msgid="3023536401535417286">"Roʻyxat cheklovi"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"Bunda ilova toʻxtatiladi va qayta ishga tushirilganda ruxsat ekrani qayta taqdim etiladi"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"Ilova namoyishini tugatish"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"Demo keyingi safar ishga tushirilganida ruxsat ekranini taqdim etish"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"Ilova demosida ruxsat ekranini tasdim qilish"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"Demo keyingi safar ishga tushirilganida ruxsat ekranini taqdim etish"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"Demo yuklanmoqda"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"Yuklandi!"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"Rootga ochish"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Nomuvofiq xost"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Xabar andozasi namoyishi"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Xabar shu yerga boradi.\nBoshqa matn ikkinchi qatorda."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Panel andozasi namoyishi"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Joy roʻyxati andozasi namoyishi"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Joylarga razm solish"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Vektorni rangli chizish mumkin"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Vektorni rangi uchun ilova mavzusi atributi bilan chizish mumkin"</string>
     <string name="png_res_title" msgid="7437083018336747544">"PNG, resurs sifatida yuborildi"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"PNG, resurs sifatida yuborildi"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Faqat sarlavha"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Ilova belgisi bilan sarlavha"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Resurs ID rasmi bilan sarlavha"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Qatorlar namoyishi"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Matn va belgilar demolari"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Matn va belgilardan iborat qatorlar namoyishi"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Belgilanadigan roʻyxatlar namoyishi"</string>
     <string name="option_1_title" msgid="7221252541651471199">"1-variant"</string>
     <string name="option_2_title" msgid="1905146448697963818">"2-variant"</string>
@@ -292,6 +296,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Vazifa chekloviga yetildi\nDavom etish ilovani majburiy toʻxtatadi."</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Vazifa qadami: %1$d / %2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Oldinga oʻtish uchun bosing"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Almashtirish tekshiruvi"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Vaziyatni oʻzgartirishga ruxsat beriladi"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Testni oʻchirish/yoqishni faollashtirish"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Testni oʻchirish/yoqish faolsizlantirildi"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Aralash andozalar demolari"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Namoyish demolari"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"Demo ekranida ovozli boshqaruv"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"Foydalanuvchi harakatlari"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"Demolarga ruxsatlarni talab qilish"</string>
+    <string name="perm_group" msgid="3834918337351876270">"Ruxsatlar guruhi"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"Vitrina ilovasi uchun ruxsatlar guruhi"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"Aniq joylashuv axborotiga ruxsat"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"Aniq joylashuvni aniqlashga ruxsat"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"Taxminiy joylashuv axborotiga ruxsat"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"Taxminiy joylashuvni aniqlashga ruxsat"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"Audio yozib olish uchun ruxsat"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"Audio yoziv olishga ruxsat"</string>
     <string name="location_1_description" msgid="4801052291684791371">"Rangli resurs vektori"</string>
     <string name="location_2_description" msgid="3331356135359047166">"Rasm resursi bitmapi"</string>
     <string name="location_3_description" msgid="3982142774088944850">"Rasmli matn belgilagichi"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Rasm bitmapi"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Matn yorligʻi"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-vi/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-vi/strings.xml
index 38117ea..ba48d24 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-vi/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-vi/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Văn bản này có màu xanh lục"</string>
     <string name="example_3_text" msgid="977269832109695627">"Văn bản này có màu đỏ xanh lam"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Văn bản này có màu vàng"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Văn bản này sử dụng màu chính"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Văn bản này sử dụng màu phụ"</string>
     <string name="color_demo" msgid="1822427636476178993">"Bản demo màu"</string>
     <string name="list_limit" msgid="3023536401535417286">"Giới hạn danh sách"</string>
@@ -232,6 +233,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Máy chủ không tương thích"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Bản demo biểu mẫu tin nhắn"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Tin nhắn vào đây.\nThêm văn bản ở dòng thứ hai."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Bản demo ngăn mẫu"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Bản demo mẫu danh sách địa điểm"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Duyệt xem các địa điểm"</string>
@@ -267,7 +270,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Một vectơ có thể vẽ, với một màu"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Vectơ có thể vẽ được, với thuộc tính chủ đề của ứng dụng cho màu sắc của nó"</string>
     <string name="png_res_title" msgid="7437083018336747544">"Một PNG, được gửi dưới dạng tài nguyên"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"Một PNG, được gửi dưới dạng tài nguyên"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Chỉ là một tiêu đề"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Tiêu đề có biểu tượng ứng dụng"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Tiêu đề có hình ảnh ID tài nguyên"</string>
@@ -279,6 +283,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Bản demo hàng"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Bản demo văn bản và biểu tượng"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Bản demo hàng với văn bản và biểu tượng"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Bản demo danh sách có thể chọn"</string>
     <string name="option_1_title" msgid="7221252541651471199">"Tùy chọn 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"Tùy chọn 2"</string>
@@ -292,6 +298,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Đã đạt đến giới hạn nhiệm vụ\nNếu tiếp tục sẽ buộc phải dừng ứng dụng"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Bước %1$d trong số %2$d của nhiệm vụ"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Nhấp để tiếp tục"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Kiểm tra chuyển đổi"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Các thay đổi rõ ràng được phép"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Bật tính năng kiểm tra chuyển đổi"</string>
@@ -306,6 +314,10 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Đã tắt tính năng kiểm tra chuyển đổi"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Bản demo biểu mẫu Misc"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Bản demo nổi bật"</string>
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
+    <skip />
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
+    <skip />
     <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
     <skip />
     <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
@@ -333,4 +345,18 @@
     <string name="location_3_description" msgid="3982142774088944850">"Đánh dấu văn bản màu"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Hình ảnh bitmap"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Nhãn văn bản"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-zh-rCN/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-zh-rCN/strings.xml
index 234eb37..3202ff4 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-zh-rCN/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-zh-rCN/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"此文本为绿色"</string>
     <string name="example_3_text" msgid="977269832109695627">"此文本为蓝色"</string>
     <string name="example_4_text" msgid="2043547015979437373">"此文本为黄色"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"此文本使用主要颜色"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"此文本使用辅助颜色"</string>
     <string name="color_demo" msgid="1822427636476178993">"颜色演示"</string>
     <string name="list_limit" msgid="3023536401535417286">"列表限制"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"这将结束应用,当您返回时,它将预先植入权限屏幕"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"结束应用演示"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"在下次运行演示时预先植入 Permission Screen"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"预先植入“App Demo”权限"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"在下次运行演示时预先植入权限屏幕"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"正在加载演示"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"加载已完成!"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"跳转至根目录"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"不兼容的主机"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"消息模板演示"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"消息放在此处。\n更多文本放在第二行。"</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"窗格模板演示"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"地点列表模板演示"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"浏览地点"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"已应用色调的矢量可绘制对象"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"使用应用的主题属性作为颜色的矢量可绘制对象"</string>
     <string name="png_res_title" msgid="7437083018336747544">"PNG,作为资源发送"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"PNG,作为资源发送"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"只是一个标题"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"包含应用图标的标题"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"包含资源 ID 图像的标题"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"行演示"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"文本和图标演示"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"随带文本和图标的行演示"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"可选列表演示"</string>
     <string name="option_1_title" msgid="7221252541651471199">"选项 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"选项 2"</string>
@@ -292,6 +296,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"已达到任务限制\n继续会强制停止应用"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"任务第 %1$d 步(共 %2$d 步)"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"点击以继续"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"切换测试"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"允许有状态更改"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"启用切换测试"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"切换测试已停用"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"其他模板演示"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"展示演示"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"Voice Access 演示屏幕"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"用户互动"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"请求权限演示"</string>
+    <string name="perm_group" msgid="3834918337351876270">"权限组"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"“展示”应用的权限组"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"访问精确位置信息"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"访问精确位置信息的权限"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"访问粗略位置信息"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"访问粗略位置信息的权限"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"访问录音"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"访问录音的权限"</string>
     <string name="location_1_description" msgid="4801052291684791371">"色调资源矢量"</string>
     <string name="location_2_description" msgid="3331356135359047166">"图像资源位图"</string>
     <string name="location_3_description" msgid="3982142774088944850">"彩色文本标记"</string>
     <string name="location_4_description" msgid="6560365445044381911">"图像位图"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"文本标签"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-zh-rHK/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-zh-rHK/strings.xml
index e382c4f..28e481f 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-zh-rHK/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-zh-rHK/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"這是綠色的文字"</string>
     <string name="example_3_text" msgid="977269832109695627">"這是藍色的文字"</string>
     <string name="example_4_text" msgid="2043547015979437373">"這是黃色的文字"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"這是使用主要顏色的文字"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"這是使用次要顏色的文字"</string>
     <string name="color_demo" msgid="1822427636476178993">"「顏色」示範"</string>
     <string name="list_limit" msgid="3023536401535417286">"清單限制"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"這麼做會結束應用程式。當應用程式重新啟動時,系統會預先新增權限畫面"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"「結束應用程式」示範"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"下一輪示範時預先新增權限要求畫面"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"示範應用程式時預先要求權限"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"下一輪示範時預先新增權限要求畫面"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"「正在載入」示範"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"載入完成!"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"跳到根層級"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"主機不兼容"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"「訊息範本」示範"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"訊息會在這裡顯示。\n其他文字會在第二行顯示。"</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"「窗格範本」示範"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"「地點清單範本」示範"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"瀏覽地點"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"有染色的向量可繪項目"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"一個向量可繪項目,採用應用程式的主題顏色"</string>
     <string name="png_res_title" msgid="7437083018336747544">"已傳送一個 PNG 檔案作為資源"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"已傳送一個 PNG 檔案作為資源"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"只是一個標題"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"含有應用程式圖示的標題"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"含有資源 ID 圖片的標題"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"「列」示範"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"「文字和圖示」示範"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"「含有文字及圖示的列」示範"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"可選取清單示範"</string>
     <string name="option_1_title" msgid="7221252541651471199">"選項 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"選項 2"</string>
@@ -292,6 +296,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"工作已達上限\n繼續使用將強制停止應用程式"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"工作步驟 %1$d,共 %2$d 個步驟"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"點擊即可繼續使用"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"切換測試"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"允許有狀態的變更"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"啟用切換測試"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"已停用切換測試"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"其他範本示範"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"展示示範"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"語音操控示範畫面"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"使用者互動"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"「要求權限」示範"</string>
+    <string name="perm_group" msgid="3834918337351876270">"權限群組"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"「展示」應用程式的權限群組"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"存取精確位置"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"存取精確位置的權限"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"存取約略位置"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"存取約略位置的權限"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"存取錄音功能"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"存取錄音功能的權限"</string>
     <string name="location_1_description" msgid="4801052291684791371">"有染色的資源向量"</string>
     <string name="location_2_description" msgid="3331356135359047166">"圖片資源點陣圖"</string>
     <string name="location_3_description" msgid="3982142774088944850">"有顏色的文字標記"</string>
     <string name="location_4_description" msgid="6560365445044381911">"圖片點陣圖"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"文字標籤"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-zh-rTW/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-zh-rTW/strings.xml
index 384e56b..1d952c4 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-zh-rTW/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-zh-rTW/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"這是綠色的文字"</string>
     <string name="example_3_text" msgid="977269832109695627">"這是藍色的文字"</string>
     <string name="example_4_text" msgid="2043547015979437373">"這是黃色的文字"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"這是使用主要顏色的文字"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"這是使用次要顏色的文字"</string>
     <string name="color_demo" msgid="1822427636476178993">"「顏色」示範"</string>
     <string name="list_limit" msgid="3023536401535417286">"清單限制"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"這麼做會結束應用程式。當應用程式重新啟動時,系統會新增權限畫面"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"「結束應用程式」示範"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"下一輪示範時新增權限畫面"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"加入權限應用程式示範"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"下一輪示範時將加入權限要求畫面"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"「正在載入」示範"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"載入完成!"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"跳到根層級"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"主機不相容"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"「訊息範本」示範"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"訊息會顯示在這裡。\n其他文字會顯示在第二行。"</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"「窗格範本」示範"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"「地點清單範本」示範"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"瀏覽地點"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"有色調的向量可繪項目"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"一個向量可繪項目,採用應用程式的主題顏色"</string>
     <string name="png_res_title" msgid="7437083018336747544">"已傳送一個 PNG 檔案做為資源"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"已傳送一個 PNG 檔案做為資源"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"只是一個標題"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"含有應用程式圖示的標題"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"含有資源 ID 圖片的標題"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"「列」示範"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"「文字和圖示」示範"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"「含有文字及圖示的列」示範"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"「可選取的清單」示範"</string>
     <string name="option_1_title" msgid="7221252541651471199">"選項 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"選項 2"</string>
@@ -292,6 +296,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"工作已達上限\n繼續使用將強制停止應用程式"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"工作步驟 %1$d,共 %2$d 個步驟"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"點選即可繼續使用"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"切換測試"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"允許有狀態的變更"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"啟用切換測試"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"切換測試已停用"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"其他範本示範"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"「展示」示範"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"Voice Access 示範畫面"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"使用者互動"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"要求權限示範"</string>
+    <string name="perm_group" msgid="3834918337351876270">"權限群組"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"「展示」應用程式的權限群組"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"精確位置存取權"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"精確位置存取權限"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"約略位置存取權"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"約略位置存取權限"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"錄音存取權"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"錄音存取權限"</string>
     <string name="location_1_description" msgid="4801052291684791371">"有色調的資源向量"</string>
     <string name="location_2_description" msgid="3331356135359047166">"圖片資源點陣圖"</string>
     <string name="location_3_description" msgid="3982142774088944850">"有顏色的文字標記"</string>
     <string name="location_4_description" msgid="6560365445044381911">"圖片點陣圖"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"文字標籤"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values-zu/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values-zu/strings.xml
index 7d9c1d7..1296453 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values-zu/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values-zu/strings.xml
@@ -100,7 +100,8 @@
     <string name="example_2_text" msgid="718820705318661440">"Lo mbhalo unombala oluhlaza kotshani"</string>
     <string name="example_3_text" msgid="977269832109695627">"Lo mbhalo unombala oluhlaza kwesibhakabhaka"</string>
     <string name="example_4_text" msgid="2043547015979437373">"Lo mbhalo unombala ophuzi"</string>
-    <string name="example_5_text" msgid="4387859825054561488">"Lo mbhalo usebenzisa umbala oyinhloko"</string>
+    <!-- no translation found for example_5_text (8828804968749423500) -->
+    <skip />
     <string name="example_6_text" msgid="7991523168517599600">"Lo mbhalo usebenzisa umbala wesibili"</string>
     <string name="color_demo" msgid="1822427636476178993">"Umbala Wedemo"</string>
     <string name="list_limit" msgid="3023536401535417286">"Umkhawulo Wohlu"</string>
@@ -113,10 +114,8 @@
     <string name="finish_app_msg" msgid="8354334557053141891">"Lokhu kuzoqeda i-app, futhi uma ubuya kuzokhipha isikrini semvume kusengaphambili"</string>
     <string name="finish_app_title" msgid="9013328479438745074">"Qedelela i-App Yedemo"</string>
     <string name="finish_app_demo_title" msgid="8223819062053448384">"Hlunga kusengaphambili Isikrini Semvume ekuqalisweni kwe-Demo okulandelayo"</string>
-    <!-- no translation found for preseed_permission_app_title (182847662545676962) -->
-    <skip />
-    <!-- no translation found for preseed_permission_demo_title (5476541421753978071) -->
-    <skip />
+    <string name="preseed_permission_app_title" msgid="182847662545676962">"Idemo Ye-App yemvume yangaphambi kwembewu"</string>
+    <string name="preseed_permission_demo_title" msgid="5476541421753978071">"Thola kusengaphambili Isikrini Semvume ekuqalisweni kwe-Demo okulandelayo"</string>
     <string name="loading_demo_title" msgid="1086529475809143517">"Ilayisha Idemo"</string>
     <string name="loading_demo_row_title" msgid="8933049915126088142">"Ukulayisha Kuqedile!"</string>
     <string name="pop_to_root" msgid="2078277386355064198">"Ngena empandeni"</string>
@@ -232,6 +231,8 @@
     <string name="long_msg_template_not_supported_title" msgid="8600719470226274925">"Umsingathi ongahambisani"</string>
     <string name="msg_template_demo_title" msgid="3895210951340409473">"Idemo Yesifanekiso Somyalezo"</string>
     <string name="msg_template_demo_text" msgid="2275291617716161409">"Umyalezo uya lapha.\nUmbhalo owengeziwe emugqeni wesibili."</string>
+    <!-- no translation found for short_msg_template_demo_title (6798738013668580714) -->
+    <skip />
     <string name="pane_template_demo_title" msgid="7804292600060341608">"Idemo Yesifanekiso se-Pane"</string>
     <string name="place_list_template_demo_title" msgid="2054022985455460469">"Beka Idemo Yesifanekiso Sohlu"</string>
     <string name="browse_places_title" msgid="7246005909846715898">"Bhrawuza Izindawo"</string>
@@ -267,7 +268,8 @@
     <string name="vector_with_tint_title" msgid="1022346419829696827">"Ivekhtha edwebekayo, ene-tint"</string>
     <string name="vector_with_app_theme_attr_title" msgid="4890094482708376219">"Ivekhtha edwebekayo, ngesibaluli setimu ye-app yombala walo"</string>
     <string name="png_res_title" msgid="7437083018336747544">"I-PNG, ithunyelwe njengensiza"</string>
-    <string name="png_bitmap_title" msgid="120790220238335267">"I-PNG, ithunyelwe njengensiza"</string>
+    <!-- no translation found for png_bitmap_title (3385912074130977032) -->
+    <skip />
     <string name="just_row_title" msgid="965700021568970725">"Kancane nje"</string>
     <string name="title_with_app_icon_row_title" msgid="6294250714820740520">"Isihloko esinesithonjana se-app"</string>
     <string name="title_with_res_id_image_row_title" msgid="3813134904602875778">"Isihloko esinensiza yomfanekiso we-ID"</string>
@@ -279,6 +281,8 @@
     <string name="rows_demo_title" msgid="3198566660454251007">"Idemo Yemigqa"</string>
     <string name="text_icons_demo_title" msgid="8732943920672143201">"Umbhalo Nezithonjana Zamademo"</string>
     <string name="row_text_icons_demo_title" msgid="135167694047524905">"Imigqa Enombhalo kanye Nedemo Yezithonjana"</string>
+    <!-- no translation found for radio_button_list_demo_title (9082264324855338774) -->
+    <skip />
     <string name="selectable_lists_demo_title" msgid="5492658731113129386">"Idemo Yohlu Olukhethekayo"</string>
     <string name="option_1_title" msgid="7221252541651471199">"Inketho 1"</string>
     <string name="option_2_title" msgid="1905146448697963818">"Inketho 2"</string>
@@ -292,6 +296,8 @@
     <string name="task_limit_reached_msg" msgid="6038763366777119364">"Umkhawulo womsebenzi ufinyelelwe\nUkuqhubekela phambili kuzophoqa ukumisa i-app"</string>
     <string name="task_step_of_title" msgid="2791717962535723839">"Isinyathelo somsebenzi %1$d kwengu-%2$d"</string>
     <string name="task_step_of_text" msgid="4646729781462227219">"Chofoza ukuze uye phambili"</string>
+    <!-- no translation found for toggle_button_demo_title (3179103600967398928) -->
+    <skip />
     <string name="toggle_test_title" msgid="924485265152862631">"Guqula ukuhlola"</string>
     <string name="toggle_test_text" msgid="8107217216013312857">"Izinguquko ezisemthethweni zivunyelwe"</string>
     <string name="toggle_test_first_toggle_title" msgid="3635022201072117680">"Nika Amandla Ukuhlola Kokuguqula"</string>
@@ -306,31 +312,38 @@
     <string name="toggle_test_disabled" msgid="8366040658408451664">"Ukuhlola Kokuguqula Kukhutshaziwe"</string>
     <string name="misc_templates_demos_title" msgid="6077169010255928114">"Amademo Ezifanekiso Ezixubile"</string>
     <string name="showcase_demos_title" msgid="1542092687878113304">"Bonisa Amademo"</string>
-    <!-- no translation found for voice_access_demo_title (3825223890895361496) -->
+    <!-- no translation found for template_layouts_demo_title (788249269446087847) -->
     <skip />
-    <!-- no translation found for user_interactions_demo_title (1356952319161314986) -->
+    <!-- no translation found for grid_template_menu_demo_title (7096285873490705119) -->
     <skip />
-    <!-- no translation found for request_permission_menu_demo_title (4796486779527427017) -->
-    <skip />
-    <!-- no translation found for perm_group (3834918337351876270) -->
-    <skip />
-    <!-- no translation found for perm_group_description (7348847631139139024) -->
-    <skip />
-    <!-- no translation found for perm_fine_location (5438874642600304118) -->
-    <skip />
-    <!-- no translation found for perm_fine_location_desc (3549183883787912516) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location (6140337431619481015) -->
-    <skip />
-    <!-- no translation found for perm_coarse_location_desc (6074759942301565943) -->
-    <skip />
-    <!-- no translation found for perm_record_audio (2758340693260523493) -->
-    <skip />
-    <!-- no translation found for perm_record_audio_desc (8038648467605928912) -->
-    <skip />
+    <string name="voice_access_demo_title" msgid="3825223890895361496">"Isikrini Sedemo Sokufinyelela Ngezwi"</string>
+    <string name="user_interactions_demo_title" msgid="1356952319161314986">"Ukusebenzisana Komsebenzisi"</string>
+    <string name="request_permission_menu_demo_title" msgid="4796486779527427017">"Cela Amademo Ezimvume"</string>
+    <string name="perm_group" msgid="3834918337351876270">"Iqembu Lemvume"</string>
+    <string name="perm_group_description" msgid="7348847631139139024">"Iqembu Lemvume Le-app Ye-showcase"</string>
+    <string name="perm_fine_location" msgid="5438874642600304118">"Ukufinyelela Endaweni Enhle"</string>
+    <string name="perm_fine_location_desc" msgid="3549183883787912516">"Imvume Yokufinyelela Endaweni Enhle"</string>
+    <string name="perm_coarse_location" msgid="6140337431619481015">"Ukufinyelela Endaweni Emaholoholo"</string>
+    <string name="perm_coarse_location_desc" msgid="6074759942301565943">"Imvume Yokufinyelela Endaweni Emaholoholo"</string>
+    <string name="perm_record_audio" msgid="2758340693260523493">"Ukufinyelela Kurekhodi Lomsindo"</string>
+    <string name="perm_record_audio_desc" msgid="8038648467605928912">"Imvume Yokufinyelela Ukurekhoda Umsindo"</string>
     <string name="location_1_description" msgid="4801052291684791371">"Ivekhtha yensiza enemibala"</string>
     <string name="location_2_description" msgid="3331356135359047166">"Umfanekiso wensiza ye-bitmap"</string>
     <string name="location_3_description" msgid="3982142774088944850">"Umaka wombala wombhalo"</string>
     <string name="location_4_description" msgid="6560365445044381911">"Umfanekiso we-bitmap"</string>
     <string name="location_description_text_label" msgid="2779911545316756419">"Ilebula yombhalo"</string>
+    <!-- no translation found for parking_vs_driving_demo_title (3367862800135053111) -->
+    <skip />
+    <!-- no translation found for latest_feature_details (6843008350392721502) -->
+    <skip />
+    <!-- no translation found for latest_feature_title (7929405790070777460) -->
+    <skip />
+    <!-- no translation found for loading_toggle_enabled (8828072732804454994) -->
+    <skip />
+    <!-- no translation found for loading_toggle_disabled (7689738885077382673) -->
+    <skip />
+    <!-- no translation found for loading_screen (4771507490730308794) -->
+    <skip />
+    <!-- no translation found for vector_toggle_details (1301305340033556819) -->
+    <skip />
 </resources>
diff --git a/car/app/app-samples/showcase/common/src/main/res/values/strings.xml b/car/app/app-samples/showcase/common/src/main/res/values/strings.xml
index 45f07ef..9a75cf192 100644
--- a/car/app/app-samples/showcase/common/src/main/res/values/strings.xml
+++ b/car/app/app-samples/showcase/common/src/main/res/values/strings.xml
@@ -113,7 +113,7 @@
   <string name="example_2_text">This text has a green color</string>
   <string name="example_3_text">This text has a blue color</string>
   <string name="example_4_text">This text has a yellow color</string>
-  <string name="example_5_text">This text uses the primary colo</string>
+  <string name="example_5_text">This text uses the primary color</string>
   <string name="example_6_text">This text uses the secondary color</string>
   <string name="color_demo">Color Demo</string>
 
@@ -291,6 +291,7 @@
   <!-- MessageTemplateDemoScreen -->
   <string name="msg_template_demo_title">Message Template Demo</string>
   <string name="msg_template_demo_text">Message goes here.\nMore text on second line.</string>
+  <string name="short_msg_template_demo_title">Short Message Template Demo</string>
 
   <!-- PaneTemplateDemoScreen -->
   <string name="pane_template_demo_title">Pane Template Demo</string>
@@ -338,7 +339,7 @@
   <string name="vector_with_tint_title">A vector drawable, with a tint</string>
   <string name="vector_with_app_theme_attr_title">A vector drawable, with an app\'s theme attribute for its color</string>
   <string name="png_res_title">A PNG, sent as a resource</string>
-  <string name="png_bitmap_title">A PNG, sent as a resource</string>
+  <string name="png_bitmap_title">A PNG, sent as a bitmap</string>
 
   <!-- RowDemoScreen -->
   <string name="just_row_title">Just a title</string>
@@ -356,6 +357,7 @@
   <string name="row_text_icons_demo_title">Rows with Text and Icons Demo</string>
 
   <!-- SelectableListsDemoScreen -->
+  <string name="radio_button_list_demo_title">Radio Button Lists Demo</string>
   <string name="selectable_lists_demo_title">Selectable Lists Demo</string>
   <string name="option_1_title">Option 1</string>
   <string name="option_2_title">Option 2</string>
@@ -371,6 +373,9 @@
   <string name="task_limit_reached_msg">Task limit reached\nGoing forward will force stop the app</string>
   <string name="task_step_of_title">Task step %1$d of %2$d</string>
   <string name="task_step_of_text">Click to go forward</string>
+
+  <!-- ToggleButtonDemoScreen -->
+  <string name="toggle_button_demo_title">Toggle Button Demo</string>
   <string name="toggle_test_title">Toggle test</string>
   <string name="toggle_test_text">Stateful changes are allowed</string>
   <string name="toggle_test_first_toggle_title">Enable Toggle Test</string>
@@ -388,6 +393,8 @@
   <string name="misc_templates_demos_title">Misc Templates Demos</string>
   <string name="cal_api_level_prefix" translatable="false">CAL API Level: %d</string>
   <string name="showcase_demos_title">Showcase Demos</string>
+  <string name="template_layouts_demo_title">Template Layout Demos</string>
+  <string name="grid_template_menu_demo_title">Grid Template Demos</string>
 
   <!-- User Interactions Screen -->
   <string name="voice_access_demo_title">Voice Access Demo Screen</string>
@@ -433,4 +440,12 @@
   <string name="location_9_address" translatable="false">111 Waverly Way, Kirkland, WA 98033</string>
   <string name="location_description_text_label">Text label</string>
   <string name="location_phone_not_available" translatable="false">n/a</string>
+
+  <string name="parking_vs_driving_demo_title">Parking Vs Driving Demo</string>
+  <string name="latest_feature_details">Cluster Displays in cars!</string>
+  <string name="latest_feature_title">Latest Features</string>
+  <string name="loading_toggle_enabled">Loading enabled</string>
+  <string name="loading_toggle_disabled">Loading disabled</string>
+  <string name="loading_screen">Loading screen</string>
+  <string name="vector_toggle_details">Toggle to add/remove color</string>
 </resources>
diff --git a/car/app/app/api/public_plus_experimental_1.3.0-beta02.txt b/car/app/app/api/public_plus_experimental_1.3.0-beta02.txt
index 108129b..514019a 100644
--- a/car/app/app/api/public_plus_experimental_1.3.0-beta02.txt
+++ b/car/app/app/api/public_plus_experimental_1.3.0-beta02.txt
@@ -841,6 +841,44 @@
 
 }
 
+package androidx.car.app.messaging.model {
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.ExperimentalCarApi @androidx.car.app.annotations.RequiresCarApi(6) public class CarMessage {
+    method public androidx.car.app.model.CarText getBody();
+    method public long getReceivedTimeEpochMillis();
+    method public androidx.core.app.Person getSender();
+    method public boolean isRead();
+  }
+
+  public static final class CarMessage.Builder {
+    ctor public CarMessage.Builder();
+    method public androidx.car.app.messaging.model.CarMessage build();
+    method public androidx.car.app.messaging.model.CarMessage.Builder setBody(androidx.car.app.model.CarText);
+    method public androidx.car.app.messaging.model.CarMessage.Builder setRead(boolean);
+    method public androidx.car.app.messaging.model.CarMessage.Builder setReceivedTimeEpochMillis(long);
+    method public androidx.car.app.messaging.model.CarMessage.Builder setSender(androidx.core.app.Person);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.ExperimentalCarApi @androidx.car.app.annotations.RequiresCarApi(6) public class ConversationItem implements androidx.car.app.model.Item {
+    method public androidx.car.app.model.CarIcon? getIcon();
+    method public String getId();
+    method public java.util.List<androidx.car.app.messaging.model.CarMessage!> getMessages();
+    method public androidx.car.app.model.CarText getTitle();
+    method public boolean isGroupConversation();
+  }
+
+  public static final class ConversationItem.Builder {
+    ctor public ConversationItem.Builder();
+    method public androidx.car.app.messaging.model.ConversationItem build();
+    method public androidx.car.app.messaging.model.ConversationItem.Builder setGroupConversation(boolean);
+    method public androidx.car.app.messaging.model.ConversationItem.Builder setIcon(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.messaging.model.ConversationItem.Builder setId(String);
+    method public androidx.car.app.messaging.model.ConversationItem.Builder setMessages(java.util.List<androidx.car.app.messaging.model.CarMessage!>);
+    method public androidx.car.app.messaging.model.ConversationItem.Builder setTitle(androidx.car.app.model.CarText);
+  }
+
+}
+
 package androidx.car.app.model {
 
   @androidx.car.app.annotations.CarProtocol public final class Action {
diff --git a/car/app/app/api/public_plus_experimental_current.txt b/car/app/app/api/public_plus_experimental_current.txt
index 108129b..514019a 100644
--- a/car/app/app/api/public_plus_experimental_current.txt
+++ b/car/app/app/api/public_plus_experimental_current.txt
@@ -841,6 +841,44 @@
 
 }
 
+package androidx.car.app.messaging.model {
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.ExperimentalCarApi @androidx.car.app.annotations.RequiresCarApi(6) public class CarMessage {
+    method public androidx.car.app.model.CarText getBody();
+    method public long getReceivedTimeEpochMillis();
+    method public androidx.core.app.Person getSender();
+    method public boolean isRead();
+  }
+
+  public static final class CarMessage.Builder {
+    ctor public CarMessage.Builder();
+    method public androidx.car.app.messaging.model.CarMessage build();
+    method public androidx.car.app.messaging.model.CarMessage.Builder setBody(androidx.car.app.model.CarText);
+    method public androidx.car.app.messaging.model.CarMessage.Builder setRead(boolean);
+    method public androidx.car.app.messaging.model.CarMessage.Builder setReceivedTimeEpochMillis(long);
+    method public androidx.car.app.messaging.model.CarMessage.Builder setSender(androidx.core.app.Person);
+  }
+
+  @androidx.car.app.annotations.CarProtocol @androidx.car.app.annotations.ExperimentalCarApi @androidx.car.app.annotations.RequiresCarApi(6) public class ConversationItem implements androidx.car.app.model.Item {
+    method public androidx.car.app.model.CarIcon? getIcon();
+    method public String getId();
+    method public java.util.List<androidx.car.app.messaging.model.CarMessage!> getMessages();
+    method public androidx.car.app.model.CarText getTitle();
+    method public boolean isGroupConversation();
+  }
+
+  public static final class ConversationItem.Builder {
+    ctor public ConversationItem.Builder();
+    method public androidx.car.app.messaging.model.ConversationItem build();
+    method public androidx.car.app.messaging.model.ConversationItem.Builder setGroupConversation(boolean);
+    method public androidx.car.app.messaging.model.ConversationItem.Builder setIcon(androidx.car.app.model.CarIcon);
+    method public androidx.car.app.messaging.model.ConversationItem.Builder setId(String);
+    method public androidx.car.app.messaging.model.ConversationItem.Builder setMessages(java.util.List<androidx.car.app.messaging.model.CarMessage!>);
+    method public androidx.car.app.messaging.model.ConversationItem.Builder setTitle(androidx.car.app.model.CarText);
+  }
+
+}
+
 package androidx.car.app.model {
 
   @androidx.car.app.annotations.CarProtocol public final class Action {
diff --git a/car/app/app/lint-baseline.xml b/car/app/app/lint-baseline.xml
index 6f805be..1c92b5a 100644
--- a/car/app/app/lint-baseline.xml
+++ b/car/app/app/lint-baseline.xml
@@ -327,7 +327,7 @@
 
     <issue
         id="WrongConstant"
-        message="Must be one of: CarAppApiLevels.UNKNOWN, CarAppApiLevels.LEVEL_1, CarAppApiLevels.LEVEL_2, CarAppApiLevels.LEVEL_3, CarAppApiLevels.LEVEL_4, CarAppApiLevels.LEVEL_5"
+        message="Must be one of: CarAppApiLevels.UNKNOWN, CarAppApiLevels.LEVEL_1, CarAppApiLevels.LEVEL_2, CarAppApiLevels.LEVEL_3, CarAppApiLevels.LEVEL_4, CarAppApiLevels.LEVEL_5, CarAppApiLevels.LEVEL_6"
         errorLine1="        mCarAppApiLevel = handshakeInfo.getHostCarAppApiLevel();"
         errorLine2="                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -370,4 +370,40 @@
             file="src/main/java/androidx/car/app/navigation/model/PanModeDelegateImpl.java"/>
     </issue>
 
+    <issue
+        id="SupportAnnotationUsage"
+        message="This annotation does not apply for type java.util.List&lt;androidx.car.app.hardware.climate.CarClimateFeature>; expected int"
+        errorLine1="    @ClimateProfileRequest.ClimateProfileFeature"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/car/app/hardware/climate/RegisterClimateStateRequest.java"/>
+    </issue>
+
+    <issue
+        id="SupportAnnotationUsage"
+        message="This annotation does not apply for type java.util.List&lt;androidx.car.app.hardware.climate.CarClimateFeature>; expected int"
+        errorLine1="    @ClimateProfileRequest.ClimateProfileFeature"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/car/app/hardware/climate/RegisterClimateStateRequest.java"/>
+    </issue>
+
+    <issue
+        id="SupportAnnotationUsage"
+        message="This annotation does not apply for type java.util.List&lt;androidx.car.app.hardware.climate.CarClimateFeature>; expected int"
+        errorLine1="    @ClimateProfileRequest.ClimateProfileFeature"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/car/app/hardware/climate/RegisterClimateStateRequest.java"/>
+    </issue>
+
+    <issue
+        id="SupportAnnotationUsage"
+        message="This annotation does not apply for type androidx.car.app.model.Row.Builder; expected int or long"
+        errorLine1="        @IntRange(from = 0)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/car/app/model/Row.java"/>
+    </issue>
+
 </issues>
diff --git a/car/app/app/src/main/java/androidx/car/app/messaging/model/CarMessage.java b/car/app/app/src/main/java/androidx/car/app/messaging/model/CarMessage.java
new file mode 100644
index 0000000..f5bd59f
--- /dev/null
+++ b/car/app/app/src/main/java/androidx/car/app/messaging/model/CarMessage.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright 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 androidx.car.app.messaging.model;
+
+import static java.util.Objects.requireNonNull;
+
+import androidx.annotation.Keep;
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.car.app.annotations.CarProtocol;
+import androidx.car.app.annotations.ExperimentalCarApi;
+import androidx.car.app.annotations.RequiresCarApi;
+import androidx.car.app.model.CarText;
+import androidx.core.app.Person;
+
+/** Represents a single message in a {@link ConversationItem} */
+@ExperimentalCarApi
+@CarProtocol
+@RequiresCarApi(6)
+public class CarMessage {
+    @Keep
+    @NonNull
+    private final Person mSender;
+
+    @Keep
+    @NonNull
+    private final CarText mBody;
+    @Keep
+    private final long mReceivedTimeEpochMillis;
+
+    @Keep
+    private final boolean mIsRead;
+
+    CarMessage(@NonNull Builder builder) {
+        this.mSender = requireNonNull(builder.mSender);
+        this.mBody = requireNonNull(builder.mBody);
+        this.mReceivedTimeEpochMillis = builder.mReceivedTimeEpochMillis;
+        this.mIsRead = builder.mIsRead;
+    }
+
+    /** Default constructor for serialization. */
+    private CarMessage() {
+        this.mSender = new Person.Builder().setName("").build();
+        this.mBody = new CarText.Builder("").build();
+        this.mReceivedTimeEpochMillis = 0;
+        this.mIsRead = false;
+    }
+
+
+    /** Returns a {@link Person} representing the message sender */
+    @NonNull public Person getSender() {
+        return mSender;
+    }
+
+    /** Returns a {@link CarText} representing the message body */
+    @NonNull
+    public CarText getBody() {
+        return mBody;
+    }
+
+    /** Returns a {@code long} representing the message timestamp (in epoch millis) */
+    public long getReceivedTimeEpochMillis() {
+        return mReceivedTimeEpochMillis;
+    }
+
+    /** Returns a {@link boolean}, indicating whether the message has been read */
+    public boolean isRead() {
+        return mIsRead;
+    }
+
+    /** A builder for {@link CarMessage} */
+    public static final class Builder {
+        @Nullable
+        Person mSender;
+        @Nullable
+        CarText mBody;
+        long mReceivedTimeEpochMillis;
+        boolean mIsRead;
+
+        /** Sets a {@link Person} representing the message sender */
+        public @NonNull Builder setSender(@NonNull Person sender) {
+            mSender = sender;
+            return this;
+        }
+
+        /** Sets a {@link CarText} representing the message body */
+        public @NonNull Builder setBody(@NonNull CarText body) {
+            mBody = body;
+            return this;
+        }
+
+        /** Sets a {@code long} representing the message timestamp (in epoch millis) */
+        public @NonNull Builder setReceivedTimeEpochMillis(long receivedTimeEpochMillis) {
+            mReceivedTimeEpochMillis = receivedTimeEpochMillis;
+            return this;
+        }
+
+        /** Sets a {@link boolean}, indicating whether the message has been read */
+        public @NonNull Builder setRead(boolean isRead) {
+            mIsRead = isRead;
+            return this;
+        }
+
+        /** Returns a new {@link CarMessage} instance defined by this builder */
+        public @NonNull CarMessage build() {
+            return new CarMessage(this);
+        }
+    }
+}
diff --git a/car/app/app/src/main/java/androidx/car/app/messaging/model/ConversationItem.java b/car/app/app/src/main/java/androidx/car/app/messaging/model/ConversationItem.java
new file mode 100644
index 0000000..42eeeba
--- /dev/null
+++ b/car/app/app/src/main/java/androidx/car/app/messaging/model/ConversationItem.java
@@ -0,0 +1,160 @@
+/*
+ * Copyright 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 androidx.car.app.messaging.model;
+
+import static java.util.Objects.requireNonNull;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.car.app.annotations.CarProtocol;
+import androidx.car.app.annotations.ExperimentalCarApi;
+import androidx.car.app.annotations.RequiresCarApi;
+import androidx.car.app.model.CarIcon;
+import androidx.car.app.model.CarText;
+import androidx.car.app.model.Item;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/** Represents a conversation */
+@ExperimentalCarApi
+@CarProtocol
+@RequiresCarApi(6)
+public class ConversationItem implements Item {
+    @NonNull private final String mId;
+    @NonNull private final CarText mTitle;
+    @Nullable
+    private final CarIcon mIcon;
+    private final boolean mIsGroupConversation;
+    @NonNull private final List<CarMessage> mMessages;
+
+    ConversationItem(@NonNull Builder builder) {
+        this.mId = requireNonNull(builder.mId);
+        this.mTitle = requireNonNull(builder.mTitle);
+        this.mIcon = builder.mIcon;
+        this.mIsGroupConversation = builder.mIsGroupConversation;
+        this.mMessages = requireNonNull(builder.mMessages);
+    }
+
+    /** Default constructor for serialization. */
+    private ConversationItem() {
+        mId = "";
+        mTitle = new CarText.Builder("").build();
+        mIcon = null;
+        mIsGroupConversation = false;
+        mMessages = new ArrayList<>();
+    }
+
+    /**
+     * Returns a unique identifier for the conversation
+     *
+     * @see Builder#setId
+     */
+    public @NonNull String getId() {
+        return mId;
+    }
+
+    /** Returns the title of the conversation */
+    public @NonNull CarText getTitle() {
+        return mTitle;
+    }
+
+    /** Returns a {@link CarIcon} for the conversation, or {@code null} if not set */
+    public @Nullable CarIcon getIcon() {
+        return mIcon;
+    }
+
+    /**
+     * Returns whether this conversation involves 3+ participants (a "group" conversation)
+     *
+     * @see Builder#setGroupConversation(boolean)
+     */
+    public boolean isGroupConversation() {
+        return mIsGroupConversation;
+    }
+
+    /** Returns a list of messages for this {@link ConversationItem} */
+    public @NonNull List<CarMessage> getMessages() {
+        return mMessages;
+    }
+
+    /** A builder for {@link ConversationItem} */
+    public static final class Builder {
+        @Nullable
+        String mId;
+        @Nullable
+        CarText mTitle;
+        @Nullable
+        CarIcon mIcon;
+        boolean mIsGroupConversation;
+        @Nullable
+        List<CarMessage> mMessages;
+
+        /**
+         * Specifies a unique identifier for the conversation
+         *
+         * <p> IDs may be used for a variety of purposes, including...
+         * <ul>
+         *     <li> Distinguishing new {@link ConversationItem}s from updated
+         *     {@link ConversationItem}s in the UI, when data is refreshed
+         *     <li> Identifying {@link ConversationItem}s in "mark as read" / "reply" callbacks
+         * </ul>
+         */
+        public @NonNull Builder setId(@NonNull String id) {
+            mId = id;
+            return this;
+        }
+
+        /** Sets the title of the conversation */
+        public @NonNull Builder setTitle(@NonNull CarText title) {
+            mTitle = title;
+            return this;
+        }
+
+        /** Sets a {@link CarIcon} for the conversation */
+        public @NonNull Builder setIcon(@NonNull CarIcon icon) {
+            mIcon = icon;
+            return this;
+        }
+
+        /**
+         * Specifies whether this conversation involves 3+ participants (a "group" conversation)
+         *
+         * <p> If unspecified, conversations are assumed to have exactly two participants (a "1:1"
+         * conversation)
+         *
+         * <p> UX presentation may differ slightly between group and 1:1 conversations. As a
+         * historical example, message readout may include sender names for group conversations, but
+         * omit them for 1:1 conversations.
+         */
+        public @NonNull Builder setGroupConversation(boolean isGroupConversation) {
+            mIsGroupConversation = isGroupConversation;
+            return this;
+        }
+
+        /** Specifies a list of messages for the conversation */
+        public @NonNull Builder setMessages(@NonNull List<CarMessage> messages) {
+            mMessages = messages;
+            return this;
+        }
+
+        /** Returns a new {@link ConversationItem} instance defined by this builder */
+        public @NonNull ConversationItem build() {
+            return new ConversationItem(this);
+        }
+    }
+}
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridPrefetcherTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridPrefetcherTest.kt
index 0c54c3c1..3c9694c 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridPrefetcherTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/grid/LazyGridPrefetcherTest.kt
@@ -33,6 +33,7 @@
 import androidx.compose.ui.unit.dp
 import androidx.test.filters.LargeTest
 import com.google.common.truth.Truth
+import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.runBlocking
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -60,7 +61,7 @@
 
     @Test
     fun notPrefetchingForwardInitially() {
-        composeList()
+        composeGrid()
 
         rule.onNodeWithTag("4")
             .assertDoesNotExist()
@@ -68,7 +69,7 @@
 
     @Test
     fun notPrefetchingBackwardInitially() {
-        composeList(firstItem = 4)
+        composeGrid(firstItem = 4)
 
         rule.onNodeWithTag("0")
             .assertDoesNotExist()
@@ -76,7 +77,7 @@
 
     @Test
     fun prefetchingForwardAfterSmallScroll() {
-        composeList()
+        composeGrid()
 
         rule.runOnIdle {
             runBlocking {
@@ -96,7 +97,7 @@
 
     @Test
     fun prefetchingBackwardAfterSmallScroll() {
-        composeList(firstItem = 4, itemOffset = 10)
+        composeGrid(firstItem = 4, itemOffset = 10)
 
         rule.runOnIdle {
             runBlocking {
@@ -116,7 +117,7 @@
 
     @Test
     fun prefetchingForwardAndBackward() {
-        composeList(firstItem = 2)
+        composeGrid(firstItem = 2)
 
         rule.runOnIdle {
             runBlocking {
@@ -152,7 +153,7 @@
 
     @Test
     fun prefetchingForwardTwice() {
-        composeList()
+        composeGrid()
 
         rule.runOnIdle {
             runBlocking {
@@ -181,7 +182,7 @@
 
     @Test
     fun prefetchingBackwardTwice() {
-        composeList(firstItem = 8)
+        composeGrid(firstItem = 8)
 
         rule.runOnIdle {
             runBlocking {
@@ -212,7 +213,7 @@
 
     @Test
     fun prefetchingForwardAndBackwardReverseLayout() {
-        composeList(firstItem = 2, reverseLayout = true)
+        composeGrid(firstItem = 2, reverseLayout = true)
 
         rule.runOnIdle {
             runBlocking {
@@ -253,7 +254,7 @@
     @Test
     fun prefetchingForwardAndBackwardWithContentPadding() {
         val halfItemSize = itemsSizeDp / 2f
-        composeList(
+        composeGrid(
             firstItem = 4,
             itemOffset = 5,
             contentPadding = PaddingValues(mainAxis = halfItemSize)
@@ -383,6 +384,40 @@
         }
     }
 
+    @Test
+    fun scrollingByListSizeCancelsPreviousPrefetch() {
+        composeGrid()
+
+        // now we have items 0-3 visible
+        rule.runOnIdle {
+            runBlocking(AutoTestFrameClock()) {
+                // this will move the viewport so items 2-5 are visible
+                // and schedule a prefetching for 6-7
+                state.scrollBy(itemsSizePx.toFloat())
+
+                // move viewport by screen size to items 8-11, so item 6 is just behind
+                // the first visible item
+                state.scrollBy(itemsSizePx * 3f)
+
+                // move scroll further to items 10-13, so item 6 is reused
+                state.scrollBy(itemsSizePx.toFloat())
+            }
+        }
+
+        waitForPrefetch(13)
+
+        rule.runOnIdle {
+            runBlocking(AutoTestFrameClock()) {
+                // scroll again to ensure item 6 was dropped
+                state.scrollBy(itemsSizePx * 100f)
+            }
+        }
+
+        rule.runOnIdle {
+            assertThat(activeNodes).doesNotContain(6)
+        }
+    }
+
     private fun waitForPrefetch(index: Int) {
         rule.waitUntil {
             activeNodes.contains(index) && activeMeasuredNodes.contains(index)
@@ -392,7 +427,7 @@
     private val activeNodes = mutableSetOf<Int>()
     private val activeMeasuredNodes = mutableSetOf<Int>()
 
-    private fun composeList(
+    private fun composeGrid(
         firstItem: Int = 0,
         itemOffset: Int = 0,
         reverseLayout: Boolean = false,
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListAnimateItemPlacementTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListAnimateItemPlacementTest.kt
index 34fd7cb..44c7e34 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListAnimateItemPlacementTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListAnimateItemPlacementTest.kt
@@ -520,6 +520,52 @@
     }
 
     @Test
+    fun moveItemToTheTopOutsideOfBounds_withStickyHeader() {
+        var list by mutableStateOf(listOf(0, 1, 2, 3, 4))
+        rule.setContent {
+            LazyList(maxSize = itemSizeDp * 2f, startIndex = 4) {
+                // the existence of this header shouldn't affect the animation aside from
+                // the fact that we need to adjust startIndex because of it`s existence.
+                stickyHeader {}
+                items(list, key = { it }) {
+                    Item(it)
+                }
+            }
+        }
+
+        assertPositions(
+            3 to 0,
+            4 to itemSize
+        )
+
+        rule.runOnIdle {
+            list = listOf(2, 4, 0, 3, 1)
+        }
+
+        onAnimationFrame { fraction ->
+            val item1Offset = itemSize * -2 + (itemSize * 3 * fraction).roundToInt()
+            val item4Offset = itemSize - (itemSize * 3 * fraction).roundToInt()
+            val expected = mutableListOf<Pair<Any, Int>>().apply {
+                if (item4Offset > -itemSize) {
+                    add(4 to item4Offset)
+                } else {
+                    rule.onNodeWithTag("4").assertIsNotDisplayed()
+                }
+                add(3 to 0)
+                if (item1Offset > -itemSize) {
+                    add(1 to item1Offset)
+                } else {
+                    rule.onNodeWithTag("1").assertIsNotDisplayed()
+                }
+            }
+            assertPositions(
+                expected = expected.toTypedArray(),
+                fraction = fraction
+            )
+        }
+    }
+
+    @Test
     fun moveFirstItemToEndCausingAllItemsToAnimate_withSpacing() {
         var list by mutableStateOf(listOf(0, 1, 2, 3))
         rule.setContent {
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListPrefetcherTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListPrefetcherTest.kt
index 59e1c8c..7e40b9b 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListPrefetcherTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/list/LazyListPrefetcherTest.kt
@@ -417,6 +417,40 @@
         }
     }
 
+    @Test
+    fun scrollingByListSizeCancelsPreviousPrefetch() {
+        composeList()
+
+        // now we have items 0-1 visible
+        rule.runOnIdle {
+            runBlocking(AutoTestFrameClock()) {
+                // this will move the viewport so items 1-2 are visible
+                // and schedule a prefetching for 3
+                state.scrollBy(itemsSizePx.toFloat())
+
+                // move viewport by screen size to items 4-5, so item 3 is just behind
+                // the first visible item
+                state.scrollBy(itemsSizePx * 3f)
+
+                // move scroll further to items 5-6, so item 3 is reused
+                state.scrollBy(itemsSizePx.toFloat())
+            }
+        }
+
+        waitForPrefetch(7)
+
+        rule.runOnIdle {
+            runBlocking(AutoTestFrameClock()) {
+                // scroll again to ensure item 3 was dropped
+                state.scrollBy(itemsSizePx * 100f)
+            }
+        }
+
+        rule.runOnIdle {
+            assertThat(activeNodes).doesNotContain(3)
+        }
+    }
+
     private fun waitForPrefetch(index: Int) {
         rule.waitUntil {
             activeNodes.contains(index) && activeMeasuredNodes.contains(index)
diff --git a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridPrefetcherTest.kt b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridPrefetcherTest.kt
index 7747c93..ddaa888 100644
--- a/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridPrefetcherTest.kt
+++ b/compose/foundation/foundation/src/androidAndroidTest/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridPrefetcherTest.kt
@@ -35,6 +35,7 @@
 import androidx.compose.ui.test.onNodeWithTag
 import androidx.compose.ui.unit.Dp
 import androidx.test.filters.LargeTest
+import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.runBlocking
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -371,44 +372,154 @@
         rule.runOnIdle { }
     }
 
-//    @Test
-//    fun snappingToOtherPositionWhilePrefetchIsScheduled() {
-//        val composedItems = mutableListOf<Int>()
-//        rule.setContent {
-//            state = rememberLazyGridState()
-//            LazyGrid(
-//                1,
-//                Modifier.mainAxisSize(itemsSizeDp * 1.5f),
-//                state,
-//            ) {
-//                items(1000) {
-//                    composedItems.add(it)
-//                    Spacer(Modifier.mainAxisSize(itemsSizeDp))
-//                }
-//            }
-//        }
-//
-//        rule.runOnIdle {
-//            // now we have items 0 and 1 visible
-//            runBlocking(AutoTestFrameClock()) {
-//                // this will move the viewport so items 1 and 2 are visible
-//                // and schedule a prefetching for 3
-//                state.scrollBy(itemsSizePx.toFloat())
-//                // then we move so that items 100 and 101 are visible.
-//                // this should cancel the prefetch for 3
-//                state.scrollToItem(100)
-//            }
-//        }
-//
-//        // wait a few frames to make sure prefetch happens if was scheduled
-//        rule.waitForIdle()
-//        rule.waitForIdle()
-//        rule.waitForIdle()
-//
-//        rule.runOnIdle {
-//            Truth.assertThat(composedItems).doesNotContain(3)
-//        }
-//    }
+    @Test
+    fun snappingToOtherPositionWhilePrefetchIsScheduled() {
+        val composedItems = mutableListOf<Int>()
+        rule.setContent {
+            state = rememberLazyStaggeredGridState()
+            LazyStaggeredGrid(
+                1,
+                Modifier.mainAxisSize(itemsSizeDp * 1.5f),
+                state,
+            ) {
+                items(1000) {
+                    composedItems.add(it)
+                    Spacer(Modifier.mainAxisSize(itemsSizeDp))
+                }
+            }
+        }
+
+        rule.runOnIdle {
+            // now we have items 0 and 1 visible
+            runBlocking(AutoTestFrameClock()) {
+                // this will move the viewport so items 1 and 2 are visible
+                // and schedule a prefetching for 3
+                state.scrollBy(itemsSizePx.toFloat())
+                // then we move so that items 100 and 101 are visible.
+                // this should cancel the prefetch for 3
+                state.scrollToItem(100)
+            }
+        }
+
+        // wait a few frames to make sure prefetch happens if was scheduled
+        rule.waitForIdle()
+        rule.waitForIdle()
+        rule.waitForIdle()
+
+        rule.runOnIdle {
+            assertThat(composedItems).doesNotContain(3)
+        }
+    }
+
+    @Test
+    fun scrollingByListSizeCancelsPreviousPrefetch() {
+        composeStaggeredGrid()
+
+        // now we have items 0-3 visible
+        rule.runOnIdle {
+            runBlocking(AutoTestFrameClock()) {
+                // this will move the viewport so items 2-5 are visible
+                // and schedule a prefetching for 6-7
+                state.scrollBy(itemsSizePx.toFloat())
+
+                // move viewport by screen size to items 8-11, so item 6 is just behind
+                // the first visible item
+                state.scrollBy(itemsSizePx * 3f)
+
+                // move scroll further to items 10-13, so item 6 is reused
+                state.scrollBy(itemsSizePx.toFloat())
+            }
+        }
+
+        waitForPrefetch(13)
+
+        rule.runOnIdle {
+            runBlocking(AutoTestFrameClock()) {
+                // scroll again to ensure item 6 was dropped
+                state.scrollBy(itemsSizePx * 100f)
+            }
+        }
+
+        rule.runOnIdle {
+            assertThat(activeNodes).doesNotContain(6)
+        }
+    }
+
+    @Test
+    fun scrollingWithStaggeredItemsPrefetchesCorrectly() {
+        rule.setContent {
+            state = rememberLazyStaggeredGridState()
+            LazyStaggeredGrid(
+                2,
+                Modifier.mainAxisSize(itemsSizeDp * 5f),
+                state,
+            ) {
+                items(100) {
+                    DisposableEffect(it) {
+                        activeNodes.add(it)
+                        onDispose {
+                            activeNodes.remove(it)
+                            activeMeasuredNodes.remove(it)
+                        }
+                    }
+                    Spacer(
+                        Modifier
+                            .mainAxisSize(if (it == 0) itemsSizeDp else itemsSizeDp * 2)
+                            .border(Dp.Hairline, Color.Black)
+                            .testTag("$it")
+                            .layout { measurable, constraints ->
+                                val placeable = measurable.measure(constraints)
+                                activeMeasuredNodes.add(it)
+                                layout(placeable.width, placeable.height) {
+                                    placeable.place(0, 0)
+                                }
+                            }
+                    )
+                }
+            }
+        }
+
+        // ┌─┬─┐
+        // ├─┤1│
+        // │2├─┤
+        // ├─┤3│
+        // │4├─┤
+        // └─┴─┘
+
+        rule.runOnIdle {
+            runBlocking(AutoTestFrameClock()) {
+                // this will move the viewport so item 6 is visible
+                state.scrollBy(itemsSizePx.toFloat())
+            }
+        }
+
+        waitForPrefetch(7)
+        waitForPrefetch(8)
+
+        // ┌─┬─┐
+        // │2├─┤
+        // ├─┤3│
+        // │4├─┤
+        // ├─┤5│
+        // └─┴─┘
+
+        rule.runOnIdle {
+            runBlocking(AutoTestFrameClock()) {
+                // this will move the viewport so item 7 is visible
+                state.scrollBy(itemsSizePx.toFloat())
+            }
+            assertThat(activeNodes).contains(8)
+        }
+
+        // ┌─┬─┐
+        // ├─┤3│
+        // │4├─┤
+        // ├─┤5│
+        // │6├─┤
+        // └─┴─┘
+
+        waitForPrefetch(9)
+    }
 
     private fun waitForPrefetch(index: Int) {
         rule.waitUntil {
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasure.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasure.kt
index a3898c3..d74e5ae 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasure.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListMeasure.kt
@@ -274,6 +274,15 @@
             density = density,
         )
 
+        placementAnimator.onMeasured(
+            consumedScroll = consumedScroll.toInt(),
+            layoutWidth = layoutWidth,
+            layoutHeight = layoutHeight,
+            reverseLayout = reverseLayout,
+            positionedItems = positionedItems,
+            itemProvider = itemProvider
+        )
+
         val headerItem = if (headerIndexes.isNotEmpty()) {
             findOrComposeLazyListHeader(
                 composedVisibleItems = positionedItems,
@@ -287,15 +296,6 @@
             null
         }
 
-        placementAnimator.onMeasured(
-            consumedScroll = consumedScroll.toInt(),
-            layoutWidth = layoutWidth,
-            layoutHeight = layoutHeight,
-            reverseLayout = reverseLayout,
-            positionedItems = positionedItems,
-            itemProvider = itemProvider
-        )
-
         return LazyListMeasureResult(
             firstVisibleItem = firstItem,
             firstVisibleItemScrollOffset = currentFirstItemScrollOffset,
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListState.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListState.kt
index 0d23f23..ffb504c 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListState.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/LazyListState.kt
@@ -341,8 +341,12 @@
 
     private fun cancelPrefetchIfVisibleItemsChanged(info: LazyListLayoutInfo) {
         if (indexToPrefetch != -1 && info.visibleItemsInfo.isNotEmpty()) {
-            if (indexToPrefetch != info.visibleItemsInfo.first().index - 1 &&
-                indexToPrefetch != info.visibleItemsInfo.last().index + 1) {
+            val expectedPrefetchIndex = if (wasScrollingForward) {
+                info.visibleItemsInfo.last().index + 1
+            } else {
+                info.visibleItemsInfo.first().index - 1
+            }
+            if (indexToPrefetch != expectedPrefetchIndex) {
                 indexToPrefetch = -1
                 currentPrefetchHandle?.cancel()
                 currentPrefetchHandle = null
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridState.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridState.kt
index 3f8fdca..428f04e 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridState.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/grid/LazyGridState.kt
@@ -359,13 +359,16 @@
 
     private fun cancelPrefetchIfVisibleItemsChanged(info: LazyGridLayoutInfo) {
         if (lineToPrefetch != -1 && info.visibleItemsInfo.isNotEmpty()) {
-            val firstLine = info.visibleItemsInfo.first().let {
-                if (isVertical) it.row else it.column
+            val expectedLineToPrefetch = if (wasScrollingForward) {
+                info.visibleItemsInfo.last().let {
+                    if (isVertical) it.row else it.column
+                } + 1
+            } else {
+                info.visibleItemsInfo.first().let {
+                    if (isVertical) it.row else it.column
+                } - 1
             }
-            val lastLine = info.visibleItemsInfo.last().let {
-                if (isVertical) it.row else it.column
-            }
-            if (lineToPrefetch != firstLine - 1 && lineToPrefetch != lastLine + 1) {
+            if (lineToPrefetch != expectedLineToPrefetch) {
                 lineToPrefetch = -1
                 currentLinePrefetchHandles.forEach { it.cancel() }
                 currentLinePrefetchHandles.clear()
diff --git a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridState.kt b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridState.kt
index 90db4a2..d285d87 100644
--- a/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridState.kt
+++ b/compose/foundation/foundation/src/commonMain/kotlin/androidx/compose/foundation/lazy/staggeredgrid/LazyStaggeredGridState.kt
@@ -29,7 +29,6 @@
 import androidx.compose.foundation.lazy.layout.animateScrollToItem
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.MutableState
-import androidx.compose.runtime.collection.mutableVectorOf
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.saveable.listSaver
 import androidx.compose.runtime.saveable.rememberSaveable
@@ -158,11 +157,10 @@
     internal var measurePassCount = 0
 
     /** states required for prefetching **/
-    private var wasScrollingForward = true
     internal var isVertical = false
     internal var laneWidthsPrefixSum: IntArray = IntArray(0)
     private var prefetchBaseIndex: Int = -1
-    private val currentItemPrefetchHandles = mutableVectorOf<PrefetchHandle>()
+    private val currentItemPrefetchHandles = mutableMapOf<Int, PrefetchHandle>()
 
     /** state required for implementing [animateScrollScope] **/
     internal var density: Density = Density(1f, 1f)
@@ -296,15 +294,6 @@
         if (info.visibleItemsInfo.isNotEmpty()) {
             val scrollingForward = delta < 0
 
-            if (wasScrollingForward != scrollingForward) {
-                // the scrolling direction has been changed which means the last prefetched item
-                // is not going to be reached anytime soon so it is safer to dispose it.
-                // if this item is already visible it is safe to call the method anyway
-                // as it will be a no-op
-                currentItemPrefetchHandles.forEach { it.cancel() }
-            }
-
-            wasScrollingForward = scrollingForward
             val prefetchIndex = if (scrollingForward) {
                 info.visibleItemsInfo.last().index
             } else {
@@ -316,8 +305,8 @@
                 return
             }
             prefetchBaseIndex = prefetchIndex
-            currentItemPrefetchHandles.clear()
 
+            val prefetchHandlesUsed = mutableSetOf<Int>()
             var targetIndex = prefetchIndex
             for (lane in laneWidthsPrefixSum.indices) {
                 val previousIndex = targetIndex
@@ -330,11 +319,16 @@
                 }
                 if (
                     targetIndex !in (0 until info.totalItemsCount) ||
-                        previousIndex == targetIndex
+                    previousIndex == targetIndex
                 ) {
                     return
                 }
 
+                prefetchHandlesUsed += targetIndex
+                if (targetIndex in currentItemPrefetchHandles) {
+                    continue
+                }
+
                 val crossAxisSize = laneWidthsPrefixSum[lane] -
                     if (lane == 0) 0 else laneWidthsPrefixSum[lane - 1]
 
@@ -344,13 +338,24 @@
                     Constraints.fixedHeight(crossAxisSize)
                 }
 
-                currentItemPrefetchHandles.add(
-                    prefetchState.schedulePrefetch(
-                        index = targetIndex,
-                        constraints = constraints
-                    )
+                currentItemPrefetchHandles[targetIndex] = prefetchState.schedulePrefetch(
+                    index = targetIndex,
+                    constraints = constraints
                 )
             }
+
+            clearLeftoverPrefetchHandles(prefetchHandlesUsed)
+        }
+    }
+
+    private fun clearLeftoverPrefetchHandles(prefetchHandlesUsed: Set<Int>) {
+        val iterator = currentItemPrefetchHandles.iterator()
+        while (iterator.hasNext()) {
+            val entry = iterator.next()
+            if (entry.key !in prefetchHandlesUsed) {
+                entry.value.cancel()
+                iterator.remove()
+            }
         }
     }
 
@@ -359,7 +364,7 @@
         if (prefetchBaseIndex != -1 && items.isNotEmpty()) {
             if (prefetchBaseIndex !in items.first().index..items.last().index) {
                 prefetchBaseIndex = -1
-                currentItemPrefetchHandles.forEach { it.cancel() }
+                currentItemPrefetchHandles.values.forEach { it.cancel() }
                 currentItemPrefetchHandles.clear()
             }
         }
diff --git a/compose/material3/material3/lint-baseline.xml b/compose/material3/material3/lint-baseline.xml
deleted file mode 100644
index 328b7622..0000000
--- a/compose/material3/material3/lint-baseline.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
-
-    <issue
-        id="IllegalExperimentalApiUsage"
-        message="`Experimental` and `RequiresOptIn` APIs may only be used within the same-version group where they were defined."
-        errorLine1="@OptIn(ExperimentalTextApi::class)"
-        errorLine2="~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/androidMain/kotlin/androidx/compose/material3/IncludeFontPaddingHelper.android.kt"/>
-    </issue>
-
-</issues>
diff --git a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/font/DeviceFontFamilyNameFontTest.kt b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/font/DeviceFontFamilyNameFontTest.kt
index 172ced7..716e856 100644
--- a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/font/DeviceFontFamilyNameFontTest.kt
+++ b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/font/DeviceFontFamilyNameFontTest.kt
@@ -33,6 +33,12 @@
 
     val context = InstrumentationRegistry.getInstrumentation().context
 
+    @Test
+    fun variationSettings_arEmpty() {
+        val font = Font(DeviceFontFamilyName("any name")) as AndroidFont
+        assertThat(font.variationSettings.settings).isEmpty()
+    }
+
     @Test(expected = IllegalArgumentException::class)
     fun emptyFamilyName_throwsIllegalArgumentException() {
         Font(DeviceFontFamilyName(""))
diff --git a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/style/HyphensTest.kt b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/style/HyphensTest.kt
new file mode 100644
index 0000000..cb93b53
--- /dev/null
+++ b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/style/HyphensTest.kt
@@ -0,0 +1,58 @@
+/*
+ * Copyright 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 androidx.compose.ui.text.style
+
+import androidx.compose.ui.text.ExperimentalTextApi
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+
+@OptIn(ExperimentalTextApi::class)
+class HyphensTest : TextLineBreaker() {
+    private val text = "Transformation"
+
+    @Test
+    fun check_hyphens_Auto() {
+        val brokenLines = breakTextIntoLines(
+            text = text,
+            hyphens = Hyphens.Auto,
+            maxWidth = 30
+        )
+        val expected = listOf(
+            "Tran",
+            "sfor",
+            "ma",
+            "tion"
+        )
+        assertThat(brokenLines).isEqualTo(expected)
+    }
+
+    @Test
+    fun check_hyphens_None() {
+        val brokenLines = breakTextIntoLines(
+            text = text,
+            hyphens = Hyphens.None,
+            maxWidth = 30
+        )
+        val expected = listOf(
+            "Tran",
+            "sfor",
+            "mati",
+            "on"
+        )
+        assertThat(brokenLines).isEqualTo(expected)
+    }
+}
\ No newline at end of file
diff --git a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/style/LineBreakTest.kt b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/style/LineBreakTest.kt
index b7769c1..69d112c 100644
--- a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/style/LineBreakTest.kt
+++ b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/style/LineBreakTest.kt
@@ -26,7 +26,36 @@
 @OptIn(ExperimentalTextApi::class)
 @RunWith(AndroidJUnit4::class)
 @SmallTest
-class LineBreakTest {
+class LineBreakTest : TextLineBreaker() {
+    private val textToLineBreak = "This is an example text"
+
+    @Test
+    fun correct_simple_preset_flags() {
+        val lineBreak = LineBreak.Simple
+
+        assertThat(lineBreak.strategy).isEqualTo(LineBreak.Strategy.Simple)
+        assertThat(lineBreak.strictness).isEqualTo(LineBreak.Strictness.Normal)
+        assertThat(lineBreak.wordBreak).isEqualTo(LineBreak.WordBreak.Default)
+    }
+
+    @Test
+    fun correct_heading_preset_flags() {
+        val lineBreak = LineBreak.Heading
+
+        assertThat(lineBreak.strategy).isEqualTo(LineBreak.Strategy.Balanced)
+        assertThat(lineBreak.strictness).isEqualTo(LineBreak.Strictness.Loose)
+        assertThat(lineBreak.wordBreak).isEqualTo(LineBreak.WordBreak.Phrase)
+    }
+
+    @Test
+    fun correct_paragraph_preset_flags() {
+        val lineBreak = LineBreak.Paragraph
+
+        assertThat(lineBreak.strategy).isEqualTo(LineBreak.Strategy.HighQuality)
+        assertThat(lineBreak.strictness).isEqualTo(LineBreak.Strictness.Strict)
+        assertThat(lineBreak.wordBreak).isEqualTo(LineBreak.WordBreak.Default)
+    }
+
     @Test
     fun equals_different_strategy_returns_false() {
         val lineBreak = LineBreak(
@@ -154,4 +183,68 @@
 
         assertThat(lineBreak.hashCode()).isEqualTo(otherLineBreak.hashCode())
     }
+
+    @Test
+    fun correct_lineBreak_simple_result_narrow() {
+        val expectedBrokenLines = listOf(
+            "This is ",
+            "an ",
+            "example ",
+            "text"
+        )
+        val brokenLines = breakTextIntoLines(
+            text = textToLineBreak,
+            lineBreak = LineBreak.Simple,
+            maxWidth = 50
+        )
+
+        assertThat(brokenLines).isEqualTo(expectedBrokenLines)
+    }
+
+    @Test
+    fun correct_lineBreak_simple_result_wide() {
+        val expectedBrokenLines = listOf(
+            "This is an example ",
+            "text"
+        )
+        val brokenLines = breakTextIntoLines(
+            text = textToLineBreak,
+            lineBreak = LineBreak.Simple,
+            maxWidth = 120
+        )
+
+        assertThat(brokenLines).isEqualTo(expectedBrokenLines)
+    }
+
+    @Test
+    fun correct_lineBreak_paragraph_result() {
+        val expectedBrokenLines = listOf(
+            "This ",
+            "is an ",
+            "example ",
+            "text"
+        )
+        val brokenLines = breakTextIntoLines(
+            text = textToLineBreak,
+            lineBreak = LineBreak.Paragraph,
+            maxWidth = 50
+        )
+
+        assertThat(brokenLines).isEqualTo(expectedBrokenLines)
+    }
+
+    @Test
+    fun correct_lineBreak_heading_result() {
+        val expectedBrokenLines = listOf(
+            "This is an ",
+            "example text"
+        )
+        val brokenLines = breakTextIntoLines(
+            text = textToLineBreak,
+            lineBreak = LineBreak.Heading,
+            maxWidth = 120
+        )
+
+        assertThat(brokenLines).isEqualTo(expectedBrokenLines)
+    }
 }
\ No newline at end of file
diff --git a/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/style/TextLineBreaker.kt b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/style/TextLineBreaker.kt
new file mode 100644
index 0000000..6f3ff165
--- /dev/null
+++ b/compose/ui/ui-text/src/androidAndroidTest/kotlin/androidx/compose/ui/text/style/TextLineBreaker.kt
@@ -0,0 +1,101 @@
+/*
+ * Copyright 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 androidx.compose.ui.text.style
+
+import androidx.compose.ui.text.AnnotatedString
+import androidx.compose.ui.text.ExperimentalTextApi
+import androidx.compose.ui.text.MultiParagraph
+import androidx.compose.ui.text.TextLayoutInput
+import androidx.compose.ui.text.TextLayoutResult
+import androidx.compose.ui.text.TextStyle
+import androidx.compose.ui.text.font.createFontFamilyResolver
+import androidx.compose.ui.unit.Constraints
+import androidx.compose.ui.unit.Density
+import androidx.compose.ui.unit.IntSize
+import androidx.compose.ui.unit.LayoutDirection
+import androidx.compose.ui.unit.constrain
+import androidx.test.platform.app.InstrumentationRegistry
+import kotlin.math.ceil
+
+@OptIn(ExperimentalTextApi::class)
+open class TextLineBreaker {
+    private val defaultDensity = Density(1f)
+    private val context = InstrumentationRegistry.getInstrumentation().context
+    private val fontFamilyResolver = createFontFamilyResolver(context)
+    private val defaultHyphens = Hyphens.None
+    private val defaultLineBreak = LineBreak.Simple
+
+    private fun constructTextLayoutResult(
+        text: String,
+        textStyle: TextStyle,
+        maxWidth: Int = Constraints.Infinity
+    ): TextLayoutResult {
+        val constraints = Constraints(maxWidth = maxWidth)
+
+        val input = TextLayoutInput(
+            text = AnnotatedString(text),
+            style = textStyle,
+            placeholders = listOf(),
+            maxLines = Int.MAX_VALUE,
+            softWrap = true,
+            overflow = TextOverflow.Visible,
+            density = defaultDensity,
+            layoutDirection = LayoutDirection.Ltr,
+            fontFamilyResolver = fontFamilyResolver,
+            constraints = constraints
+        )
+
+        val paragraph = MultiParagraph(
+            annotatedString = input.text,
+            style = input.style,
+            constraints = input.constraints,
+            density = input.density,
+            fontFamilyResolver = input.fontFamilyResolver
+        )
+
+        return TextLayoutResult(
+            layoutInput = input,
+            multiParagraph = paragraph,
+            size = constraints.constrain(
+                IntSize(
+                    ceil(paragraph.width).toInt(),
+                    ceil(paragraph.height).toInt()
+                )
+            )
+        )
+    }
+
+    fun breakTextIntoLines(
+        text: String,
+        hyphens: Hyphens = defaultHyphens,
+        lineBreak: LineBreak = defaultLineBreak,
+        maxWidth: Int
+    ): List<String> {
+        val layoutResult = constructTextLayoutResult(
+            text = text,
+            textStyle = TextStyle(hyphens = hyphens, lineBreak = lineBreak),
+            maxWidth = maxWidth
+        )
+
+        return (0 until layoutResult.lineCount).map { lineIndex ->
+            text.substring(
+                layoutResult.getLineStart(lineIndex),
+                layoutResult.getLineEnd(lineIndex)
+            )
+        }
+    }
+}
\ No newline at end of file
diff --git a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/DeviceFontFamilyNameFont.kt b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/DeviceFontFamilyNameFont.kt
index f80d7e2..b9459b5 100644
--- a/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/DeviceFontFamilyNameFont.kt
+++ b/compose/ui/ui-text/src/androidMain/kotlin/androidx/compose/ui/text/font/DeviceFontFamilyNameFont.kt
@@ -41,9 +41,15 @@
  * This Font can not describe the system-installed [Typeface.DEFAULT]. All other system-installed
  * fonts are allowed.
  *
+ * Note: When setting [variationSettings] any unset axis may be reset to the font default, ignoring
+ * any axis restrictions in `fonts.xml` or `font_customizations.xml`. This may have surprising
+ * side-effects when named fonts differ only by the default axis settings in XML. When setting
+ * variation axis for device fonts, ensure you set all possible settings for the font.
+ *
  * @param familyName Android system-installed font family name
  * @param weight weight to load
  * @param style style to load
+ * @param variationSettings font variation settings, unset by default to load default VF from system
  *
  * @throws IllegalArgumentException if familyName is empty
  */
@@ -52,7 +58,7 @@
     familyName: DeviceFontFamilyName,
     weight: FontWeight = FontWeight.Normal,
     style: FontStyle = FontStyle.Normal,
-    variationSettings: FontVariation.Settings = FontVariation.Settings(weight, style)
+    variationSettings: FontVariation.Settings = FontVariation.Settings()
 ): Font {
     return DeviceFontFamilyNameFont(familyName, weight, style, variationSettings)
 }
@@ -60,6 +66,8 @@
 /**
  * An Android system installed font family name as used by [Typeface.create].
  *
+ * See `/system/etc/fonts.xml` and `/product/etc/fonts_customization.xml` on a device.
+ *
  * @see Typeface
  * @param name System fontFamilyName as passed to [Typeface.create]
  * @throws IllegalArgumentException if name is empty
diff --git a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/recyclerview/RecyclerViewInteropDemoFragment.kt b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/recyclerview/RecyclerViewInteropDemoFragment.kt
index 08b683d..507e519 100644
--- a/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/recyclerview/RecyclerViewInteropDemoFragment.kt
+++ b/compose/ui/ui/integration-tests/ui-demos/src/main/java/androidx/compose/ui/demos/recyclerview/RecyclerViewInteropDemoFragment.kt
@@ -28,12 +28,12 @@
 import androidx.compose.foundation.layout.fillMaxWidth
 import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.size
+import androidx.compose.foundation.lazy.LazyListState
 import androidx.compose.foundation.lazy.LazyRow
 import androidx.compose.material.Text
 import androidx.compose.runtime.Composable
 import androidx.compose.runtime.DisposableEffect
 import androidx.compose.runtime.getValue
-import androidx.compose.runtime.key
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.setValue
 import androidx.compose.ui.Modifier
@@ -66,6 +66,8 @@
     }
 
     inner class MainAdapter : RecyclerView.Adapter<MainAdapter.ViewHolder>() {
+        private val rowStates = mutableMapOf<Int, LazyListState>()
+
         inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
             val itemRow: ComposeItemRow = itemView.findViewById(R.id.itemRow)
         }
@@ -76,7 +78,9 @@
         }
 
         override fun onBindViewHolder(holder: ViewHolder, position: Int) {
+            val state = rowStates.getOrPut(position) { LazyListState() }
             holder.itemRow.index = position
+            holder.itemRow.rowState = state
         }
 
         override fun getItemCount(): Int = 50
@@ -84,7 +88,7 @@
 }
 
 @Composable
-fun ItemRow(index: Int) {
+fun ItemRow(index: Int, state: LazyListState) {
     DisposableEffect(Unit) {
         println("ItemRow $index composed")
 
@@ -92,12 +96,14 @@
     }
     Column(Modifier.fillMaxWidth()) {
         Text("Row #${index + 1}", Modifier.padding(horizontal = 8.dp))
-        LazyRow {
+
+        LazyRow(state = state) {
             items(25) { colIdx ->
                 Column(
                     Modifier
                         .padding(8.dp)
-                        .size(96.dp, 144.dp)) {
+                        .size(96.dp, 144.dp)
+                ) {
                     Box(
                         Modifier
                             .fillMaxWidth()
@@ -117,11 +123,10 @@
     defStyle: Int = 0
 ) : AbstractComposeView(context, attrs, defStyle) {
     var index by mutableStateOf(0)
+    var rowState: LazyListState? by mutableStateOf(null)
 
     @Composable
     override fun Content() {
-        key(index) {
-            ItemRow(index)
-        }
+        ItemRow(index, rowState!!)
     }
 }
diff --git a/contentpager/contentpager/lint-baseline.xml b/contentpager/contentpager/lint-baseline.xml
index 87af2b4..de601d0 100644
--- a/contentpager/contentpager/lint-baseline.xml
+++ b/contentpager/contentpager/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
+<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="cli" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
 
     <issue
         id="NewApi"
diff --git a/core/core-appdigest/lint-baseline.xml b/core/core-appdigest/lint-baseline.xml
index f90928c..0907387 100644
--- a/core/core-appdigest/lint-baseline.xml
+++ b/core/core-appdigest/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="cli" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
+<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
 
     <issue
         id="NewApi"
diff --git a/core/core/lint-baseline.xml b/core/core/lint-baseline.xml
index c7ef3b1..7762518 100644
--- a/core/core/lint-baseline.xml
+++ b/core/core/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="cli" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
+<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
 
     <issue
         id="NewApi"
@@ -697,33 +697,6 @@
     <issue
         id="WrongConstant"
         message="Must be one of: Action.SEMANTIC_ACTION_NONE, Action.SEMANTIC_ACTION_REPLY, Action.SEMANTIC_ACTION_MARK_AS_READ, Action.SEMANTIC_ACTION_MARK_AS_UNREAD, Action.SEMANTIC_ACTION_DELETE, Action.SEMANTIC_ACTION_ARCHIVE, Action.SEMANTIC_ACTION_MUTE, Action.SEMANTIC_ACTION_UNMUTE, Action.SEMANTIC_ACTION_THUMBS_UP, Action.SEMANTIC_ACTION_THUMBS_DOWN, Action.SEMANTIC_ACTION_CALL"
-        errorLine1="                    builder.setSemanticAction(action.getSemanticAction());"
-        errorLine2="                                              ~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="WrongConstant"
-        message="Must be one of: RemoteInput.EDIT_CHOICES_BEFORE_SENDING_AUTO, RemoteInput.EDIT_CHOICES_BEFORE_SENDING_DISABLED, RemoteInput.EDIT_CHOICES_BEFORE_SENDING_ENABLED"
-        errorLine1="                            ? remoteInput.getEditChoicesBeforeSending()"
-        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="WrongConstant"
-        message="Must be one of: RemoteInput.EDIT_CHOICES_BEFORE_SENDING_AUTO, RemoteInput.EDIT_CHOICES_BEFORE_SENDING_DISABLED, RemoteInput.EDIT_CHOICES_BEFORE_SENDING_ENABLED"
-        errorLine1="                                ? src.getEditChoicesBeforeSending()"
-        errorLine2="                                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="WrongConstant"
-        message="Must be one of: Action.SEMANTIC_ACTION_NONE, Action.SEMANTIC_ACTION_REPLY, Action.SEMANTIC_ACTION_MARK_AS_READ, Action.SEMANTIC_ACTION_MARK_AS_UNREAD, Action.SEMANTIC_ACTION_DELETE, Action.SEMANTIC_ACTION_ARCHIVE, Action.SEMANTIC_ACTION_MUTE, Action.SEMANTIC_ACTION_UNMUTE, Action.SEMANTIC_ACTION_THUMBS_UP, Action.SEMANTIC_ACTION_THUMBS_DOWN, Action.SEMANTIC_ACTION_CALL"
         errorLine1="                actionBuilder.setSemanticAction(action.getSemanticAction());"
         errorLine2="                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
@@ -2181,927 +2154,9 @@
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        this(channel.getId(), channel.getImportance());"
-        errorLine2="                     ~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        this(channel.getId(), channel.getImportance());"
-        errorLine2="                                      ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        mName = channel.getName();"
-        errorLine2="                        ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        mDescription = channel.getDescription();"
-        errorLine2="                               ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        mGroupId = channel.getGroup();"
-        errorLine2="                           ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        mShowBadge = channel.canShowBadge();"
-        errorLine2="                             ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        mSound = channel.getSound();"
-        errorLine2="                         ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        mAudioAttributes = channel.getAudioAttributes();"
-        errorLine2="                                   ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        mLights = channel.shouldShowLights();"
-        errorLine2="                          ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        mLightColor = channel.getLightColor();"
-        errorLine2="                              ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        mVibrationEnabled = channel.shouldVibrate();"
-        errorLine2="                                    ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        mVibrationPattern = channel.getVibrationPattern();"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 30; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            mParentId = channel.getParentChannelId();"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 30; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            mConversationId = channel.getConversationId();"
-        errorLine2="                                      ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        mBypassDnd = channel.canBypassDnd();"
-        errorLine2="                             ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        mLockscreenVisibility = channel.getLockscreenVisibility();"
-        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 29; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            mCanBubble = channel.canBubble();"
-        errorLine2="                                 ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 30; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            mImportantConversation = channel.isImportantConversation();"
-        errorLine2="                                             ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        NotificationChannel channel = new NotificationChannel(mId, mName, mImportance);"
-        errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        channel.setDescription(mDescription);"
-        errorLine2="                ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        channel.setGroup(mGroupId);"
-        errorLine2="                ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        channel.setShowBadge(mShowBadge);"
-        errorLine2="                ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        channel.setSound(mSound, mAudioAttributes);"
-        errorLine2="                ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        channel.enableLights(mLights);"
-        errorLine2="                ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        channel.setLightColor(mLightColor);"
-        errorLine2="                ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        channel.setVibrationPattern(mVibrationPattern);"
-        errorLine2="                ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        channel.enableVibration(mVibrationEnabled);"
-        errorLine2="                ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 30; however, the containing class androidx.core.app.NotificationChannelCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            channel.setConversationId(mParentId, mConversationId);"
-        errorLine2="                    ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelGroupCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        this(group.getId());"
-        errorLine2="                   ~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelGroupCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelGroupCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        mName = group.getName();"
-        errorLine2="                      ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelGroupCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 28; however, the containing class androidx.core.app.NotificationChannelGroupCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            mDescription = group.getDescription();"
-        errorLine2="                                 ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelGroupCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 28; however, the containing class androidx.core.app.NotificationChannelGroupCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            mBlocked = group.isBlocked();"
-        errorLine2="                             ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelGroupCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelGroupCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            mChannels = getChannelsCompat(group.getChannels());"
-        errorLine2="                                                ~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelGroupCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelGroupCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            if (mId.equals(channel.getGroup())) {"
-        errorLine2="                                   ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelGroupCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationChannelGroupCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        NotificationChannelGroup group = new NotificationChannelGroup(mId, mName);"
-        errorLine2="                                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelGroupCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 28; however, the containing class androidx.core.app.NotificationChannelGroupCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            group.setDescription(mDescription);"
-        errorLine2="                  ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationChannelGroupCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.core.app.NotificationCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                this.mSmallIcon = notification.getSmallIcon();"
-        errorLine2="                                               ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 21; however, the containing class androidx.core.app.NotificationCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                mNotification.audioAttributes = new AudioAttributes.Builder()"
-        errorLine2="                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 21; however, the containing class androidx.core.app.NotificationCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                        .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)"
-        errorLine2="                         ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 21; however, the containing class androidx.core.app.NotificationCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                        .setUsage(AudioAttributes.USAGE_NOTIFICATION)"
-        errorLine2="                         ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 21; however, the containing class androidx.core.app.NotificationCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                        .build();"
-        errorLine2="                         ~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 21; however, the containing class androidx.core.app.NotificationCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                mNotification.audioAttributes = new AudioAttributes.Builder()"
-        errorLine2="                                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 21; however, the containing class androidx.core.app.NotificationCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                        .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)"
-        errorLine2="                         ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 21; however, the containing class androidx.core.app.NotificationCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                        .setLegacyStreamType(streamType)"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 21; however, the containing class androidx.core.app.NotificationCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                        .build();"
-        errorLine2="                         ~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 24; however, the containing class androidx.core.app.NotificationCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                return Notification.Builder.recoverBuilder(mContext, notification)"
-        errorLine2="                                            ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 24; however, the containing class androidx.core.app.NotificationCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                        .createContentView();"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 24; however, the containing class androidx.core.app.NotificationCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                return Notification.Builder.recoverBuilder(mContext, notification)"
-        errorLine2="                                            ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 24; however, the containing class androidx.core.app.NotificationCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                        .createBigContentView();"
-        errorLine2="                         ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 24; however, the containing class androidx.core.app.NotificationCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                        Notification.Builder.recoverBuilder(mContext, notification);"
-        errorLine2="                                             ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 24; however, the containing class androidx.core.app.NotificationCompat.Builder is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                return platformBuilder.createHeadsUpContentView();"
-        errorLine2="                                       ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompat.Style is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    contentView.setTextViewTextSize(R.id.text, TypedValue.COMPLEX_UNIT_PX,"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompat.Style is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                contentView.setViewPadding(R.id.line1, 0, 0, 0, 0);"
-        errorLine2="                            ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 24; however, the containing class androidx.core.app.NotificationCompat.Style is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                        contentView.setChronometerCountDown(R.id.chronometer,"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompat.Style is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                outerView.setViewPadding(R.id.notification_main_column_container,"
-        errorLine2="                          ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompat.BigPictureStyle is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                        new Notification.BigPictureStyle(builder.getBuilder())"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompat.BigPictureStyle is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                                .setBigContentTitle(mBigContentTitle);"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompat.BigPictureStyle is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                        style = style.bigPicture(mPictureIcon.getBitmap());"
-        errorLine2="                                      ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompat.BigTextStyle is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                        new Notification.BigTextStyle(builder.getBuilder())"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompat.BigTextStyle is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                                .setBigContentTitle(mBigContentTitle)"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompat.BigTextStyle is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                                .bigText(mBigText);"
-        errorLine2="                                 ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompat.BigTextStyle is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    style.setSummaryText(mSummaryText);"
-        errorLine2="                          ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 28; however, the containing class androidx.core.app.NotificationCompat.MessagingStyle is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    frameworkStyle = new Notification.MessagingStyle(mUser.toAndroidPerson());"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 24; however, the containing class androidx.core.app.NotificationCompat.MessagingStyle is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    frameworkStyle = new Notification.MessagingStyle(mUser.getName());"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 24; however, the containing class androidx.core.app.NotificationCompat.MessagingStyle is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    frameworkStyle.addMessage(message.toAndroidMessage());"
-        errorLine2="                                   ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationCompat.MessagingStyle is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                        frameworkStyle.addHistoricMessage(historicMessage.toAndroidMessage());"
-        errorLine2="                                       ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 24; however, the containing class androidx.core.app.NotificationCompat.MessagingStyle is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    frameworkStyle.setConversationTitle(mConversationTitle);"
-        errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 28; however, the containing class androidx.core.app.NotificationCompat.MessagingStyle is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    frameworkStyle.setGroupConversation(mIsGroupConversation);"
-        errorLine2="                                   ~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompat.MessagingStyle is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                frameworkStyle.setBuilder(builder.getBuilder());"
-        errorLine2="                               ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompat.MessagingStyle is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    new Notification.BigTextStyle(builder.getBuilder())"
-        errorLine2="                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompat.MessagingStyle is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                            .setBigContentTitle(null)"
-        errorLine2="                             ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompat.MessagingStyle is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                            .bigText(completeMessage);"
-        errorLine2="                             ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 28; however, the containing class androidx.core.app.NotificationCompat.MessagingStyle.Message is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    frameworkMessage = new Notification.MessagingStyle.Message("
-        errorLine2="                                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 24; however, the containing class androidx.core.app.NotificationCompat.MessagingStyle.Message is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    frameworkMessage = new Notification.MessagingStyle.Message("
-        errorLine2="                                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 24; however, the containing class androidx.core.app.NotificationCompat.MessagingStyle.Message is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    frameworkMessage.setData(getDataMimeType(), getDataUri());"
-        errorLine2="                                     ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompat.InboxStyle is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                        new Notification.InboxStyle(builder.getBuilder())"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompat.InboxStyle is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                                .setBigContentTitle(mBigContentTitle);"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompat.InboxStyle is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    style.setSummaryText(mSummaryText);"
-        errorLine2="                          ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompat.InboxStyle is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    style.addLine(text);"
-        errorLine2="                          ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 16; however, the containing class androidx.core.app.NotificationCompat.DecoratedCustomViewStyle is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                builder.getBuilder().setStyle(new Notification.DecoratedCustomViewStyle());"
-        errorLine2="                                     ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 24; however, the containing class androidx.core.app.NotificationCompat.DecoratedCustomViewStyle is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                builder.getBuilder().setStyle(new Notification.DecoratedCustomViewStyle());"
-        errorLine2="                                              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 15; however, the containing class androidx.core.app.NotificationCompat.DecoratedCustomViewStyle is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                button.setContentDescription(R.id.action_container, action.title);"
-        errorLine2="                       ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.core.app.NotificationCompat.Action.Builder is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                if (Build.VERSION.SDK_INT >= 23 &amp;&amp; action.getIcon() != null) {"
-        errorLine2="                                                          ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.core.app.NotificationCompat.Action.Builder is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    IconCompat iconCompat = IconCompat.createFromIcon(action.getIcon());"
-        errorLine2="                                                                             ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat.Action.Builder is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    android.app.RemoteInput[] remoteInputs = action.getRemoteInputs();"
-        errorLine2="                                                                    ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 24; however, the containing class androidx.core.app.NotificationCompat.Action.Builder is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    builder.mAllowGeneratedReplies = action.getAllowGeneratedReplies();"
-        errorLine2="                                                            ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 28; however, the containing class androidx.core.app.NotificationCompat.Action.Builder is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    builder.setSemanticAction(action.getSemanticAction());"
-        errorLine2="                                                     ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 29; however, the containing class androidx.core.app.NotificationCompat.Action.Builder is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    builder.setContextual(action.isContextual());"
-        errorLine2="                                                 ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 31; however, the containing class androidx.core.app.NotificationCompat.Action.Builder is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    builder.setAuthenticationRequired(action.isAuthenticationRequired());"
-        errorLine2="                                                             ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.core.app.NotificationCompat.WearableExtender is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                actionBuilder = new Notification.Action.Builder("
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat.WearableExtender is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                actionBuilder = new Notification.Action.Builder("
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 24; however, the containing class androidx.core.app.NotificationCompat.WearableExtender is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                actionBuilder.setAllowGeneratedReplies(actionCompat.getAllowGeneratedReplies());"
-        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 31; however, the containing class androidx.core.app.NotificationCompat.WearableExtender is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                actionBuilder.setAuthenticationRequired(actionCompat.isAuthenticationRequired());"
-        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat.WearableExtender is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            actionBuilder.addExtras(actionExtras);"
-        errorLine2="                          ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat.WearableExtender is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    actionBuilder.addRemoteInput(remoteInput);"
-        errorLine2="                                  ~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat.WearableExtender is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return actionBuilder.build();"
-        errorLine2="                                 ~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
         message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat.CarExtender is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    ? new RemoteInput(remoteInput.getResultKey(),"
-        errorLine2="                                                  ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat.CarExtender is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    remoteInput.getLabel(),"
-        errorLine2="                                ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat.CarExtender is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    remoteInput.getChoices(),"
-        errorLine2="                                ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat.CarExtender is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    remoteInput.getAllowFreeFormInput(),"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 29; however, the containing class androidx.core.app.NotificationCompat.CarExtender is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                            ? remoteInput.getEditChoicesBeforeSending()"
-        errorLine2="                                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat.CarExtender is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    remoteInput.getExtras(),"
-        errorLine2="                                ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat.CarExtender is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                        new android.app.RemoteInput.Builder(remoteInputCompat.getResultKey())"
-        errorLine2="                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine1="                        Api20Impl.build(new android.app.RemoteInput.Builder("
+        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/app/NotificationCompat.java"/>
     </issue>
@@ -3136,7 +2191,7 @@
     <issue
         id="ClassVerificationFailure"
         message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat.CarExtender is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                                .addExtras(remoteInputCompat.getExtras())"
+        errorLine1="                                .addExtras(remoteInputCompat.getExtras()));"
         errorLine2="                                 ~~~~~~~~~">
         <location
             file="src/main/java/androidx/core/app/NotificationCompat.java"/>
@@ -3144,303 +2199,6 @@
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat.CarExtender is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                                .build();"
-        errorLine2="                                 ~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 29; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return BubbleMetadata.fromPlatform(notification.getBubbleMetadata());"
-        errorLine2="                                                            ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        final android.app.RemoteInput[] srcArray = action.getRemoteInputs();"
-        errorLine2="                                                          ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                        src.getResultKey(),"
-        errorLine2="                            ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                        src.getLabel(),"
-        errorLine2="                            ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                        src.getChoices(),"
-        errorLine2="                            ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                        src.getAllowFreeFormInput(),"
-        errorLine2="                            ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 29; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                                ? src.getEditChoicesBeforeSending()"
-        errorLine2="                                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                        src.getExtras(),"
-        errorLine2="                            ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            allowGeneratedReplies = action.getExtras().getBoolean("
-        errorLine2="                                           ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 24; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    || action.getAllowGeneratedReplies();"
-        errorLine2="                              ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            allowGeneratedReplies = action.getExtras().getBoolean("
-        errorLine2="                                           ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                action.getExtras().getBoolean(Action.EXTRA_SHOWS_USER_INTERFACE, true);"
-        errorLine2="                       ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 28; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            semanticAction = action.getSemanticAction();"
-        errorLine2="                                    ~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            semanticAction = action.getExtras().getInt("
-        errorLine2="                                    ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 29; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="        final boolean isContextual = Build.VERSION.SDK_INT >= 29 ? action.isContextual() : false;"
-        errorLine2="                                                                          ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 31; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                Build.VERSION.SDK_INT >= 31 ? action.isAuthenticationRequired() : false;"
-        errorLine2="                                                     ~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            if (action.getIcon() == null &amp;&amp; action.icon != 0) {"
-        errorLine2="                       ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                        action.getExtras(), remoteInputs, null, allowGeneratedReplies,"
-        errorLine2="                               ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            IconCompat icon = action.getIcon() == null"
-        errorLine2="                                     ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 23; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                    ? null : IconCompat.createFromIconOrNullIfZeroResId(action.getIcon());"
-        errorLine2="                                                                               ~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return new Action(icon, action.title, action.actionIntent, action.getExtras(),"
-        errorLine2="                                                                              ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return new Action(action.icon, action.title, action.actionIntent, action.getExtras(),"
-        errorLine2="                                                                                     ~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return notification.getGroup();"
-        errorLine2="                                ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 20; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return notification.getSortKey();"
-        errorLine2="                                ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return notification.getChannelId();"
-        errorLine2="                                ~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return notification.getTimeoutAfter();"
-        errorLine2="                                ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return notification.getBadgeIconType();"
-        errorLine2="                                ~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return notification.getShortcutId();"
-        errorLine2="                                ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return notification.getSettingsText();"
-        errorLine2="                                ~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 29; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            LocusId locusId = notification.getLocusId();"
-        errorLine2="                                           ~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return notification.getGroupAlertBehavior();"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 29; however, the containing class androidx.core.app.NotificationCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return notification.getAllowSystemGeneratedContextualActions();"
-        errorLine2="                                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
         message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationCompatBuilder is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="            mBuilder = new Notification.Builder(b.mContext, b.mChannelId);"
         errorLine2="                       ~~~~~~~~~~~~~~~~~~~~~~~~">
@@ -3972,195 +2730,6 @@
 
     <issue
         id="ClassVerificationFailure"
-        message="This call references a method added in API level 24; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return mNotificationManager.areNotificationsEnabled();"
-        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 24; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return mNotificationManager.getImportance();"
-        errorLine2="                                        ~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            mNotificationManager.createNotificationChannel(channel);"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            mNotificationManager.createNotificationChannelGroup(group);"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            mNotificationManager.createNotificationChannels(channels);"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            mNotificationManager.createNotificationChannels(platformChannels);"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            mNotificationManager.createNotificationChannelGroups(groups);"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            mNotificationManager.createNotificationChannelGroups(platformGroups);"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            mNotificationManager.deleteNotificationChannel(channelId);"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            mNotificationManager.deleteNotificationChannelGroup(groupId);"
-        errorLine2="                                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            for (NotificationChannel channel : mNotificationManager.getNotificationChannels()) {"
-        errorLine2="                                                                    ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                if (channelIds.contains(channel.getId())) {"
-        errorLine2="                                                ~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 30; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                        &amp;&amp; channelIds.contains(channel.getParentChannelId())) {"
-        errorLine2="                                                       ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                mNotificationManager.deleteNotificationChannel(channel.getId());"
-        errorLine2="                                     ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                mNotificationManager.deleteNotificationChannel(channel.getId());"
-        errorLine2="                                                                       ~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return mNotificationManager.getNotificationChannel(channelId);"
-        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 30; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return mNotificationManager.getNotificationChannel(channelId, conversationId);"
-        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 28; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return mNotificationManager.getNotificationChannelGroup(channelGroupId);"
-        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="                if (group.getId().equals(channelGroupId)) return group;"
-        errorLine2="                          ~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return mNotificationManager.getNotificationChannels();"
-        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
-        message="This call references a method added in API level 26; however, the containing class androidx.core.app.NotificationManagerCompat is reachable from earlier API levels and will fail run-time class verification."
-        errorLine1="            return mNotificationManager.getNotificationChannelGroups();"
-        errorLine2="                                        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/core/app/NotificationManagerCompat.java"/>
-    </issue>
-
-    <issue
-        id="ClassVerificationFailure"
         message="This call references a method added in API level 28; however, the containing class androidx.core.text.PrecomputedTextCompat.Params is reachable from earlier API levels and will fail run-time class verification."
         errorLine1="                mWrapped = new PrecomputedText.Params.Builder(paint)"
         errorLine2="                           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
diff --git a/credentials/credentials-play-services-auth/build.gradle b/credentials/credentials-play-services-auth/build.gradle
index 2125f1d..bf17414 100644
--- a/credentials/credentials-play-services-auth/build.gradle
+++ b/credentials/credentials-play-services-auth/build.gradle
@@ -29,6 +29,10 @@
 
 android {
     namespace "androidx.credentials.play.services.auth"
+
+    defaultConfig {
+        minSdkVersion 19
+    }
 }
 
 androidx {
diff --git a/credentials/credentials-provider/api/current.txt b/credentials/credentials-provider/api/current.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/credentials/credentials-provider/api/current.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/credentials/credentials-provider/api/public_plus_experimental_current.txt b/credentials/credentials-provider/api/public_plus_experimental_current.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/credentials/credentials-provider/api/public_plus_experimental_current.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/credentials/credentials-provider/api/res-current.txt b/credentials/credentials-provider/api/res-current.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/credentials/credentials-provider/api/res-current.txt
diff --git a/credentials/credentials-provider/api/restricted_current.txt b/credentials/credentials-provider/api/restricted_current.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/credentials/credentials-provider/api/restricted_current.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/credentials/credentials-provider/build.gradle b/credentials/credentials-provider/build.gradle
new file mode 100644
index 0000000..f56c18c
--- /dev/null
+++ b/credentials/credentials-provider/build.gradle
@@ -0,0 +1,45 @@
+/*
+ * 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.
+ */
+
+import androidx.build.LibraryType
+
+plugins {
+    id("AndroidXPlugin")
+    id("com.android.library")
+    id("org.jetbrains.kotlin.android")
+}
+
+dependencies {
+    api(libs.kotlinStdlib)
+    // Add dependencies here
+}
+
+android {
+    namespace "androidx.credentials.provider"
+
+    defaultConfig {
+        minSdkVersion 19
+    }
+}
+
+androidx {
+    name = "Credentials Provider Library"
+    type = LibraryType.PUBLISHED_LIBRARY
+    mavenGroup = LibraryGroups.CREDENTIALS
+    inceptionYear = "2022"
+    description = "use utility APIs to process requests from, and return responses to the android" +
+            "Credential Manager"
+}
diff --git a/credentials/credentials-provider/src/main/androidx/credentials/androidx-credentials-credentials-provider-documentation.md b/credentials/credentials-provider/src/main/androidx/credentials/androidx-credentials-credentials-provider-documentation.md
new file mode 100644
index 0000000..d3a5d02
--- /dev/null
+++ b/credentials/credentials-provider/src/main/androidx/credentials/androidx-credentials-credentials-provider-documentation.md
@@ -0,0 +1,8 @@
+# Module root
+
+CREDENTIALS CREDENTIALS PROVIDER
+
+# Package androidx.credentials.provider
+
+This package provides utility APIs for providers to use as they respond to credential requests 
+from the android Credential Manager.
\ No newline at end of file
diff --git a/credentials/credentials/api/current.txt b/credentials/credentials/api/current.txt
index e6f50d0..014f0be 100644
--- a/credentials/credentials/api/current.txt
+++ b/credentials/credentials/api/current.txt
@@ -1 +1,75 @@
 // Signature format: 4.0
+package androidx.credentials {
+
+  public abstract class CreateCredentialRequest {
+    ctor public CreateCredentialRequest();
+  }
+
+  public abstract class CreateCredentialResponse {
+    ctor public CreateCredentialResponse();
+  }
+
+  public final class CreatePasswordRequest extends androidx.credentials.CreateCredentialRequest {
+    ctor public CreatePasswordRequest(String id, String password);
+    method public String getId();
+    method public String getPassword();
+    property public final String id;
+    property public final String password;
+  }
+
+  public final class CreatePasswordResponse extends androidx.credentials.CreateCredentialResponse {
+    ctor public CreatePasswordResponse();
+  }
+
+  public abstract class Credential {
+    ctor public Credential();
+  }
+
+  public final class CredentialManager {
+    method public static androidx.credentials.CredentialManager create(android.content.Context context);
+    method public suspend Object? executeCreateCredential(androidx.credentials.CreateCredentialRequest request, kotlin.coroutines.Continuation<? super androidx.credentials.CreateCredentialResponse>);
+    method public suspend Object? executeGetCredential(androidx.credentials.GetCredentialRequest request, kotlin.coroutines.Continuation<? super androidx.credentials.GetCredentialResponse>);
+    field public static final androidx.credentials.CredentialManager.Companion Companion;
+  }
+
+  public static final class CredentialManager.Companion {
+    method public androidx.credentials.CredentialManager create(android.content.Context context);
+  }
+
+  public abstract class GetCredentialOption {
+    ctor public GetCredentialOption();
+  }
+
+  public final class GetCredentialRequest {
+    ctor public GetCredentialRequest(java.util.List<? extends androidx.credentials.GetCredentialOption> getCredentialOptions);
+    method public java.util.List<androidx.credentials.GetCredentialOption> getGetCredentialOptions();
+    property public final java.util.List<androidx.credentials.GetCredentialOption> getCredentialOptions;
+  }
+
+  public static final class GetCredentialRequest.Builder {
+    ctor public GetCredentialRequest.Builder();
+    method public androidx.credentials.GetCredentialRequest.Builder addGetCredentialOption(androidx.credentials.GetCredentialOption getCredentialOption);
+    method public androidx.credentials.GetCredentialRequest build();
+    method public androidx.credentials.GetCredentialRequest.Builder setGetCredentialOptions(java.util.List<? extends androidx.credentials.GetCredentialOption> getCredentialOptions);
+  }
+
+  public final class GetCredentialResponse {
+    ctor public GetCredentialResponse(androidx.credentials.Credential credential);
+    method public androidx.credentials.Credential getCredential();
+    property public final androidx.credentials.Credential credential;
+  }
+
+  public final class GetPasswordOption extends androidx.credentials.GetCredentialOption {
+    ctor public GetPasswordOption();
+  }
+
+  public final class PasswordCredential extends androidx.credentials.Credential {
+    ctor public PasswordCredential(String id, String password);
+    method public String getId();
+    method public String getPassword();
+    property public final String id;
+    property public final String password;
+  }
+
+}
+
diff --git a/credentials/credentials/api/public_plus_experimental_current.txt b/credentials/credentials/api/public_plus_experimental_current.txt
index e6f50d0..014f0be 100644
--- a/credentials/credentials/api/public_plus_experimental_current.txt
+++ b/credentials/credentials/api/public_plus_experimental_current.txt
@@ -1 +1,75 @@
 // Signature format: 4.0
+package androidx.credentials {
+
+  public abstract class CreateCredentialRequest {
+    ctor public CreateCredentialRequest();
+  }
+
+  public abstract class CreateCredentialResponse {
+    ctor public CreateCredentialResponse();
+  }
+
+  public final class CreatePasswordRequest extends androidx.credentials.CreateCredentialRequest {
+    ctor public CreatePasswordRequest(String id, String password);
+    method public String getId();
+    method public String getPassword();
+    property public final String id;
+    property public final String password;
+  }
+
+  public final class CreatePasswordResponse extends androidx.credentials.CreateCredentialResponse {
+    ctor public CreatePasswordResponse();
+  }
+
+  public abstract class Credential {
+    ctor public Credential();
+  }
+
+  public final class CredentialManager {
+    method public static androidx.credentials.CredentialManager create(android.content.Context context);
+    method public suspend Object? executeCreateCredential(androidx.credentials.CreateCredentialRequest request, kotlin.coroutines.Continuation<? super androidx.credentials.CreateCredentialResponse>);
+    method public suspend Object? executeGetCredential(androidx.credentials.GetCredentialRequest request, kotlin.coroutines.Continuation<? super androidx.credentials.GetCredentialResponse>);
+    field public static final androidx.credentials.CredentialManager.Companion Companion;
+  }
+
+  public static final class CredentialManager.Companion {
+    method public androidx.credentials.CredentialManager create(android.content.Context context);
+  }
+
+  public abstract class GetCredentialOption {
+    ctor public GetCredentialOption();
+  }
+
+  public final class GetCredentialRequest {
+    ctor public GetCredentialRequest(java.util.List<? extends androidx.credentials.GetCredentialOption> getCredentialOptions);
+    method public java.util.List<androidx.credentials.GetCredentialOption> getGetCredentialOptions();
+    property public final java.util.List<androidx.credentials.GetCredentialOption> getCredentialOptions;
+  }
+
+  public static final class GetCredentialRequest.Builder {
+    ctor public GetCredentialRequest.Builder();
+    method public androidx.credentials.GetCredentialRequest.Builder addGetCredentialOption(androidx.credentials.GetCredentialOption getCredentialOption);
+    method public androidx.credentials.GetCredentialRequest build();
+    method public androidx.credentials.GetCredentialRequest.Builder setGetCredentialOptions(java.util.List<? extends androidx.credentials.GetCredentialOption> getCredentialOptions);
+  }
+
+  public final class GetCredentialResponse {
+    ctor public GetCredentialResponse(androidx.credentials.Credential credential);
+    method public androidx.credentials.Credential getCredential();
+    property public final androidx.credentials.Credential credential;
+  }
+
+  public final class GetPasswordOption extends androidx.credentials.GetCredentialOption {
+    ctor public GetPasswordOption();
+  }
+
+  public final class PasswordCredential extends androidx.credentials.Credential {
+    ctor public PasswordCredential(String id, String password);
+    method public String getId();
+    method public String getPassword();
+    property public final String id;
+    property public final String password;
+  }
+
+}
+
diff --git a/credentials/credentials/api/restricted_current.txt b/credentials/credentials/api/restricted_current.txt
index e6f50d0..014f0be 100644
--- a/credentials/credentials/api/restricted_current.txt
+++ b/credentials/credentials/api/restricted_current.txt
@@ -1 +1,75 @@
 // Signature format: 4.0
+package androidx.credentials {
+
+  public abstract class CreateCredentialRequest {
+    ctor public CreateCredentialRequest();
+  }
+
+  public abstract class CreateCredentialResponse {
+    ctor public CreateCredentialResponse();
+  }
+
+  public final class CreatePasswordRequest extends androidx.credentials.CreateCredentialRequest {
+    ctor public CreatePasswordRequest(String id, String password);
+    method public String getId();
+    method public String getPassword();
+    property public final String id;
+    property public final String password;
+  }
+
+  public final class CreatePasswordResponse extends androidx.credentials.CreateCredentialResponse {
+    ctor public CreatePasswordResponse();
+  }
+
+  public abstract class Credential {
+    ctor public Credential();
+  }
+
+  public final class CredentialManager {
+    method public static androidx.credentials.CredentialManager create(android.content.Context context);
+    method public suspend Object? executeCreateCredential(androidx.credentials.CreateCredentialRequest request, kotlin.coroutines.Continuation<? super androidx.credentials.CreateCredentialResponse>);
+    method public suspend Object? executeGetCredential(androidx.credentials.GetCredentialRequest request, kotlin.coroutines.Continuation<? super androidx.credentials.GetCredentialResponse>);
+    field public static final androidx.credentials.CredentialManager.Companion Companion;
+  }
+
+  public static final class CredentialManager.Companion {
+    method public androidx.credentials.CredentialManager create(android.content.Context context);
+  }
+
+  public abstract class GetCredentialOption {
+    ctor public GetCredentialOption();
+  }
+
+  public final class GetCredentialRequest {
+    ctor public GetCredentialRequest(java.util.List<? extends androidx.credentials.GetCredentialOption> getCredentialOptions);
+    method public java.util.List<androidx.credentials.GetCredentialOption> getGetCredentialOptions();
+    property public final java.util.List<androidx.credentials.GetCredentialOption> getCredentialOptions;
+  }
+
+  public static final class GetCredentialRequest.Builder {
+    ctor public GetCredentialRequest.Builder();
+    method public androidx.credentials.GetCredentialRequest.Builder addGetCredentialOption(androidx.credentials.GetCredentialOption getCredentialOption);
+    method public androidx.credentials.GetCredentialRequest build();
+    method public androidx.credentials.GetCredentialRequest.Builder setGetCredentialOptions(java.util.List<? extends androidx.credentials.GetCredentialOption> getCredentialOptions);
+  }
+
+  public final class GetCredentialResponse {
+    ctor public GetCredentialResponse(androidx.credentials.Credential credential);
+    method public androidx.credentials.Credential getCredential();
+    property public final androidx.credentials.Credential credential;
+  }
+
+  public final class GetPasswordOption extends androidx.credentials.GetCredentialOption {
+    ctor public GetPasswordOption();
+  }
+
+  public final class PasswordCredential extends androidx.credentials.Credential {
+    ctor public PasswordCredential(String id, String password);
+    method public String getId();
+    method public String getPassword();
+    property public final String id;
+    property public final String password;
+  }
+
+}
+
diff --git a/credentials/credentials/build.gradle b/credentials/credentials/build.gradle
index 0536e04..e42b992 100644
--- a/credentials/credentials/build.gradle
+++ b/credentials/credentials/build.gradle
@@ -24,11 +24,23 @@
 
 dependencies {
     api(libs.kotlinStdlib)
-    // Add dependencies here
+
+    androidTestImplementation(libs.junit)
+    androidTestImplementation(libs.testExtJunit)
+    androidTestImplementation(libs.testCore)
+    androidTestImplementation(libs.testRunner)
+    androidTestImplementation(libs.testRules)
+    androidTestImplementation(libs.truth)
+    androidTestImplementation(project(":internal-testutils-truth"))
+    androidTestImplementation(libs.kotlinCoroutinesAndroid)
 }
 
 android {
     namespace "androidx.credentials"
+
+    defaultConfig {
+        minSdkVersion 19
+    }
 }
 
 androidx {
diff --git a/credentials/credentials/src/androidTest/AndroidManifest.xml b/credentials/credentials/src/androidTest/AndroidManifest.xml
new file mode 100644
index 0000000..4995896
--- /dev/null
+++ b/credentials/credentials/src/androidTest/AndroidManifest.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  Copyright 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.
+  -->
+
+<manifest xmlns:android="http://schemas.android.com/apk/res/android">
+</manifest>
\ No newline at end of file
diff --git a/credentials/credentials/src/androidTest/java/androidx/credentials/CredentialManagerTest.kt b/credentials/credentials/src/androidTest/java/androidx/credentials/CredentialManagerTest.kt
new file mode 100644
index 0000000..81ec28f
--- /dev/null
+++ b/credentials/credentials/src/androidTest/java/androidx/credentials/CredentialManagerTest.kt
@@ -0,0 +1,58 @@
+/*
+ * Copyright 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 androidx.credentials
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import androidx.test.platform.app.InstrumentationRegistry
+import androidx.testutils.assertThrows
+import kotlinx.coroutines.runBlocking
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+@SmallTest
+class CredentialManagerTest {
+    private val context = InstrumentationRegistry.getInstrumentation().context
+
+    private lateinit var credentialManager: CredentialManager
+
+    @Before
+    fun setup() {
+        credentialManager = CredentialManager.create(context)
+    }
+
+    @Test
+    fun testCreateCredential() = runBlocking<Unit> {
+        assertThrows<UnsupportedOperationException> {
+            credentialManager.executeCreateCredential(
+                CreatePasswordRequest("test-user-id", "test-password")
+            )
+        }
+    }
+
+    @Test
+    fun testGetCredential() = runBlocking<Unit> {
+        val request = GetCredentialRequest.Builder()
+            .addGetCredentialOption(GetPasswordOption())
+            .build()
+        assertThrows<UnsupportedOperationException> {
+            credentialManager.executeGetCredential(request)
+        }
+    }
+}
\ No newline at end of file
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/ClassNames.kt b/credentials/credentials/src/main/java/androidx/credentials/CreateCredentialRequest.kt
similarity index 62%
copy from room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/ClassNames.kt
copy to credentials/credentials/src/main/java/androidx/credentials/CreateCredentialRequest.kt
index 465ea86..d630fa7 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/ClassNames.kt
+++ b/credentials/credentials/src/main/java/androidx/credentials/CreateCredentialRequest.kt
@@ -14,9 +14,13 @@
  * limitations under the License.
  */
 
-package androidx.room.compiler.codegen
+package androidx.credentials
 
-import com.squareup.javapoet.ClassName
-
-internal val NULLABLE_ANNOTATION = ClassName.get("androidx.annotation", "Nullable")
-internal val NONNULL_ANNOTATION = ClassName.get("androidx.annotation", "NonNull")
\ No newline at end of file
+/**
+ * Base request class for registering a credential.
+ *
+ * An application can construct a subtype request and call [CredentialManager.executeCreateCredential] to
+ * launch framework UI flows to collect consent and any other metadata needed from the user to
+ * register a new user credential.
+ */
+abstract class CreateCredentialRequest
\ No newline at end of file
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/ClassNames.kt b/credentials/credentials/src/main/java/androidx/credentials/CreateCredentialResponse.kt
similarity index 71%
copy from room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/ClassNames.kt
copy to credentials/credentials/src/main/java/androidx/credentials/CreateCredentialResponse.kt
index 465ea86..192d472 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/ClassNames.kt
+++ b/credentials/credentials/src/main/java/androidx/credentials/CreateCredentialResponse.kt
@@ -14,9 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.room.compiler.codegen
+package androidx.credentials
 
-import com.squareup.javapoet.ClassName
-
-internal val NULLABLE_ANNOTATION = ClassName.get("androidx.annotation", "Nullable")
-internal val NONNULL_ANNOTATION = ClassName.get("androidx.annotation", "NonNull")
\ No newline at end of file
+/** Base response class for registering a credential. */
+abstract class CreateCredentialResponse
\ No newline at end of file
diff --git a/credentials/credentials/src/main/java/androidx/credentials/CreatePasswordRequest.kt b/credentials/credentials/src/main/java/androidx/credentials/CreatePasswordRequest.kt
new file mode 100644
index 0000000..2fc0116
--- /dev/null
+++ b/credentials/credentials/src/main/java/androidx/credentials/CreatePasswordRequest.kt
@@ -0,0 +1,36 @@
+/*
+ * Copyright 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 androidx.credentials
+
+/**
+ * A request to save the user password credential with their password provider.
+ *
+ * @property id the user id associated with the password
+ * @property password the password
+ * @throws NullPointerException If [id] is null
+ * @throws NullPointerException If [password] is null
+ * @throws IllegalArgumentException If [password] is empty
+ */
+class CreatePasswordRequest constructor(
+    val id: String,
+    val password: String,
+) : CreateCredentialRequest() {
+
+    init {
+        require(password.isNotEmpty()) { "password should not be empty" }
+    }
+}
\ No newline at end of file
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/ClassNames.kt b/credentials/credentials/src/main/java/androidx/credentials/CreatePasswordResponse.kt
similarity index 71%
copy from room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/ClassNames.kt
copy to credentials/credentials/src/main/java/androidx/credentials/CreatePasswordResponse.kt
index 465ea86..d70468c 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/ClassNames.kt
+++ b/credentials/credentials/src/main/java/androidx/credentials/CreatePasswordResponse.kt
@@ -14,9 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.room.compiler.codegen
+package androidx.credentials
 
-import com.squareup.javapoet.ClassName
-
-internal val NULLABLE_ANNOTATION = ClassName.get("androidx.annotation", "Nullable")
-internal val NONNULL_ANNOTATION = ClassName.get("androidx.annotation", "NonNull")
\ No newline at end of file
+/** A response of a password saving flow. */
+class CreatePasswordResponse : CreateCredentialResponse()
\ No newline at end of file
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/ClassNames.kt b/credentials/credentials/src/main/java/androidx/credentials/Credential.kt
similarity index 71%
copy from room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/ClassNames.kt
copy to credentials/credentials/src/main/java/androidx/credentials/Credential.kt
index 465ea86..eb19ff8 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/ClassNames.kt
+++ b/credentials/credentials/src/main/java/androidx/credentials/Credential.kt
@@ -14,9 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.room.compiler.codegen
+package androidx.credentials
 
-import com.squareup.javapoet.ClassName
-
-internal val NULLABLE_ANNOTATION = ClassName.get("androidx.annotation", "Nullable")
-internal val NONNULL_ANNOTATION = ClassName.get("androidx.annotation", "NonNull")
\ No newline at end of file
+/** Base class for a credential with which the user consented to authenticate to the app. */
+abstract class Credential
\ No newline at end of file
diff --git a/credentials/credentials/src/main/java/androidx/credentials/CredentialManager.kt b/credentials/credentials/src/main/java/androidx/credentials/CredentialManager.kt
new file mode 100644
index 0000000..04e27f1c
--- /dev/null
+++ b/credentials/credentials/src/main/java/androidx/credentials/CredentialManager.kt
@@ -0,0 +1,62 @@
+/*
+ * Copyright 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 androidx.credentials
+
+import android.content.Context
+
+/**
+ * Manages user authentication flows.
+ *
+ * An application can call the CredentialManager apis to launch framework UI flows for a user to
+ * register a new credential or to consent to a saved credential from supported credential
+ * providers, which can then be used to authenticate to the app.
+ */
+@Suppress("UNUSED_PARAMETER")
+class CredentialManager private constructor(private val context: Context) {
+    companion object {
+        @JvmStatic
+        fun create(context: Context): CredentialManager = CredentialManager(context)
+    }
+
+    /**
+     * Requests a credential from the user.
+     *
+     * The execution potentially launches framework UI flows for a user to view available
+     * credentials, consent to using one of them, etc.
+     *
+     * @throws UnsupportedOperationException Since the api is unimplemented
+     */
+    // TODO(helenqin): support failure flow.
+    suspend fun executeGetCredential(request: GetCredentialRequest): GetCredentialResponse {
+        throw UnsupportedOperationException("Unimplemented")
+    }
+
+    /**
+     * Registers a user credential that can be used to authenticate the user to
+     * the app in the future.
+     *
+     * The execution potentially launches framework UI flows for a user to view their registration
+     * options, grant consent, etc.
+     *
+     * @throws UnsupportedOperationException Since the api is unimplemented
+     */
+    suspend fun executeCreateCredential(
+        request: CreateCredentialRequest
+    ): CreateCredentialResponse {
+        throw UnsupportedOperationException("Unimplemented")
+    }
+}
\ No newline at end of file
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/ClassNames.kt b/credentials/credentials/src/main/java/androidx/credentials/GetCredentialOption.kt
similarity index 71%
copy from room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/ClassNames.kt
copy to credentials/credentials/src/main/java/androidx/credentials/GetCredentialOption.kt
index 465ea86..2fcd72a 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/ClassNames.kt
+++ b/credentials/credentials/src/main/java/androidx/credentials/GetCredentialOption.kt
@@ -14,9 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.room.compiler.codegen
+package androidx.credentials
 
-import com.squareup.javapoet.ClassName
-
-internal val NULLABLE_ANNOTATION = ClassName.get("androidx.annotation", "Nullable")
-internal val NONNULL_ANNOTATION = ClassName.get("androidx.annotation", "NonNull")
\ No newline at end of file
+/** Base request class for getting a registered credential. */
+abstract class GetCredentialOption
\ No newline at end of file
diff --git a/credentials/credentials/src/main/java/androidx/credentials/GetCredentialRequest.kt b/credentials/credentials/src/main/java/androidx/credentials/GetCredentialRequest.kt
new file mode 100644
index 0000000..165198a
--- /dev/null
+++ b/credentials/credentials/src/main/java/androidx/credentials/GetCredentialRequest.kt
@@ -0,0 +1,63 @@
+/*
+ * Copyright 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 androidx.credentials
+
+/**
+ * Encapsulates a request to get a user credential.
+ *
+ * An application can construct such a request by adding one or more types of [GetCredentialOption],
+ * and then call [CredentialManager.executeGetCredential] to launch framework UI flows to allow the user
+ * to consent to using a previously saved credential for the given application.
+ *
+ * @property getCredentialOptions the list of [GetCredentialOption] from which the user can choose
+ * one to authenticate to the app
+ * @throws IllegalArgumentException If [getCredentialOptions] is empty
+ */
+class GetCredentialRequest constructor(
+    val getCredentialOptions: List<GetCredentialOption>,
+) {
+
+    init {
+        require(getCredentialOptions.isNotEmpty()) { "credentialRequests should not be empty" }
+    }
+
+    /** A builder for [GetCredentialRequest]. */
+    class Builder {
+        private var getCredentialOptions: MutableList<GetCredentialOption> = mutableListOf()
+
+        /** Adds a specific type of [GetCredentialOption]. */
+        fun addGetCredentialOption(getCredentialOption: GetCredentialOption): Builder {
+            getCredentialOptions.add(getCredentialOption)
+            return this
+        }
+
+        /** Sets the list of [GetCredentialOption]. */
+        fun setGetCredentialOptions(getCredentialOptions: List<GetCredentialOption>): Builder {
+            this.getCredentialOptions = getCredentialOptions.toMutableList()
+            return this
+        }
+
+        /**
+         * Builds a [GetCredentialRequest].
+         *
+         * @throws IllegalArgumentException If [getCredentialOptions] is empty
+         */
+        fun build(): GetCredentialRequest {
+            return GetCredentialRequest(getCredentialOptions.toList())
+        }
+    }
+}
\ No newline at end of file
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/ClassNames.kt b/credentials/credentials/src/main/java/androidx/credentials/GetCredentialResponse.kt
similarity index 65%
copy from room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/ClassNames.kt
copy to credentials/credentials/src/main/java/androidx/credentials/GetCredentialResponse.kt
index 465ea86..1a2b624 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/ClassNames.kt
+++ b/credentials/credentials/src/main/java/androidx/credentials/GetCredentialResponse.kt
@@ -14,9 +14,12 @@
  * limitations under the License.
  */
 
-package androidx.room.compiler.codegen
+package androidx.credentials
 
-import com.squareup.javapoet.ClassName
-
-internal val NULLABLE_ANNOTATION = ClassName.get("androidx.annotation", "Nullable")
-internal val NONNULL_ANNOTATION = ClassName.get("androidx.annotation", "NonNull")
\ No newline at end of file
+/**
+ * Encapsulates the result of a user credential request.
+ *
+ * @property credential the user credential that can be used to authenticate to your app
+ * @throws NullPointerException If [credential] is null
+ */
+class GetCredentialResponse constructor(val credential: Credential)
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/ClassNames.kt b/credentials/credentials/src/main/java/androidx/credentials/GetPasswordOption.kt
similarity index 71%
copy from room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/ClassNames.kt
copy to credentials/credentials/src/main/java/androidx/credentials/GetPasswordOption.kt
index 465ea86..920cbf2 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/ClassNames.kt
+++ b/credentials/credentials/src/main/java/androidx/credentials/GetPasswordOption.kt
@@ -14,9 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.room.compiler.codegen
+package androidx.credentials
 
-import com.squareup.javapoet.ClassName
-
-internal val NULLABLE_ANNOTATION = ClassName.get("androidx.annotation", "Nullable")
-internal val NONNULL_ANNOTATION = ClassName.get("androidx.annotation", "NonNull")
\ No newline at end of file
+/** A request to retrieve the user's saved application password from their password provider. */
+class GetPasswordOption : GetCredentialOption()
\ No newline at end of file
diff --git a/credentials/credentials/src/main/java/androidx/credentials/PasswordCredential.kt b/credentials/credentials/src/main/java/androidx/credentials/PasswordCredential.kt
new file mode 100644
index 0000000..252f4a1
--- /dev/null
+++ b/credentials/credentials/src/main/java/androidx/credentials/PasswordCredential.kt
@@ -0,0 +1,36 @@
+/*
+ * Copyright 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 androidx.credentials
+
+/**
+ * Represents the user's password credential granted by the user for app sign-in.
+ *
+ * @property id the user id associated with the password
+ * @property password the password
+ * @throws NullPointerException If [id] is null
+ * @throws NullPointerException If [password] is null
+ * @throws IllegalArgumentException If [password] is empty
+ */
+class PasswordCredential constructor(
+    val id: String,
+    val password: String,
+) : Credential() {
+
+    init {
+        require(password.isNotEmpty()) { "password should not be empty" }
+    }
+}
diff --git a/datastore/datastore-multiprocess/lint-baseline.xml b/datastore/datastore-multiprocess/lint-baseline.xml
deleted file mode 100644
index 7b459a2..0000000
--- a/datastore/datastore-multiprocess/lint-baseline.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
-
-    <issue
-        id="NewApi"
-        message="Implicit cast from `ParcelFileDescriptor` to `Closeable` requires API level 16 (current min is 14)"
-        errorLine1="            ).use {"
-        errorLine2="              ~~~">
-        <location
-            file="src/main/java/androidx/datastore/multiprocess/SharedCounter.kt"/>
-    </issue>
-
-</issues>
diff --git a/development/build_log_simplifier/messages.ignore b/development/build_log_simplifier/messages.ignore
index bf7168c..966172a 100644
--- a/development/build_log_simplifier/messages.ignore
+++ b/development/build_log_simplifier/messages.ignore
@@ -464,10 +464,10 @@
 WARNING: Use \-\-illegal\-access=warn to enable warnings of further illegal reflective access operations
 WARNING: All illegal access operations will be denied in a future release
 # > Task :room:room-compiler-processing-testing:test
-WARNING: Illegal reflective access by androidx\.room\.compiler\.processing\.javac\.JavacProcessingEnvMessager\$Companion \(file:\$OUT_DIR/androidx/room/room\-compiler\-processing/build/libs/room\-compiler\-processing\-[0-9]+\.[0-9]+\.[0-9]+\-alpha[0-9]+\.jar\) to field com\.sun\.tools\.javac\.code\.Symbol\.owner
+WARNING: Illegal reflective access by androidx\.room\.compiler\.processing\.javac\.JavacProcessingEnvMessager\$Companion \(file:\$OUT_DIR/androidx/room/room\-compiler\-processing/build/(classes/kotlin/main/|libs/room\-compiler\-processing\-[0-9]+\.[0-9]+\.[0-9]+(\-(alpha|beta|rc)[0-9]+)?\.jar)\) to field com\.sun\.tools\.javac\.code\.Symbol\.owner
 WARNING: Please consider reporting this to the maintainers of androidx\.room\.compiler\.processing\.javac\.JavacProcessingEnvMessager\$Companion
 # > Task :room:room-compiler:test
-WARNING: Illegal reflective access by androidx\.room\.compiler\.processing\.javac\.JavacProcessingEnvMessager\$Companion \(file:\$OUT_DIR/androidx/room/room\-compiler\-processing/build/libs/room\-compiler\-processing\-[0-9]+\.[0-9]+\.[0-9]+\-alpha[0-9]+\.jar\) to field com\.sun\.tools\.javac\.code\.Symbol\$ClassSymbol\.classfile
+WARNING: Illegal reflective access by androidx\.room\.compiler\.processing\.javac\.JavacProcessingEnvMessager\$Companion \(file:\$OUT_DIR/androidx/room/room\-compiler\-processing/build/(classes/kotlin/main/|libs/room\-compiler\-processing\-[0-9]+\.[0-9]+\.[0-9]+(\-(alpha|beta|rc)[0-9]+)?\.jar)\) to field com\.sun\.tools\.javac\.code\.Symbol\$ClassSymbol\.classfile
 # > Task :room:room-compiler-processing:test
 WARNING: Illegal reflective access by org\.jetbrains\.kotlin\.kapt[0-9]+\.base\.javac\.KaptJavaFileManager \(file:\$CHECKOUT/prebuilts/androidx/external/org/jetbrains/kotlin/kotlin\-annotation\-processing\-embeddable/[0-9]+\.[0-9]+\.[0-9]+/kotlin\-annotation\-processing\-embeddable\-[0-9]+\.[0-9]+\.[0-9]+\.jar\) to method com\.sun\.tools\.javac\.file\.BaseFileManager\.handleOption\(com\.sun\.tools\.javac\.main\.Option,java\.lang\.String\)
 WARNING: Please consider reporting this to the maintainers of org\.jetbrains\.kotlin\.kapt[0-9]+\.base\.javac\.KaptJavaFileManager
@@ -493,4 +493,7 @@
 For more detail on using Gradle, see https://docs\.gradle\.org/[0-9]+\.[0-9]+/userguide/command_line_interface\.html
 For troubleshooting, visit https://help\.gradle\.org
 # > Task :graphics:graphics-path:compileDebugKotlin
-w\: \$SUPPORT\/graphics\/graphics\-path\/src\/main\/java\/androidx\/graphics\/path\/Paths\.kt\: \([0-9]+\, [0-9]+\)\: Extension is shadowed by a member\: public open fun iterator\(\)\: PathIterator
\ No newline at end of file
+w\: \$SUPPORT\/graphics\/graphics\-path\/src\/main\/java\/androidx\/graphics\/path\/Paths\.kt\: \([0-9]+\, [0-9]+\)\: Extension is shadowed by a member\: public open fun iterator\(\)\: PathIterator
+# > Task :core:core-splashscreen:core-splashscreen-samples:lintReportDebug
+Warning: Lint will treat :annotation:annotation as an external dependency and not analyze it\.
+\* Recommended Action: Apply the 'com\.android\.lint' plugin to java library project :annotation:annotation\. to enable lint to analyze those sources\.
\ No newline at end of file
diff --git a/docs-tip-of-tree/build.gradle b/docs-tip-of-tree/build.gradle
index ce5e0d0..6550261 100644
--- a/docs-tip-of-tree/build.gradle
+++ b/docs-tip-of-tree/build.gradle
@@ -126,6 +126,7 @@
     docs(project(":core:uwb:uwb-rxjava3"))
     docs(project(":credentials:credentials"))
     docs(project(":credentials:credentials-play-services-auth"))
+    docs(project(":credentials:credentials-provider"))
     docs(project(":cursoradapter:cursoradapter"))
     docs(project(":customview:customview"))
     docs(project(":customview:customview-poolingcontainer"))
diff --git a/docs/api_guidelines/compat.md b/docs/api_guidelines/compat.md
index 69d1a5c..402beb0 100644
--- a/docs/api_guidelines/compat.md
+++ b/docs/api_guidelines/compat.md
@@ -68,6 +68,69 @@
 }
 ```
 
+##### Preventing invalid casting in verification fixes
+
+Even when a call to a new API is moved to a version-specific class, a class
+verification failure is still possible if the method returns a new type. The new
+type will be seen as `Object` on lower API levels, so casting the returned value
+outside of the version-specific class to anything other than `Object` or the
+same new type will fail.
+
+For instance, the following would **not** be valid, because it implicitly casts
+an `AdaptiveIconDrawable` (new in API level 26, `Object` on lower API levels) to
+`Drawable`. Instead, the method inside of `Api26Impl` should return `Drawable`.
+
+```java {.good}
+private Drawable methodReturnsDrawable() {
+  if (Build.VERSION.SDK_INT >= 26) {
+    // Implicitly casts the returned AdaptiveIconDrawable to Drawable
+    return Api26Impl.createAdaptiveIconDrawable(null, null);
+  } else {
+    return null;
+  }
+}
+
+@RequiresApi(26)
+static class Api26Impl {
+  // Returns AdaptiveIconDrawable, introduced in API level 26
+  @DoNotInline
+  static AdaptiveIconDrawable createAdaptiveIconDrawable(Drawable backgroundDrawable, Drawable foregroundDrawable) {
+    return new AdaptiveIconDrawable(backgroundDrawable, foregroundDrawable);
+    }
+}
+```
+
+#### Validating class verification
+
+To verify that your library does not raise class verification failures, look for
+`dex2oat` output during install time.
+
+You can generate class verification logs from test APKs. Simply call the
+class/method that should generate a class verification failure in a test.
+
+The test APK will generate class verification logs on install.
+
+```bash
+# Enable ART logging (requires root). Note the 2 pairs of quotes!
+adb root
+adb shell setprop dalvik.vm.dex2oat-flags '"--runtime-arg -verbose:verifier"'
+
+# Restart Android services to pick up the settings
+adb shell stop && adb shell start
+
+# Optional: clear logs which aren't relevant
+adb logcat -c
+
+# Install the app and check for ART logs
+# This line is what triggers log lines, and can be repeated
+adb install -d -r someApk.apk
+
+# it's useful to run this _during_ install in another shell
+adb logcat | grep 'dex2oat'
+...
+... I dex2oat : Soft verification failures in
+```
+
 #### Device-specific issues {#compat-oem}
 
 Library code may work around device- or manufacturer-specific issues -- issues
diff --git a/docs/api_guidelines/index.md b/docs/api_guidelines/index.md
index 4cff936..ff923a4 100644
--- a/docs/api_guidelines/index.md
+++ b/docs/api_guidelines/index.md
@@ -28,40 +28,7 @@
 
 <!--#include file="/company/teams/androidx/api_guidelines/misc.md"-->
 
-## Testing Guidelines
-
-### [Do not Mock, AndroidX](do_not_mock.md)
-
-### Validating class verification fixes
-
-To verify class verification, the best way is to look for `adb` output during
-install time.
-
-You can generate class verification logs from test APKs. Simply call the
-class/method that should generate a class verification failure in a test.
-
-The test APK will generate class verification logs on install.
-
-```bash
-# Enable ART logging (requires root). Note the 2 pairs of quotes!
-adb root
-adb shell setprop dalvik.vm.dex2oat-flags '"--runtime-arg -verbose:verifier"'
-
-# Restart Android services to pick up the settings
-adb shell stop && adb shell start
-
-# Optional: clear logs which aren't relevant
-adb logcat -c
-
-# Install the app and check for ART logs
-# This line is what triggers log lines, and can be repeated
-adb install -d -r someApk.apk
-
-# it's useful to run this _during_ install in another shell
-adb logcat | grep 'dex2oat'
-...
-... I dex2oat : Soft verification failures in
-```
+<!--#include file="/company/teams/androidx/api_guidelines/testing.md"-->
 
 <!--#include file="/company/teams/androidx/api_guidelines/checks.md"-->
 
diff --git a/docs/api_guidelines/misc.md b/docs/api_guidelines/misc.md
index 71ea499..e7cd515 100644
--- a/docs/api_guidelines/misc.md
+++ b/docs/api_guidelines/misc.md
@@ -1,8 +1,6 @@
-## More API guidelines {#more-api-guidelines}
+## Annotations {#annotation}
 
-### Annotations {#annotation}
-
-#### Annotation processors {#annotation-processor}
+### Annotation processors {#annotation-processor}
 
 Annotation processors should opt-in to incremental annotation processing to
 avoid triggering a full recompilation on every client source code change. See
@@ -248,9 +246,9 @@
 For more, read the section in
 [Android API Council Guidelines](https://android.googlesource.com/platform/developers/docs/+/refs/heads/master/api-guidelines/index.md#no-public-typedefs)
 
-### Constructors {#constructors}
+## Constructors {#constructors}
 
-#### View constructors {#view-constructors}
+### View constructors {#view-constructors}
 
 The four-arg View constructor -- `View(Context, AttributeSet, int, int)` -- was
 added in SDK 21 and allows a developer to pass in an explicit default style
@@ -264,11 +262,11 @@
 1.  Implement and annotate with `@RequiresApi(21)`. This means the three-arg
     constructor **must not** call into the four-arg constructor.
 
-### Asynchronous work {#async}
+## Asynchronous work {#async}
 
-#### With return values {#async-return}
+### With return values {#async-return}
 
-###### Kotlin
+#### Kotlin
 
 Traditionally, asynchronous work on Android that results in an output value
 would use a callback; however, better alternatives exist for libraries.
@@ -308,7 +306,7 @@
 fun asyncCall(executor: Executor, callback: (ReturnValue) -> Unit)
 ```
 
-###### Java
+#### Java
 
 Java libraries should prefer `ListenableFuture` and the
 [`CallbackToFutureAdapter`](https://developer.android.com/reference/androidx/concurrent/futures/CallbackToFutureAdapter)
@@ -325,7 +323,7 @@
 See the [Dependencies](#dependencies) section for more information on using
 Kotlin coroutines and Guava in your library.
 
-#### Cancellation
+### Cancellation
 
 Libraries that expose APIs for performing asynchronous work should support
 cancellation. There are *very few* cases where it is not feasible to support
@@ -366,7 +364,7 @@
 }
 ```
 
-#### Avoid `synchronized` methods
+### Avoid `synchronized` methods
 
 Whenever multiple threads are interacting with shared (mutable) references those
 reads and writes must be synchronized in some way. However synchronized blocks
@@ -388,9 +386,11 @@
 *   Update a value from multiple threads atomically
 *   Maintain granular control of your concurrency invariants
 
-### Kotlin-specific guidelines {#kotlin}
+## Kotlin-specific guidelines {#kotlin}
 
-#### Nullability from Java (new APIs)
+### Nullability
+
+#### Annotations on new Java APIs
 
 All new Java APIs should be annotated either `@Nullable` or `@NonNull` for all
 reference parameters and reference return types.
@@ -405,16 +405,17 @@
     }
 ```
 
-#### Nullability from Java (existing APIs)
+#### Adding annotations to existing Java APIs
 
 Adding `@Nullable` or `@NonNull` annotations to existing APIs to document their
-existing nullability is OK. This is a source breaking change for Kotlin
+existing nullability is allowed. This is a source-breaking change for Kotlin
 consumers, and you should ensure that it's noted in the release notes and try to
 minimize the frequency of these updates in releases.
 
-Changing the nullability of an API is a breaking change.
+Changing the nullability of an API is a behavior-breaking change and should be
+avoided.
 
-#### Extending APIs that expose types without nullability annotations
+#### Extending APIs that are missing annotations
 
 [Platform types](https://kotlinlang.org/docs/java-interop.html#null-safety-and-platform-types)
 are exposed by Java types that do not have a `@Nullable` or `@NonNull`
@@ -459,7 +460,7 @@
     }
 ```
 
-#### Data classes {#kotlin-data}
+### Data classes {#kotlin-data}
 
 Kotlin `data` classes provide a convenient way to define simple container
 objects, where Kotlin will generate `equals()` and `hashCode()` for you.
@@ -495,7 +496,7 @@
 [Public API challenges in Kotlin](https://jakewharton.com/public-api-challenges-in-kotlin/)
 for more details.
 
-#### Exhaustive `when` and `sealed class`/`enum class` {#exhaustive-when}
+### Exhaustive `when` and `sealed class`/`enum class` {#exhaustive-when}
 
 A key feature of Kotlin's `sealed class` and `enum class` declarations is that
 they permit the use of **exhaustive `when` expressions.** For example:
@@ -556,7 +557,7 @@
 }
 ```
 
-##### Non-exhaustive alternatives to `enum class`
+#### Non-exhaustive alternatives to `enum class`
 
 Kotlin's `@JvmInline value class` with a `private constructor` can be used to
 create type-safe sets of non-exhaustive constants as of Kotlin 1.5. Compose's
@@ -585,7 +586,7 @@
 new code unless it would break local consistency with other API in the same
 module that already uses `@IntDef`.
 
-##### Non-exhaustive alternatives to `sealed class`
+#### Non-exhaustive alternatives to `sealed class`
 
 Abstract classes with constructors marked as `internal` or `private` can
 represent the same subclassing restrictions of sealed classes as seen from
@@ -602,7 +603,7 @@
 **not** restrict subclasses to the same package within the module, as sealed
 classes do.
 
-##### When to use exhaustive types
+#### When to use exhaustive types
 
 Use `enum class` or `sealed class` when the values or subtypes are intended to
 be exhaustive by design from the API's initial release. Use non-exhaustive
@@ -637,7 +638,7 @@
 there is historical precedent from `android.graphics` for new blending modes to
 be added in the future.
 
-#### Extension and top-level functions {#kotlin-extension-functions}
+### Extension and top-level functions {#kotlin-extension-functions}
 
 If your Kotlin file contains any symbols outside of class-like types
 (extension/top-level functions, properties, etc), the file must be annotated
@@ -660,10 +661,32 @@
 fun String.foo() = // ...
 ```
 
-NOTE This guideline may be ignored for libraries that only work in Kotlin (think
-Compose).
+NOTE This guideline may be ignored for APIs that will only be referenced from
+Kotlin sources, such as Compose.
 
-#### Function paremeters order {#kotlin-params-order}
+### Extension functions on platform classes {#kotlin-extension-platform}
+
+While it may be tempting to backport new platform APIs using extension
+functions, the Kotlin compiler will always resolve collisions between extension
+functions and platform-defined methods by calling the platform-defined method --
+even if the method doesn't exist on earlier SDKs.
+
+```kotlin {.bad}
+fun AccessibilityNodeInfo.getTextSelectionEnd() {
+    // ... delegate to platform on SDK 18+ ...
+}
+```
+
+For the above example, any calls to `getTextSelectionEnd()` will resolve to the
+platform method -- the extension function will never be used -- and crash with
+`MethodNotFoundException` on older SDKs.
+
+Even when an extension function on a platform class does not collide with an
+existing API *yet*, there is a possibility that a conflicting API with a
+matching signature will be added in the future. As such, Jetpack libraries
+should avoid adding extension functions on platform classes.
+
+### Function paremeters order {#kotlin-params-order}
 
 In Kotlin function parameters can have default values, which are used when you
 skip the corresponding argument.
diff --git a/docs/api_guidelines/modules.md b/docs/api_guidelines/modules.md
index 4f94a16..08e3433 100644
--- a/docs/api_guidelines/modules.md
+++ b/docs/api_guidelines/modules.md
@@ -72,7 +72,7 @@
 #### Project creator script {#module-creation}
 
 Note: The terms *project*, *module*, and *library* are often used
-interchangeably within AndroidX, with project being the technical term used by
+interchangeably within AndroidX, with *project* being the technical term used by
 Gradle to describe a build target, e.g. a library that maps to a single AAR.
 
 New projects can be created using our
@@ -113,6 +113,12 @@
     *   virtualenv will automatically .gitignore itself, but you may want to to
         remove it anyway.
 
+Note: if the module you are creating is an application (not a library), such as
+you might want for integration-tests, edit the project's `build.gradle` file and
+replace the plugin `id("com.android.library")` with
+`id("com.android.application")`. This allows you to run activities in that
+module from within Android Studio.
+
 #### Common sub-feature names {#module-naming-subfeature}
 
 *   `-testing` for an artifact intended to be used while testing usages of your
diff --git a/docs/api_guidelines/platform_compat.md b/docs/api_guidelines/platform_compat.md
index 0148e18..a1f46f2 100644
--- a/docs/api_guidelines/platform_compat.md
+++ b/docs/api_guidelines/platform_compat.md
@@ -44,7 +44,7 @@
 The following sample provides static helper methods for the platform class
 `android.os.Process`.
 
-~~~java
+```java
 package androidx.core.os;
 
 /**
@@ -81,6 +81,7 @@
         }
     }
 }
+```
 
 ### Wrapper (ex. [AccessibilityNodeInfoCompat](https://developer.android.com/reference/android/view/accessibility/AccessibilityNodeInfo)) {#wrapper}
 
@@ -227,7 +228,7 @@
     }
   }
 }
-~~~
+```
 
 Note that libraries written in Java should express conversion to and from the
 platform class differently than Kotlin classes. For Java classes, conversion
diff --git a/docs/do_not_mock.md b/docs/api_guidelines/testing.md
similarity index 91%
rename from docs/do_not_mock.md
rename to docs/api_guidelines/testing.md
index 3dd6531..8232fb5d8b 100644
--- a/docs/do_not_mock.md
+++ b/docs/api_guidelines/testing.md
@@ -1,11 +1,13 @@
-# Do Not Mock
+## Testing
+
+### Do not rely on mocks
 
 All APIs created in Jetpack **must have a testing story**: how developers should
 write tests for their code that relies on a library, this story should not be
 "use Mockito to mock class `Foo`". Your goal as an API owner is to **create
 better alternatives** to mocking.
 
-## Why can't I suggest mocks as testing strategy?
+#### Why can't I suggest mocks as testing strategy?
 
 Frequently, mocks don't follow guarantees outlined in the API they mock. That
 leads to:
@@ -44,7 +46,7 @@
     this mock grows with the project, and as a result test code has sub-optimal
     half-baked class implementation of on top of the mock.
 
-## But it is okay to mock interfaces, right?
+#### But it's okay to mock interfaces, right?
 
 It depends. There are interfaces that don't imply any behavior guarantees and
 they are ok to be mocked. However, **not all** interfaces are like that: for
@@ -52,7 +54,7 @@
 correct implementation. Examples of interfaces that are ok to mock are callback
 interfaces in general, for example: `View.OnClickListener`, `Runnable`.
 
-## What about spying?
+#### What about spying?
 
 Spying on these classes is banned as well - Mockito spies permit stubbing of
 methods just like mocks do, and interaction verification is brittle and
@@ -62,7 +64,7 @@
 layout. If an API in your library misses a way to have such checks, you should
 add methods to do that.
 
-## Avoid Mockito in your own tests.
+#### Avoid Mockito in your own tests
 
 One of the things that would help you to identify if your library is testable
 without Mockito is not using Mockito yourself. Yes, historically we heavily
@@ -97,7 +99,7 @@
 }
 ```
 
-## Don't compromise in API to enable Mockito
+#### Don't compromise in API to enable Mockito
 
 Mockito on Android
 [had an issue](https://github.com/Mockito/Mockito/issues/1173) with mocking
@@ -107,9 +109,9 @@
 you should instead is verify that is possible to write the same test without
 mocking, if not, again you should **provide better alternative in your API**.
 
-## How do I approach testing story for my API?
+#### How do I approach testing story for my API?
 
-Best way is to step into developer's shoes and write a sample app that is a
+The best way is to step into developer's shoes and write a sample app that is a
 showcase for your API, then go to the next step - test that code also. If you
 are able to implement tests for your demo app, then users of your API will also
 be able to implement tests for functionalities where your API is also used.
diff --git a/docs/onboarding.md b/docs/onboarding.md
index 7fd3c15..9a40177 100644
--- a/docs/onboarding.md
+++ b/docs/onboarding.md
@@ -7,8 +7,8 @@
 
 This page does **not** cover best practices for the content of changes. Please
 see [Life of a Jetpack Feature](loaf.md) for details on developing and releasing
-a library, [API Guidelines](api_guidelines.md) for best practices regarding
-public APIs and an overview of the constraints placed on changes.
+a library, [API Guidelines](api_guidelines/index.md) for best practices
+regarding public APIs and an overview of the constraints placed on changes.
 
 ## Workstation setup {#setup}
 
@@ -366,7 +366,7 @@
 
 To make warnings fail your build (same as presubmit), use the `--strict` flag,
 which our gradlew expands into a few correctness-related flags including
-`-Pandroidx.allWarningsAsErrors`:
+`-Pandroidx.validateNoUnrecognizedMessages`:
 
 ```shell
 ./gradlew core:core:assemble --strict
@@ -604,10 +604,11 @@
 *   `<version>.txt`: Public API surface, tracked for compatibility
 *   `restricted_<version>.txt`: `@RestrictTo` API surface, tracked for
     compatibility where necessary (see
-    [Restricted APIs](api_guidelines.md#restricted-api))
+    [Restricted APIs](api_guidelines/index.md#restricted-api))
 *   `public_plus_experimental_<version>.txt`: Public API surface plus
     `@RequiresOptIn` experimental API surfaces used for documentation (see
-    [Experimental APIs](api_guidelines.md#experimental-api)) and API review
+    [Experimental APIs](api_guidelines/index.md#experimental-api)) and API
+    review
 
 ### Release notes & the `Relnote:` tag {#relnote}
 
diff --git a/docs/testing.md b/docs/testing.md
index 50f5928..2829821 100644
--- a/docs/testing.md
+++ b/docs/testing.md
@@ -127,7 +127,7 @@
 pre-release version of the Android SDK then you may see an error like
 
 ```
-java.lang.IllegalArgumentException: Package targetSdkVersion=33 > maxSdkVersion=32
+java.lang.IllegalArgumentException: Package targetSdkVersion=31 > maxSdkVersion=30
 at org.robolectric.plugins.DefaultSdkPicker.configuredSdks(DefaultSdkPicker.java:118)
 at org.robolectric.plugins.DefaultSdkPicker.selectSdks(DefaultSdkPicker.java:69)
 ```
@@ -137,9 +137,9 @@
 following contents:
 
 ```
-# Robolectric currently doesn't support API 33, so we have to explicitly specify 32 as the target
+# Robolectric currently doesn't support API 31, so we have to explicitly specify 30 as the target
 # sdk for now. Remove when no longer necessary.
-sdk=32
+sdk=30
 ```
 
 ## Using the emulator {#emulator}
diff --git a/glance/glance-appwidget/api/current.txt b/glance/glance-appwidget/api/current.txt
index 94ab9a6..b840a3e 100644
--- a/glance/glance-appwidget/api/current.txt
+++ b/glance/glance-appwidget/api/current.txt
@@ -73,6 +73,7 @@
     method public androidx.glance.GlanceId getGlanceIdBy(int appWidgetId);
     method public androidx.glance.GlanceId? getGlanceIdBy(android.content.Intent configurationIntent);
     method public suspend <T extends androidx.glance.appwidget.GlanceAppWidget> Object? getGlanceIds(Class<T> provider, kotlin.coroutines.Continuation<? super java.util.List<? extends androidx.glance.GlanceId>>);
+    method public <T extends androidx.glance.appwidget.GlanceAppWidgetReceiver> boolean requestPinGlanceAppWidget(Class<T> receiver, optional androidx.glance.appwidget.GlanceAppWidget? preview, optional Object? previewState, optional android.app.PendingIntent? successCallback);
   }
 
   public final class GlanceAppWidgetManagerKt {
diff --git a/glance/glance-appwidget/api/public_plus_experimental_current.txt b/glance/glance-appwidget/api/public_plus_experimental_current.txt
index e16ae856..a78b9e6 100644
--- a/glance/glance-appwidget/api/public_plus_experimental_current.txt
+++ b/glance/glance-appwidget/api/public_plus_experimental_current.txt
@@ -76,6 +76,7 @@
     method public androidx.glance.GlanceId getGlanceIdBy(int appWidgetId);
     method public androidx.glance.GlanceId? getGlanceIdBy(android.content.Intent configurationIntent);
     method public suspend <T extends androidx.glance.appwidget.GlanceAppWidget> Object? getGlanceIds(Class<T> provider, kotlin.coroutines.Continuation<? super java.util.List<? extends androidx.glance.GlanceId>>);
+    method public <T extends androidx.glance.appwidget.GlanceAppWidgetReceiver> boolean requestPinGlanceAppWidget(Class<T> receiver, optional androidx.glance.appwidget.GlanceAppWidget? preview, optional Object? previewState, optional android.app.PendingIntent? successCallback);
   }
 
   public final class GlanceAppWidgetManagerKt {
diff --git a/glance/glance-appwidget/api/restricted_current.txt b/glance/glance-appwidget/api/restricted_current.txt
index 94ab9a6..b840a3e 100644
--- a/glance/glance-appwidget/api/restricted_current.txt
+++ b/glance/glance-appwidget/api/restricted_current.txt
@@ -73,6 +73,7 @@
     method public androidx.glance.GlanceId getGlanceIdBy(int appWidgetId);
     method public androidx.glance.GlanceId? getGlanceIdBy(android.content.Intent configurationIntent);
     method public suspend <T extends androidx.glance.appwidget.GlanceAppWidget> Object? getGlanceIds(Class<T> provider, kotlin.coroutines.Continuation<? super java.util.List<? extends androidx.glance.GlanceId>>);
+    method public <T extends androidx.glance.appwidget.GlanceAppWidgetReceiver> boolean requestPinGlanceAppWidget(Class<T> receiver, optional androidx.glance.appwidget.GlanceAppWidget? preview, optional Object? previewState, optional android.app.PendingIntent? successCallback);
   }
 
   public final class GlanceAppWidgetManagerKt {
diff --git a/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/GlanceAppWidgetDemoActivity.kt b/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/GlanceAppWidgetDemoActivity.kt
index e62c90e..fb88455 100644
--- a/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/GlanceAppWidgetDemoActivity.kt
+++ b/glance/glance-appwidget/integration-tests/demos/src/main/java/androidx/glance/appwidget/demos/GlanceAppWidgetDemoActivity.kt
@@ -21,6 +21,7 @@
 import androidx.activity.ComponentActivity
 import androidx.activity.compose.setContent
 import androidx.compose.foundation.background
+import androidx.compose.foundation.clickable
 import androidx.compose.foundation.layout.Arrangement
 import androidx.compose.foundation.layout.Column
 import androidx.compose.foundation.layout.Row
@@ -34,6 +35,7 @@
 import androidx.compose.material.Divider
 import androidx.compose.material.Text
 import androidx.compose.runtime.Composable
+import androidx.compose.runtime.rememberCoroutineScope
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.Color
@@ -42,6 +44,7 @@
 import androidx.compose.ui.unit.DpSize
 import androidx.compose.ui.unit.dp
 import androidx.compose.ui.unit.sp
+import androidx.datastore.preferences.core.emptyPreferences
 import androidx.glance.GlanceId
 import androidx.glance.appwidget.GlanceAppWidget
 import androidx.glance.appwidget.GlanceAppWidgetManager
@@ -72,24 +75,23 @@
             val receivers = appWidgetManager.installedProviders
                 .filter { it.provider.packageName == packageName }
                 .map { it.provider.className }
-            val allClassNames = receivers.mapNotNull { receiverName ->
+            val data = receivers.mapNotNull { receiverName ->
                 val receiverClass = Class.forName(receiverName)
                 if (!GlanceAppWidgetReceiver::class.java.isAssignableFrom(receiverClass)) {
                     return@mapNotNull null
                 }
                 val receiver = receiverClass.newInstance() as GlanceAppWidgetReceiver
-                receiver.glanceAppWidget.javaClass
-            }
-
-            val data = allClassNames.map { provider ->
+                val provider = receiver.glanceAppWidget.javaClass
                 ProviderData(
                     provider = provider,
+                    receiver = receiver.javaClass,
                     appWidgets = manager.getGlanceIds(provider).map { id ->
                         AppWidgetDesc(appWidgetId = id, sizes = manager.getAppWidgetSizes(id))
                     })
             }
 
             setContent {
+                val scope = rememberCoroutineScope()
                 Column(modifier = Modifier.fillMaxSize()) {
                     Text(
                         "Installed App Widgets",
@@ -100,11 +102,21 @@
                     )
                     Spacer(modifier = Modifier.height(5.dp))
                     LazyColumn(
-                        modifier = Modifier.fillMaxWidth().weight(1f),
+                        modifier = Modifier
+                            .fillMaxWidth()
+                            .weight(1f),
                         verticalArrangement = Arrangement.spacedBy(8.dp),
                     ) {
                         items(data) {
-                            ShowProvider(it)
+                            ShowProvider(it) {
+                                scope.launch {
+                                    manager.requestPinGlanceAppWidget(
+                                        receiver = it.receiver,
+                                        preview = it.provider.newInstance(),
+                                        previewState = emptyPreferences()
+                                    )
+                                }
+                            }
                             Divider(color = Color.Black)
                         }
                     }
@@ -115,13 +127,18 @@
 }
 
 @Composable
-fun ShowProvider(providerData: ProviderData) {
+fun ShowProvider(providerData: ProviderData, onProviderClicked: (ProviderData) -> Unit) {
     Column(
-        modifier = Modifier.fillMaxWidth()
+        modifier = Modifier
+            .fillMaxWidth()
+            .clickable {
+                onProviderClicked(providerData)
+            }
     ) {
         Text(providerData.provider.simpleName, fontWeight = FontWeight.Medium)
         Column(
-            modifier = Modifier.fillMaxWidth()
+            modifier = Modifier
+                .fillMaxWidth()
                 .padding(start = 16.dp)
                 .background(Color.LightGray)
         ) {
@@ -161,6 +178,7 @@
 
 data class ProviderData(
     val provider: Class<out GlanceAppWidget>,
+    val receiver: Class<out GlanceAppWidgetReceiver>,
     val appWidgets: List<AppWidgetDesc>,
 )
 
diff --git a/glance/glance-appwidget/integration-tests/template-demos/src/main/java/androidx/glance/appwidget/template/demos/ListDemoWidget.kt b/glance/glance-appwidget/integration-tests/template-demos/src/main/java/androidx/glance/appwidget/template/demos/ListDemoWidget.kt
index 811e8f3..f364a70 100644
--- a/glance/glance-appwidget/integration-tests/template-demos/src/main/java/androidx/glance/appwidget/template/demos/ListDemoWidget.kt
+++ b/glance/glance-appwidget/integration-tests/template-demos/src/main/java/androidx/glance/appwidget/template/demos/ListDemoWidget.kt
@@ -49,14 +49,12 @@
 import androidx.glance.template.TextType
 
 /**
- * List demo with list items in full details and list header with action button using data and list
+ * List demo with list items in full details and list item action button using data and list
  * template from [BaseListDemoWidget].
  */
 class FullHeaderActionListDemoWidget : BaseListDemoWidget() {
     @Composable
-    override fun TemplateContent() = ListTemplateContent(ListStyle.Full, true, true, 1)
-
-    override fun headerButtonAction(): Action = actionRunCallback<ListAddButtonAction>()
+    override fun TemplateContent() = ListTemplateContent(ListStyle.Full, true)
 
     override fun itemSelectAction(params: ActionParameters): Action =
         actionRunCallback<ListTemplateItemAction>(params)
@@ -111,11 +109,6 @@
  */
 abstract class BaseListDemoWidget : GlanceTemplateAppWidget() {
     /**
-     * Defines the handling of header button action.
-     */
-    open fun headerButtonAction(): Action = actionRunCallback<DefaultNoopAction>()
-
-    /**
      * Defines the handling of item select action.
      *
      * @param params action parameters for selection index
@@ -128,15 +121,13 @@
      *
      * @param listStyle styling the list by [ListStyle] based data details
      * @param initialNumItems initial number of list items to generate in the demo
-     * @param showHeaderAction whether to show list header action button
      * @param showHeader whether to show list header as a whole
      */
     @Composable
     internal fun ListTemplateContent(
         listStyle: ListStyle,
         showHeader: Boolean = false,
-        showHeaderAction: Boolean = false,
-        initialNumItems: Int = 3,
+        initialNumItems: Int = MAX_ITEMS,
     ) {
         val state = currentState<Preferences>()
         val content = mutableListOf<ListTemplateItem>()
@@ -192,17 +183,6 @@
                         ImageProvider(R.drawable.ic_widget),
                         "Logo"
                     ),
-                    actionBlock = if (showHeaderAction) ActionBlock(
-                        actionButtons = listOf(
-                            TemplateImageButton(
-                                headerButtonAction(),
-                                TemplateImageWithDescription(
-                                    ImageProvider(R.drawable.ic_add),
-                                    "Add item"
-                                )
-                            ),
-                        ),
-                    ) else null,
                 ) else null,
                 listContent = content,
                 listStyle = listStyle
@@ -220,26 +200,6 @@
     }
 }
 
-class ListAddButtonAction : ActionCallback {
-    override suspend fun onAction(
-        context: Context,
-        glanceId: GlanceId,
-        parameters: ActionParameters
-    ) {
-        updateAppWidgetState(context, glanceId) { prefs ->
-            var count = prefs[CountKey] ?: 1
-            if (count >= MAX_ITEMS) {
-                count = 0
-                if (prefs[ItemClickedKey] != 1) {
-                    prefs.minusAssign(ItemClickedKey)
-                }
-            }
-            prefs[CountKey] = ++count
-        }
-        FullHeaderActionListDemoWidget().update(context, glanceId)
-    }
-}
-
 class ListTemplateItemAction : ActionCallback {
     override suspend fun onAction(
         context: Context,
diff --git a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/AppWidgetHostRule.kt b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/AppWidgetHostRule.kt
index 96af09c..8639a2f 100644
--- a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/AppWidgetHostRule.kt
+++ b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/AppWidgetHostRule.kt
@@ -96,6 +96,8 @@
 
     val appWidgetId: Int get() = mAppWidgetId
 
+    val device: UiDevice get() = mUiDevice
+
     override fun apply(base: Statement, description: Description) = object : Statement() {
 
         override fun evaluate() {
diff --git a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/AppWidgetHostTestActivity.kt b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/AppWidgetHostTestActivity.kt
index 97f6c7d..8f98489 100644
--- a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/AppWidgetHostTestActivity.kt
+++ b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/AppWidgetHostTestActivity.kt
@@ -60,9 +60,13 @@
     override fun onDestroy() {
         try {
             mHost?.stopListening()
-            mHost?.deleteHost()
         } catch (ex: Throwable) {
-            Log.w("AppWidgetHostTestActivity", "Error stopping the AppWidget Host", ex)
+            Log.w("AppWidgetHostTestActivity", "Error stopping listening", ex)
+        }
+        try {
+            mHost?.deleteHost()
+        } catch (t: Throwable) {
+            Log.w("AppWidgetHostTestActivity", "Error deleting Host", t)
         }
         mHost = null
         super.onDestroy()
diff --git a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/GlanceAppWidgetManagerTest.kt b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/GlanceAppWidgetManagerTest.kt
index 4855624..3f33bc5 100644
--- a/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/GlanceAppWidgetManagerTest.kt
+++ b/glance/glance-appwidget/src/androidAndroidTest/kotlin/androidx/glance/appwidget/GlanceAppWidgetManagerTest.kt
@@ -16,11 +16,15 @@
 
 package androidx.glance.appwidget
 
+import android.content.Intent
 import androidx.glance.text.Text
 import androidx.test.filters.MediumTest
 import androidx.test.filters.SdkSuppress
+import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
+import androidx.test.uiautomator.UiSelector
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.runBlocking
+import org.junit.After
 import org.junit.Before
 import org.junit.Rule
 import org.junit.Test
@@ -37,6 +41,14 @@
         TestGlanceAppWidget.sizeMode = SizeMode.Single
     }
 
+    @After
+    fun tearDown() {
+        getInstrumentation().context.startActivity(Intent(Intent.ACTION_MAIN).apply {
+            addCategory(Intent.CATEGORY_HOME)
+            flags = Intent.FLAG_ACTIVITY_NEW_TASK
+        })
+    }
+
     @Test
     fun noAppWidget() {
         mHostRule.onHostActivity { activity ->
@@ -73,6 +85,37 @@
     }
 
     @Test
+    fun pinAppWidget() {
+        val text = "Something"
+        TestGlanceAppWidget.uiDefinition = {
+            Text(text)
+        }
+
+        mHostRule.onHostActivity { activity ->
+            val manager = GlanceAppWidgetManager(activity)
+
+            val result = manager.requestPinGlanceAppWidget(
+                TestGlanceAppWidgetReceiver::class.java,
+                preview = TestGlanceAppWidget
+            )
+            assertThat(result).isTrue()
+            assertThat(mHostRule.device.findObject(UiSelector().text(text)).exists())
+        }
+    }
+
+    @Test
+    fun pinInvalidAppWidget() {
+        mHostRule.onHostActivity { activity ->
+            val manager = GlanceAppWidgetManager(activity)
+
+            val result = manager.requestPinGlanceAppWidget(
+                DummyGlanceAppWidgetReceiver::class.java
+            )
+            assertThat(result).isFalse()
+        }
+    }
+
+    @Test
     fun cleanReceivers() {
         mHostRule.onHostActivity { activity ->
             val manager = GlanceAppWidgetManager(activity)
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/GlanceAppWidget.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/GlanceAppWidget.kt
index 0ba075d..b26b1e7 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/GlanceAppWidget.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/GlanceAppWidget.kt
@@ -50,6 +50,9 @@
 import kotlin.math.ceil
 import kotlin.math.min
 import kotlinx.coroutines.CancellationException
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.Job
 import kotlinx.coroutines.async
 import kotlinx.coroutines.awaitAll
 import kotlinx.coroutines.coroutineScope
@@ -171,23 +174,7 @@
         appWidgetId: Int
     ): DpSize {
         val info = appWidgetManager.getAppWidgetInfo(appWidgetId) ?: return DpSize.Zero
-        val minWidth = min(
-            info.minWidth,
-            if (info.resizeMode and AppWidgetProviderInfo.RESIZE_HORIZONTAL != 0) {
-                info.minResizeWidth
-            } else {
-                Int.MAX_VALUE
-            }
-        )
-        val minHeight = min(
-            info.minHeight,
-            if (info.resizeMode and AppWidgetProviderInfo.RESIZE_VERTICAL != 0) {
-                info.minResizeHeight
-            } else {
-                Int.MAX_VALUE
-            }
-        )
-        return DpSize(minWidth.pixelsToDp(displayMetrics), minHeight.pixelsToDp(displayMetrics))
+        return info.getMinSize(displayMetrics)
     }
 
     // Trigger the composition of the View to create the RemoteViews.
@@ -382,15 +369,8 @@
         val recomposer = Recomposer(coroutineContext)
         val composition = Composition(applier, recomposer)
         val glanceId = AppWidgetId(appWidgetId)
-        composition.setContent {
-            CompositionLocalProvider(
-                LocalContext provides context,
-                LocalGlanceId provides glanceId,
-                LocalAppWidgetOptions provides options,
-                LocalState provides state,
-                LocalSize provides size,
-            ) { Content() }
-        }
+        composition.setContent(context, glanceId, options, state, size)
+
         launch { recomposer.runRecomposeAndApplyChanges() }
         recomposer.close()
         recomposer.join()
@@ -407,6 +387,24 @@
         )
     }
 
+    private fun Composition.setContent(
+        context: Context,
+        glanceId: AppWidgetId,
+        options: Bundle,
+        state: Any?,
+        size: DpSize
+    ) {
+        setContent {
+            CompositionLocalProvider(
+                LocalContext provides context,
+                LocalGlanceId provides glanceId,
+                LocalAppWidgetOptions provides options,
+                LocalState provides state,
+                LocalSize provides size,
+            ) { Content() }
+        }
+    }
+
     private companion object {
         /**
          * Maximum depth for a composition. Although there is no hard limit, this should avoid deep
@@ -463,6 +461,33 @@
             appWidgetManager.updateAppWidget(appWidgetId, rv)
         }
     }
+
+    /**
+     * Creates a snapshot of the GlanceAppWidget content without running recomposition.
+     * Useful to only generate once the composed RemoteViews instance.
+     *
+     * @see GlanceAppWidget.composeForSize
+     * @see GlanceAppWidgetManager.requestPinGlanceAppWidget
+     */
+    internal fun snapshot(
+        context: Context,
+        appWidgetId: Int,
+        state: Any?,
+        options: Bundle,
+        size: DpSize,
+    ): RemoteViews {
+        // The maximum depth must be reduced if the compositions are combined
+        val root = RemoteViewsRoot(maxDepth = MaxComposeTreeDepth)
+        val applier = Applier(root)
+        val scope = CoroutineScope(Job() + Dispatchers.Main)
+        val recomposer = Recomposer(scope.coroutineContext)
+        val composition = Composition(applier, recomposer)
+        val glanceId = AppWidgetId(appWidgetId)
+
+        composition.setContent(context, glanceId, options, state, size)
+        normalizeCompositionTree(root)
+        return translateComposition(context, appWidgetId, root, null, 0, size)
+    }
 }
 
 internal fun createUniqueRemoteUiName(appWidgetId: Int) = "appWidget-$appWidgetId"
@@ -538,6 +563,29 @@
         }
     }.minByOrNull { it.second }?.first
 
+/**
+ * @return the minimum size as configured by the App Widget provider.
+ */
+internal fun AppWidgetProviderInfo.getMinSize(displayMetrics: DisplayMetrics): DpSize {
+    val minWidth = min(
+        minWidth,
+        if (resizeMode and AppWidgetProviderInfo.RESIZE_HORIZONTAL != 0) {
+            minResizeWidth
+        } else {
+            Int.MAX_VALUE
+        }
+    )
+    val minHeight = min(
+        minHeight,
+        if (resizeMode and AppWidgetProviderInfo.RESIZE_VERTICAL != 0) {
+            minResizeHeight
+        } else {
+            Int.MAX_VALUE
+        }
+    )
+    return DpSize(minWidth.pixelsToDp(displayMetrics), minHeight.pixelsToDp(displayMetrics))
+}
+
 private fun Collection<DpSize>.sortedBySize() =
     sortedWith(compareBy({ it.width.value * it.height.value }, { it.width.value }))
 
@@ -565,4 +613,4 @@
         val state = getAppWidgetState(context, stateDef, glanceId) as State
         if (predicate(state)) update(context, glanceId)
     }
-}
+}
\ No newline at end of file
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/GlanceAppWidgetManager.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/GlanceAppWidgetManager.kt
index 0fb0915..09442fa 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/GlanceAppWidgetManager.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/GlanceAppWidgetManager.kt
@@ -16,10 +16,15 @@
 
 package androidx.glance.appwidget
 
+import android.app.PendingIntent
 import android.appwidget.AppWidgetManager
 import android.content.ComponentName
 import android.content.Context
 import android.content.Intent
+import android.os.Build
+import android.os.Bundle
+import androidx.annotation.DoNotInline
+import androidx.annotation.RequiresApi
 import androidx.annotation.VisibleForTesting
 import androidx.compose.ui.unit.DpSize
 import androidx.datastore.core.DataStore
@@ -158,6 +163,62 @@
         return AppWidgetId(appWidgetId)
     }
 
+    /**
+     * Request to pin the [GlanceAppWidget] of the given receiver on the current launcher
+     * (if supported).
+     *
+     * Note: the request is only supported for SDK 26 and beyond, for lower versions this method
+     * will be no-op and return false.
+     *
+     * @param receiver the target [GlanceAppWidgetReceiver] class
+     * @param preview the instance of the GlanceAppWidget to compose the preview that will be shown
+     * in the request dialog. When not provided the app widget previewImage (as defined in the
+     * meta-data) will be used instead, or the app's icon if not available either.
+     * @param previewState the state (as defined by the [GlanceAppWidget.stateDefinition] to use for
+     * the preview
+     * @param successCallback a [PendingIntent] to be invoked if the app widget pinning is accepted
+     * by the user
+     *
+     * @return true if the request was successfully sent to the system, false otherwise
+     *
+     * @see AppWidgetManager.requestPinAppWidget for more information and limitations
+     */
+    fun <T : GlanceAppWidgetReceiver> requestPinGlanceAppWidget(
+        receiver: Class<T>,
+        preview: GlanceAppWidget? = null,
+        previewState: Any? = null,
+        successCallback: PendingIntent? = null,
+    ): Boolean {
+        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
+            return false
+        }
+        if (AppWidgetManagerApi26Impl.isRequestPinAppWidgetSupported(appWidgetManager)) {
+            val target = ComponentName(context.packageName, receiver.name)
+            val previewBundle = Bundle().apply {
+                if (preview != null) {
+                    val info = appWidgetManager.installedProviders.first {
+                        it.provider == target
+                    }
+                    val snapshot = preview.snapshot(
+                        context = context,
+                        appWidgetId = AppWidgetManager.INVALID_APPWIDGET_ID,
+                        state = previewState,
+                        options = Bundle.EMPTY,
+                        size = info.getMinSize(context.resources.displayMetrics),
+                    )
+                    putParcelable(AppWidgetManager.EXTRA_APPWIDGET_PREVIEW, snapshot)
+                }
+            }
+            return AppWidgetManagerApi26Impl.requestPinAppWidget(
+                appWidgetManager,
+                target,
+                previewBundle,
+                successCallback
+            )
+        }
+        return false
+    }
+
     /** Check which receivers still exist, and clean the data store to only keep those. */
     internal suspend fun cleanReceivers() {
         val packageName = context.packageName
@@ -188,6 +249,22 @@
 
         private fun providerKey(provider: String) = stringPreferencesKey("provider:$provider")
     }
+
+    @RequiresApi(Build.VERSION_CODES.O)
+    private object AppWidgetManagerApi26Impl {
+
+        @DoNotInline
+        fun isRequestPinAppWidgetSupported(manager: AppWidgetManager) =
+            manager.isRequestPinAppWidgetSupported
+
+        @DoNotInline
+        fun requestPinAppWidget(
+            manager: AppWidgetManager,
+            target: ComponentName,
+            extras: Bundle?,
+            successCallback: PendingIntent?,
+        ) = manager.requestPinAppWidget(target, extras, successCallback)
+    }
 }
 
 private fun Map<ComponentName, String>.reverseMapping(): Map<String, List<ComponentName>> =
diff --git a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/template/GlanceAppWidgetTemplates.kt b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/template/GlanceAppWidgetTemplates.kt
index c267412..dc469701 100644
--- a/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/template/GlanceAppWidgetTemplates.kt
+++ b/glance/glance-appwidget/src/androidMain/kotlin/androidx/glance/appwidget/template/GlanceAppWidgetTemplates.kt
@@ -54,15 +54,13 @@
  *
  * @param headerIcon glanceable main logo icon
  * @param header main header text
- * @param actionButton main header action button to the right side
  */
 @Composable
 internal fun AppWidgetTemplateHeader(
     headerIcon: TemplateImageWithDescription? = null,
     header: TemplateText? = null,
-    actionButton: TemplateButton? = null,
 ) {
-    if (headerIcon == null && header == null && actionButton == null) return
+    if (headerIcon == null && header == null) return
 
     Row(
         modifier = GlanceModifier.fillMaxWidth(),
@@ -91,15 +89,6 @@
                 maxLines = 1
             )
         }
-        actionButton?.let {
-            if (headerIcon != null || header != null) {
-                Spacer(modifier = GlanceModifier.width(8.dp))
-            }
-            AppWidgetTemplateButton(
-                actionButton,
-                GlanceModifier.height(48.dp).width(48.dp)
-            )
-        }
     }
 }
 
@@ -114,7 +103,6 @@
     AppWidgetTemplateHeader(
         headerBlock.icon,
         headerBlock.text,
-        headerBlock.actionBlock?.actionButtons?.get(0)
     )
 }
 
diff --git a/glance/glance/api/current.txt b/glance/glance/api/current.txt
index 5218a74..038574a 100644
--- a/glance/glance/api/current.txt
+++ b/glance/glance/api/current.txt
@@ -486,11 +486,9 @@
   }
 
   public final class HeaderBlock {
-    ctor public HeaderBlock(androidx.glance.template.TemplateText text, optional androidx.glance.template.TemplateImageWithDescription? icon, optional androidx.glance.template.ActionBlock? actionBlock);
-    method public androidx.glance.template.ActionBlock? getActionBlock();
+    ctor public HeaderBlock(androidx.glance.template.TemplateText text, optional androidx.glance.template.TemplateImageWithDescription? icon);
     method public androidx.glance.template.TemplateImageWithDescription? getIcon();
     method public androidx.glance.template.TemplateText getText();
-    property public final androidx.glance.template.ActionBlock? actionBlock;
     property public final androidx.glance.template.TemplateImageWithDescription? icon;
     property public final androidx.glance.template.TemplateText text;
   }
diff --git a/glance/glance/api/public_plus_experimental_current.txt b/glance/glance/api/public_plus_experimental_current.txt
index 5218a74..038574a 100644
--- a/glance/glance/api/public_plus_experimental_current.txt
+++ b/glance/glance/api/public_plus_experimental_current.txt
@@ -486,11 +486,9 @@
   }
 
   public final class HeaderBlock {
-    ctor public HeaderBlock(androidx.glance.template.TemplateText text, optional androidx.glance.template.TemplateImageWithDescription? icon, optional androidx.glance.template.ActionBlock? actionBlock);
-    method public androidx.glance.template.ActionBlock? getActionBlock();
+    ctor public HeaderBlock(androidx.glance.template.TemplateText text, optional androidx.glance.template.TemplateImageWithDescription? icon);
     method public androidx.glance.template.TemplateImageWithDescription? getIcon();
     method public androidx.glance.template.TemplateText getText();
-    property public final androidx.glance.template.ActionBlock? actionBlock;
     property public final androidx.glance.template.TemplateImageWithDescription? icon;
     property public final androidx.glance.template.TemplateText text;
   }
diff --git a/glance/glance/api/restricted_current.txt b/glance/glance/api/restricted_current.txt
index 5218a74..038574a 100644
--- a/glance/glance/api/restricted_current.txt
+++ b/glance/glance/api/restricted_current.txt
@@ -486,11 +486,9 @@
   }
 
   public final class HeaderBlock {
-    ctor public HeaderBlock(androidx.glance.template.TemplateText text, optional androidx.glance.template.TemplateImageWithDescription? icon, optional androidx.glance.template.ActionBlock? actionBlock);
-    method public androidx.glance.template.ActionBlock? getActionBlock();
+    ctor public HeaderBlock(androidx.glance.template.TemplateText text, optional androidx.glance.template.TemplateImageWithDescription? icon);
     method public androidx.glance.template.TemplateImageWithDescription? getIcon();
     method public androidx.glance.template.TemplateText getText();
-    property public final androidx.glance.template.ActionBlock? actionBlock;
     property public final androidx.glance.template.TemplateImageWithDescription? icon;
     property public final androidx.glance.template.TemplateText text;
   }
diff --git a/glance/glance/src/androidMain/kotlin/androidx/glance/template/GlanceTemplate.kt b/glance/glance/src/androidMain/kotlin/androidx/glance/template/GlanceTemplate.kt
index a3df630..2b6996e 100644
--- a/glance/glance/src/androidMain/kotlin/androidx/glance/template/GlanceTemplate.kt
+++ b/glance/glance/src/androidMain/kotlin/androidx/glance/template/GlanceTemplate.kt
@@ -264,17 +264,14 @@
  *
  * @param text The header text.
  * @param icon The header image icon.
- * @param actionBlock The header action buttons.
  */
 class HeaderBlock(
     val text: TemplateText,
     val icon: TemplateImageWithDescription? = null,
-    val actionBlock: ActionBlock? = null,
 ) {
     override fun hashCode(): Int {
         var result = text.hashCode()
         result = 31 * result + (icon?.hashCode() ?: 0)
-        result = 31 * result + (actionBlock?.hashCode() ?: 0)
         return result
     }
 
@@ -286,7 +283,6 @@
 
         if (text != other.text) return false
         if (icon != other.icon) return false
-        if (actionBlock != other.actionBlock) return false
 
         return true
     }
diff --git a/glance/glance/src/test/kotlin/androidx/glance/color/ColorProvidersTest.kt b/glance/glance/src/test/kotlin/androidx/glance/color/ColorProvidersTest.kt
index 370949f..a8bdf7a 100644
--- a/glance/glance/src/test/kotlin/androidx/glance/color/ColorProvidersTest.kt
+++ b/glance/glance/src/test/kotlin/androidx/glance/color/ColorProvidersTest.kt
@@ -21,7 +21,7 @@
 import androidx.annotation.ColorRes
 import androidx.core.content.ContextCompat
 import androidx.test.core.app.ApplicationProvider
-import com.google.common.truth.Truth.assertThat
+import com.google.common.truth.Truth.assertWithMessage
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.robolectric.RobolectricTestRunner
@@ -33,6 +33,7 @@
     private val context = ApplicationProvider.getApplicationContext<Context>()
 
     @Test
+    @Config(sdk = [Build.VERSION_CODES.R])
     fun testGlanceMatchMaterial3Colors() {
         val lightColors = mapOf(
             androidx.glance.R.color.glance_colorPrimary to
@@ -94,7 +95,7 @@
     }
 
     @Test
-    @Config(qualifiers = "night")
+    @Config(qualifiers = "night", sdk = [Build.VERSION_CODES.R])
     fun testGlanceMatchMaterial3NightColors() {
         val darkColors = mapOf(
             androidx.glance.R.color.glance_colorPrimary to
@@ -280,8 +281,17 @@
     }
 
     private fun assertColor(@ColorRes source: Int, @ColorRes target: Int) {
-        assertThat(ContextCompat.getColor(context, source)).isEqualTo(
-            ContextCompat.getColor(context, target)
-        )
+        val sourceColor = ContextCompat.getColor(context, source)
+        val targetColor = ContextCompat.getColor(context, target)
+
+        val sourceHex = String.format("0x%08X", sourceColor)
+        val targetHex = String.format("0x%08X", targetColor)
+
+        val sourceName = context.resources.getResourceEntryName(source)
+        val targetName = context.resources.getResourceEntryName(target)
+
+        val message = "$sourceName is $sourceHex but $targetName is $targetHex"
+
+        assertWithMessage(message).that(sourceColor).isEqualTo(targetColor)
     }
 }
\ No newline at end of file
diff --git a/graphics/graphics-core/api/current.txt b/graphics/graphics-core/api/current.txt
index 1fe1a05..781c97c 100644
--- a/graphics/graphics-core/api/current.txt
+++ b/graphics/graphics-core/api/current.txt
@@ -28,7 +28,11 @@
     method public boolean awaitForever();
     method public void close();
     method public static androidx.graphics.lowlatency.SyncFenceCompat createNativeSyncFence(androidx.graphics.opengl.egl.EGLSpec egl);
+    method @RequiresApi(android.os.Build.VERSION_CODES.O) public long getSignalTime();
+    method public boolean isValid();
     field public static final androidx.graphics.lowlatency.SyncFenceCompat.Companion Companion;
+    field public static final long SIGNAL_TIME_INVALID = -1L; // 0xffffffffffffffffL
+    field public static final long SIGNAL_TIME_PENDING = 9223372036854775807L; // 0x7fffffffffffffffL
   }
 
   public static final class SyncFenceCompat.Companion {
diff --git a/graphics/graphics-core/api/public_plus_experimental_current.txt b/graphics/graphics-core/api/public_plus_experimental_current.txt
index 1fe1a05..781c97c 100644
--- a/graphics/graphics-core/api/public_plus_experimental_current.txt
+++ b/graphics/graphics-core/api/public_plus_experimental_current.txt
@@ -28,7 +28,11 @@
     method public boolean awaitForever();
     method public void close();
     method public static androidx.graphics.lowlatency.SyncFenceCompat createNativeSyncFence(androidx.graphics.opengl.egl.EGLSpec egl);
+    method @RequiresApi(android.os.Build.VERSION_CODES.O) public long getSignalTime();
+    method public boolean isValid();
     field public static final androidx.graphics.lowlatency.SyncFenceCompat.Companion Companion;
+    field public static final long SIGNAL_TIME_INVALID = -1L; // 0xffffffffffffffffL
+    field public static final long SIGNAL_TIME_PENDING = 9223372036854775807L; // 0x7fffffffffffffffL
   }
 
   public static final class SyncFenceCompat.Companion {
diff --git a/graphics/graphics-core/api/restricted_current.txt b/graphics/graphics-core/api/restricted_current.txt
index d2ba87f..141298c 100644
--- a/graphics/graphics-core/api/restricted_current.txt
+++ b/graphics/graphics-core/api/restricted_current.txt
@@ -28,7 +28,11 @@
     method public boolean awaitForever();
     method public void close();
     method public static androidx.graphics.lowlatency.SyncFenceCompat createNativeSyncFence(androidx.graphics.opengl.egl.EGLSpec egl);
+    method @RequiresApi(android.os.Build.VERSION_CODES.O) public long getSignalTime();
+    method public boolean isValid();
     field public static final androidx.graphics.lowlatency.SyncFenceCompat.Companion Companion;
+    field public static final long SIGNAL_TIME_INVALID = -1L; // 0xffffffffffffffffL
+    field public static final long SIGNAL_TIME_PENDING = 9223372036854775807L; // 0x7fffffffffffffffL
   }
 
   public static final class SyncFenceCompat.Companion {
diff --git a/graphics/graphics-core/src/androidTest/java/androidx/graphics/lowlatency/LineRenderer.kt b/graphics/graphics-core/src/androidTest/java/androidx/graphics/lowlatency/LineRenderer.kt
new file mode 100644
index 0000000..e80f18e
--- /dev/null
+++ b/graphics/graphics-core/src/androidTest/java/androidx/graphics/lowlatency/LineRenderer.kt
@@ -0,0 +1,166 @@
+/*
+ * Copyright 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 androidx.graphics.lowlatency
+
+import android.opengl.GLES20
+import java.nio.ByteBuffer
+import java.nio.ByteOrder
+import java.nio.FloatBuffer
+import org.junit.Assert.assertEquals
+
+/**
+ * OpenGL Renderer class responsible for drawing lines
+ */
+class LineRenderer {
+
+    private var mVertexShader: Int = -1
+    private var mFragmentShader: Int = -1
+    private var mGlProgram: Int = -1
+
+    private var mPositionHandle: Int = -1
+    private var mMvpMatrixHandle: Int = -1
+
+    private var mVertexBuffer: FloatBuffer? = null
+    private val mLineCoords = FloatArray(6)
+
+    fun initialize() {
+        release()
+        mVertexShader = loadShader(GLES20.GL_VERTEX_SHADER, VertexShaderCode)
+        mFragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, FragmentShaderCode)
+
+        mGlProgram = GLES20.glCreateProgram()
+        assertEquals(GLES20.GL_NO_ERROR, GLES20.glGetError())
+
+        GLES20.glAttachShader(mGlProgram, mVertexShader)
+        assertEquals(GLES20.GL_NO_ERROR, GLES20.glGetError())
+        GLES20.glAttachShader(mGlProgram, mFragmentShader)
+        assertEquals(GLES20.GL_NO_ERROR, GLES20.glGetError())
+
+        GLES20.glLinkProgram(mGlProgram)
+        assertEquals(GLES20.GL_NO_ERROR, GLES20.glGetError())
+
+        val bb: ByteBuffer =
+            ByteBuffer.allocateDirect( // (number of coordinate values * 4 bytes per float)
+                LineCoordsSize * 4
+            )
+        // use the device hardware's native byte order
+        bb.order(ByteOrder.nativeOrder())
+
+        // create a floating point buffer from the ByteBuffer
+        mVertexBuffer = bb.asFloatBuffer().apply {
+            put(mLineCoords)
+            position(0)
+        }
+
+        mPositionHandle = GLES20.glGetAttribLocation(mGlProgram, vPosition)
+        assertEquals(GLES20.GL_NO_ERROR, GLES20.glGetError())
+
+        mMvpMatrixHandle = GLES20.glGetUniformLocation(mGlProgram, uMVPMatrix)
+        assertEquals(GLES20.GL_NO_ERROR, GLES20.glGetError())
+    }
+
+    fun release() {
+        if (mVertexShader != -1) {
+            GLES20.glDeleteShader(mVertexShader)
+            mVertexShader = -1
+        }
+
+        if (mFragmentShader != -1) {
+            GLES20.glDeleteShader(mFragmentShader)
+            mFragmentShader = -1
+        }
+
+        if (mGlProgram != -1) {
+            GLES20.glDeleteProgram(mGlProgram)
+            mGlProgram = -1
+        }
+    }
+
+    fun drawLines(mvpMatrix: FloatArray, lines: FloatArray) {
+        assertEquals(GLES20.GL_NO_ERROR, GLES20.glGetError())
+        GLES20.glUseProgram(mGlProgram)
+
+        val buff = FloatBuffer.allocate(2)
+        GLES20.glGetFloatv(GLES20.GL_ALIASED_LINE_WIDTH_RANGE, buff)
+        GLES20.glLineWidth(100.0f)
+
+        GLES20.glEnableVertexAttribArray(mPositionHandle)
+
+        GLES20.glUniformMatrix4fv(mMvpMatrixHandle, 1, false, mvpMatrix, 0)
+
+        mVertexBuffer?.let { buffer ->
+            for (i in 0 until lines.size step 4) {
+                mLineCoords[0] = lines[i]
+                mLineCoords[1] = lines[i + 1]
+                mLineCoords[2] = 0f
+                mLineCoords[3] = lines[i + 2]
+                mLineCoords[4] = lines[i + 3]
+                mLineCoords[5] = 0f
+                buffer.put(mLineCoords)
+                buffer.position(0)
+            }
+
+            // Prepare the triangle coordinate data
+            GLES20.glVertexAttribPointer(
+                mPositionHandle, CoordsPerVertex,
+                GLES20.GL_FLOAT, false,
+                VertexStride, buffer
+            )
+            GLES20.glDrawArrays(GLES20.GL_LINES, 0, VertexCount)
+
+            GLES20.glDisableVertexAttribArray(mPositionHandle)
+            assertEquals(GLES20.GL_NO_ERROR, GLES20.glGetError())
+        }
+    }
+
+    companion object {
+
+        const val CoordsPerVertex = 3
+        const val LineCoordsSize = 6
+        private val VertexCount: Int = LineCoordsSize / CoordsPerVertex
+        private val VertexStride: Int = CoordsPerVertex * 4 // 4 bytes per vertex
+
+        private const val uMVPMatrix = "uMVPMatrix"
+        private const val vPosition = "vPosition"
+        private const val VertexShaderCode =
+            """
+                uniform mat4 $uMVPMatrix;
+                attribute vec4 $vPosition;
+                void main() { // the matrix must be included as a modifier of gl_Position
+                  gl_Position = $uMVPMatrix * $vPosition;
+                }
+            """
+
+        private const val FragmentShaderCode =
+            """
+                precision highp float;
+
+                void main() {
+                    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0);
+                }
+            """
+
+        fun loadShader(type: Int, shaderCode: String?): Int {
+            val shader = GLES20.glCreateShader(type)
+
+            GLES20.glShaderSource(shader, shaderCode)
+            GLES20.glCompileShader(shader)
+
+            return shader
+        }
+    }
+}
\ No newline at end of file
diff --git a/graphics/graphics-core/src/androidTest/java/androidx/graphics/lowlatency/SyncStrategyTest.kt b/graphics/graphics-core/src/androidTest/java/androidx/graphics/lowlatency/SyncStrategyTest.kt
new file mode 100644
index 0000000..d836469
--- /dev/null
+++ b/graphics/graphics-core/src/androidTest/java/androidx/graphics/lowlatency/SyncStrategyTest.kt
@@ -0,0 +1,122 @@
+/*
+ * Copyright 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 androidx.graphics.lowlatency
+
+import android.opengl.EGL14
+import android.os.Build
+import androidx.annotation.RequiresApi
+import androidx.graphics.opengl.egl.EGLConfigAttributes
+import androidx.graphics.opengl.egl.EGLManager
+import androidx.graphics.opengl.egl.EGLSpec
+import androidx.graphics.opengl.egl.EGLVersion
+import androidx.graphics.opengl.egl.supportsNativeAndroidFence
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import org.junit.Assert
+import org.junit.Assert.assertTrue
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+@SmallTest
+class SyncStrategyTest {
+    @RequiresApi(Build.VERSION_CODES.O)
+    @Test
+    fun testSyncStrategy_Always() {
+        val egl = createAndSetupEGLManager(EGLSpec.V14)
+        if (egl.supportsNativeAndroidFence()) {
+            val strategy = SyncStrategy.ALWAYS
+            val fence = strategy.createSyncFence(egl.eglSpec)
+            assertTrue(fence != null)
+            fence?.close()
+        }
+    }
+
+    @RequiresApi(Build.VERSION_CODES.Q)
+    @Test
+    fun testSyncStrategy_onFirstShow_FrontBufferUsageOff_Invisible() {
+        val egl = createAndSetupEGLManager(EGLSpec.V14)
+        if (egl.supportsNativeAndroidFence()) {
+            val strategy = FrontBufferSyncStrategy(false)
+            val fence = strategy.createSyncFence(EGLSpec.V14)
+            assertTrue(fence != null)
+            fence?.close()
+        }
+    }
+
+    @RequiresApi(Build.VERSION_CODES.Q)
+    @Test
+    fun testSyncStrategy_onFirstShow_FrontBufferUsageOff_Visible() {
+        val egl = createAndSetupEGLManager(EGLSpec.V14)
+        if (egl.supportsNativeAndroidFence()) {
+            val strategy = FrontBufferSyncStrategy(false)
+            strategy.setVisible(true)
+            val fence = strategy.createSyncFence(EGLSpec.V14)
+            assertTrue(fence == null)
+            fence?.close()
+        }
+    }
+
+    @RequiresApi(Build.VERSION_CODES.Q)
+    @Test
+    fun testSyncStrategy_onFirstShow_FrontBufferUsageOn_Invisible() {
+        val egl = createAndSetupEGLManager(EGLSpec.V14)
+        if (egl.supportsNativeAndroidFence()) {
+            val strategy = FrontBufferSyncStrategy(true)
+            val fence = strategy.createSyncFence(egl.eglSpec)
+            assertTrue(fence != null)
+            fence?.close()
+        }
+    }
+
+    @RequiresApi(Build.VERSION_CODES.Q)
+    @Test
+    fun testSyncStrategy_onFirstShow_FrontBufferUsageOn_Visible() {
+        val egl = createAndSetupEGLManager(EGLSpec.V14)
+        if (egl.supportsNativeAndroidFence()) {
+            val strategy = FrontBufferSyncStrategy(true)
+            strategy.setVisible(true)
+            val fence = strategy.createSyncFence(EGLSpec.V14)
+            assertTrue(fence == null)
+            fence?.close()
+        }
+    }
+
+    // Helper method to create and initialize an EGLManager
+    fun createAndSetupEGLManager(eglSpec: EGLSpec = EGLSpec.V14): EGLManager {
+        val egl = EGLManager(eglSpec)
+        Assert.assertEquals(EGLVersion.Unknown, egl.eglVersion)
+        Assert.assertEquals(EGL14.EGL_NO_CONTEXT, egl.eglContext)
+
+        egl.initialize()
+
+        val config = egl.loadConfig(EGLConfigAttributes.RGBA_8888)
+        if (config == null) {
+            Assert.fail("Config 888 should be supported")
+        }
+
+        egl.createContext(config!!)
+        return egl
+    }
+
+    // Helper method to release EGLManager
+    fun releaseEGLManager(egl: EGLManager) {
+        egl.release()
+        Assert.assertEquals(EGLVersion.Unknown, egl.eglVersion)
+        Assert.assertEquals(EGL14.EGL_NO_CONTEXT, egl.eglContext)
+    }
+}
\ No newline at end of file
diff --git a/graphics/graphics-core/src/androidTest/java/androidx/graphics/opengl/GLRendererTest.kt b/graphics/graphics-core/src/androidTest/java/androidx/graphics/opengl/GLRendererTest.kt
index 7831516..b89bbad0 100644
--- a/graphics/graphics-core/src/androidTest/java/androidx/graphics/opengl/GLRendererTest.kt
+++ b/graphics/graphics-core/src/androidTest/java/androidx/graphics/opengl/GLRendererTest.kt
@@ -27,6 +27,7 @@
 import android.opengl.EGL14
 import android.opengl.EGLSurface
 import android.opengl.GLES20
+import android.opengl.Matrix
 import android.os.Build
 import android.os.Handler
 import android.os.HandlerThread
@@ -37,6 +38,7 @@
 import androidx.annotation.RequiresApi
 import androidx.annotation.WorkerThread
 import androidx.graphics.lowlatency.HardwareBufferRenderer
+import androidx.graphics.lowlatency.LineRenderer
 import androidx.graphics.lowlatency.RenderBuffer
 import androidx.graphics.lowlatency.SyncFenceCompat
 import androidx.graphics.opengl.egl.EGLManager
@@ -63,7 +65,6 @@
 @RunWith(AndroidJUnit4::class)
 @SmallTest
 class GLRendererTest {
-
     @Test
     fun testStartAfterStop() {
         with(GLRenderer()) {
@@ -812,6 +813,7 @@
         val teardownLatch = CountDownLatch(1)
         val glRenderer = GLRenderer().apply { start() }
         var renderBuffer: RenderBuffer? = null
+        var status: Boolean? = false
 
         val callbacks = object : HardwareBufferRenderer.RenderCallbacks {
             override fun obtainRenderBuffer(egl: EGLSpec): RenderBuffer =
@@ -832,7 +834,11 @@
                 GLES20.glFlush()
             }
 
-            override fun onDrawComplete(renderBuffer: RenderBuffer) {
+            override fun onDrawComplete(
+                renderBuffer: RenderBuffer,
+                syncFenceCompat: SyncFenceCompat?
+            ) {
+                status = syncFenceCompat?.await(3000)
                 renderLatch.countDown()
             }
         }
@@ -846,6 +852,11 @@
         var hardwareBuffer: HardwareBuffer? = null
         try {
             assertTrue(renderLatch.await(3000, TimeUnit.MILLISECONDS))
+            assert(status != null)
+            status?.let {
+                assertTrue(it)
+            }
+
             hardwareBuffer = renderBuffer?.hardwareBuffer
             if (hardwareBuffer != null) {
                 val colorSpace = ColorSpace.get(ColorSpace.Named.LINEAR_SRGB)
@@ -869,6 +880,114 @@
         }
     }
 
+    @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.Q)
+    fun testHardwareBufferRendererWithSyncFence() {
+        if (!deviceSupportsNativeAndroidFence()) {
+            // If the Android device does not support the corresponding
+            // EGL Extensions to obtain native Android fence objects from EGLSync
+            // instances then skip this test as we cannot guarantee consistency
+            // for front buffered rendering
+            return
+        }
+
+        val width = 10
+        val height = 10
+        val renderLatch = CountDownLatch(1)
+        val teardownLatch = CountDownLatch(1)
+
+        val glRenderer = GLRenderer().apply { start() }
+        var startTime = Long.MAX_VALUE
+        var signalTime = 0L
+
+        val renderer =
+            object : HardwareBufferRenderer.RenderCallbacks, GLRenderer.EGLContextCallback {
+                private val mMVPMatrix = FloatArray(16)
+                private val mLines = FloatArray(4)
+                private val mLineRenderer = LineRenderer()
+                var mRenderBuffer: RenderBuffer? = null
+
+                @WorkerThread
+                override fun onEGLContextCreated(eglManager: EGLManager) {
+                    mLineRenderer.initialize()
+                }
+
+                @WorkerThread
+                override fun onEGLContextDestroyed(eglManager: EGLManager) {
+                    mLineRenderer.release()
+                }
+
+                @WorkerThread
+                override fun obtainRenderBuffer(egl: EGLSpec): RenderBuffer {
+                    return if (mRenderBuffer != null) {
+                        mRenderBuffer!!
+                    } else {
+                        RenderBuffer(
+                            egl,
+                            HardwareBuffer.create(
+                                width,
+                                height,
+                                HardwareBuffer.RGBA_8888,
+                                1,
+                                HardwareBuffer.USAGE_GPU_SAMPLED_IMAGE
+                            )
+                        ).also { mRenderBuffer = it }
+                    }
+                }
+
+                @WorkerThread
+                override fun onDraw(eglManager: EGLManager) {
+                    startTime = System.nanoTime()
+                    GLES20.glViewport(0, 0, width, height)
+                    assertEquals(GLES20.GL_NO_ERROR, GLES20.glGetError())
+                    Matrix.orthoM(mMVPMatrix, 0, 0f, width.toFloat(), 0f, height.toFloat(), -1f, 1f)
+                    mLines[0] = 0f
+                    mLines[1] = 0f
+                    mLines[2] = 5f
+                    mLines[3] = 5f
+                    mLineRenderer.drawLines(mMVPMatrix, mLines)
+                    assertEquals(GLES20.GL_NO_ERROR, GLES20.glGetError())
+                }
+
+                @WorkerThread
+                override fun onDrawComplete(
+                    renderBuffer: RenderBuffer,
+                    syncFenceCompat: SyncFenceCompat?
+                ) {
+                    assertNotNull(syncFenceCompat)
+                    assertTrue(syncFenceCompat!!.isValid())
+
+                    assertEquals(GLES20.GL_NO_ERROR, GLES20.glGetError())
+
+                    assertTrue(syncFenceCompat.await(3000))
+                    signalTime = syncFenceCompat.getSignalTime()
+
+                    renderLatch.countDown()
+                    assertTrue(syncFenceCompat.getSignalTime() < System.nanoTime())
+                    assertTrue(syncFenceCompat.getSignalTime() > startTime)
+                }
+            }
+
+        glRenderer.registerEGLContextCallback(renderer)
+        val hwBufferRenderer = HardwareBufferRenderer(renderer)
+        val renderTarget =
+            glRenderer.createRenderTarget(width, height, hwBufferRenderer)
+
+        renderTarget.requestRender()
+        assertEquals(GLES20.GL_NO_ERROR, GLES20.glGetError())
+
+        try {
+            assertTrue(renderLatch.await(3000, TimeUnit.MILLISECONDS))
+            assertTrue(startTime < signalTime)
+            assertTrue(signalTime < System.nanoTime())
+        } finally {
+            glRenderer.stop(true) {
+                teardownLatch.countDown()
+            }
+            assertTrue(teardownLatch.await(3000, TimeUnit.MILLISECONDS))
+        }
+    }
+
     /**
      * Helper method to create a GLTestActivity instance and progress it through the Activity
      * lifecycle to the resumed state so we can issue rendering commands into the corresponding
diff --git a/graphics/graphics-core/src/androidTest/java/androidx/graphics/opengl/SyncFenceCompatTest.kt b/graphics/graphics-core/src/androidTest/java/androidx/graphics/opengl/SyncFenceCompatTest.kt
index cac758d..60c06e7 100644
--- a/graphics/graphics-core/src/androidTest/java/androidx/graphics/opengl/SyncFenceCompatTest.kt
+++ b/graphics/graphics-core/src/androidTest/java/androidx/graphics/opengl/SyncFenceCompatTest.kt
@@ -26,7 +26,9 @@
 import androidx.graphics.opengl.egl.EGLSpec
 import androidx.graphics.opengl.egl.EGLVersion
 import androidx.graphics.opengl.egl.supportsNativeAndroidFence
+import androidx.hardware.SyncFence
 import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SdkSuppress
 import androidx.test.filters.SmallTest
 import org.junit.Assert.assertEquals
 import org.junit.Assert.assertTrue
@@ -36,26 +38,28 @@
 
 @RunWith(AndroidJUnit4::class)
 @SmallTest
-@RequiresApi(Build.VERSION_CODES.KITKAT)
+@RequiresApi(Build.VERSION_CODES.O)
 class SyncFenceCompatTest {
     @Test
-    fun testRenderFenceCreate() {
+    fun testSyncFenceCompat_Create() {
         testEglManager {
             initializeWithDefaultConfig()
             if (supportsNativeAndroidFence()) {
                 val syncFenceCompat = SyncFenceCompat.createNativeSyncFence(this.eglSpec)
+                assert(syncFenceCompat.isValid())
                 syncFenceCompat.close()
             }
         }
     }
 
     @Test
-    fun testRenderFenceAwait() {
+    fun testSyncFenceCompat_Await() {
         testEglManager {
             initializeWithDefaultConfig()
             if (supportsNativeAndroidFence()) {
 
                 val syncFenceCompat = SyncFenceCompat.createNativeSyncFence(this.eglSpec)
+                assert(syncFenceCompat.isValid())
                 GLES20.glFlush()
                 assertTrue(syncFenceCompat.await(1000))
 
@@ -65,13 +69,12 @@
     }
 
     @Test
-    fun testRenderFenceAwaitForever() {
+    fun testSyncFenceCompat_AwaitForever() {
         testEglManager {
             initializeWithDefaultConfig()
             if (supportsNativeAndroidFence()) {
-
                 val syncFenceCompat = SyncFenceCompat.createNativeSyncFence(this.eglSpec)
-                GLES20.glFlush()
+                assert(syncFenceCompat.isValid())
                 assertTrue(syncFenceCompat.awaitForever())
 
                 syncFenceCompat.close()
@@ -79,6 +82,26 @@
         }
     }
 
+    @Test
+    @SdkSuppress(minSdkVersion = Build.VERSION_CODES.O)
+    fun testSyncFenceCompat_SignalTime() {
+        testEglManager {
+            initializeWithDefaultConfig()
+            if (supportsNativeAndroidFence()) {
+                val start = System.nanoTime()
+                val syncFenceCompat = SyncFenceCompat.createNativeSyncFence(this.eglSpec)
+                assertTrue(syncFenceCompat.isValid())
+                assertTrue(syncFenceCompat.getSignalTime() != SyncFence.SIGNAL_TIME_INVALID)
+                assertTrue(syncFenceCompat.awaitForever())
+
+                assertTrue(syncFenceCompat.getSignalTime() > start)
+                assertTrue(syncFenceCompat.getSignalTime() != SyncFenceCompat.SIGNAL_TIME_PENDING)
+
+                syncFenceCompat.close()
+            }
+        }
+    }
+
     // Helper method used in testing to initialize EGL and default
     // EGLConfig to the ARGB8888 configuration
     private fun EGLManager.initializeWithDefaultConfig() {
diff --git a/graphics/graphics-core/src/androidTest/java/androidx/graphics/surface/SurfaceControlCompatTest.kt b/graphics/graphics-core/src/androidTest/java/androidx/graphics/surface/SurfaceControlCompatTest.kt
index 8f7fec9..c4dd258 100644
--- a/graphics/graphics-core/src/androidTest/java/androidx/graphics/surface/SurfaceControlCompatTest.kt
+++ b/graphics/graphics-core/src/androidTest/java/androidx/graphics/surface/SurfaceControlCompatTest.kt
@@ -295,8 +295,8 @@
                         // Buffer colorspace is RGBA, so Color.BLUE will be visually Red
                         val buffer =
                             SurfaceControlUtils.getSolidBuffer(
-                                it.DEFAULT_WIDTH,
-                                it.DEFAULT_HEIGHT,
+                                SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                                SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT,
                                 Color.BLUE
                             )
                         assertNotNull(buffer)
@@ -343,16 +343,16 @@
                         // Buffer colorspace is RGBA, so Color.BLUE will be visually Red
                         val buffer =
                             SurfaceControlUtils.getSolidBuffer(
-                                it.DEFAULT_WIDTH,
-                                it.DEFAULT_HEIGHT,
+                                SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                                SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT,
                                 Color.BLUE
                             )
                         assertNotNull(buffer)
 
                         val buffer2 =
                             SurfaceControlUtils.getSolidBuffer(
-                                it.DEFAULT_WIDTH,
-                                it.DEFAULT_HEIGHT,
+                                SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                                SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT,
                                 Color.GREEN
                             )
                         assertNotNull(buffer2)
@@ -387,6 +387,114 @@
     }
 
     @Test
+    fun testTransactionSetBuffer_nullFence() {
+        val scenario = ActivityScenario.launch(SurfaceControlWrapperTestActivity::class.java)
+            .moveToState(
+                Lifecycle.State.CREATED
+            ).onActivity {
+                val callback = object : SurfaceHolderCallback() {
+                    override fun surfaceCreated(sh: SurfaceHolder) {
+                        val scCompat = SurfaceControlCompat
+                            .Builder()
+                            .setParent(it.getSurfaceView())
+                            .setName("SurfaceControlCompatTest")
+                            .build()
+
+                        // Buffer colorspace is RGBA, so Color.BLUE will be visually Red
+                        val buffer =
+                            SurfaceControlUtils.getSolidBuffer(
+                                SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                                SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT,
+                                Color.BLUE
+                            )
+                        assertNotNull(buffer)
+
+                        SurfaceControlCompat.Transaction()
+                            .setBuffer(scCompat, buffer, null)
+                            .setVisibility(
+                                scCompat,
+                                true
+                            ).commit()
+                    }
+                }
+
+                it.addSurface(it.mSurfaceView, callback)
+            }
+
+        scenario.moveToState(Lifecycle.State.RESUMED).onActivity {
+            SurfaceControlUtils.validateOutput { bitmap ->
+                val coord = intArrayOf(0, 0)
+                it.mSurfaceView.getLocationOnScreen(coord)
+                Color.RED == bitmap.getPixel(coord[0], coord[1])
+            }
+        }
+    }
+
+    @Test
+    fun testTransactionSetBuffer_simpleFence() {
+        var eglManager: EGLManager? = null
+        val scenario = ActivityScenario.launch(SurfaceControlWrapperTestActivity::class.java)
+            .moveToState(
+                Lifecycle.State.CREATED
+            ).onActivity {
+                val manager = EGLManager().apply {
+                    initialize()
+                    val config = loadConfig(EGLConfigAttributes.RGBA_8888)
+                    if (config == null) {
+                        fail("Config 8888 should be supported")
+                    }
+                    createContext(config!!)
+                }
+                eglManager = manager
+
+                val callback = object : SurfaceHolderCallback() {
+                    override fun surfaceCreated(sh: SurfaceHolder) {
+                        val scCompat = SurfaceControlCompat
+                            .Builder()
+                            .setParent(it.getSurfaceView())
+                            .setName("SurfaceControlCompatTest")
+                            .build()
+
+                        // Buffer colorspace is RGBA, so Color.BLUE will be visually Red
+                        val buffer =
+                            SurfaceControlUtils.getSolidBuffer(
+                                SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                                SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT,
+                                Color.BLUE
+                            )
+                        assertNotNull(buffer)
+
+                        val fence = if (manager.supportsNativeAndroidFence()) {
+                            SyncFenceCompat.createNativeSyncFence(manager.eglSpec)
+                        } else {
+                            null
+                        }
+                        SurfaceControlCompat.Transaction()
+                            .setBuffer(scCompat, buffer, fence)
+                            .setVisibility(
+                                scCompat,
+                                true
+                            ).commit()
+                    }
+                }
+
+                it.addSurface(it.mSurfaceView, callback)
+            }
+
+        scenario.moveToState(Lifecycle.State.RESUMED).onActivity {
+            try {
+                SurfaceControlUtils.validateOutput { bitmap ->
+                    val coord = intArrayOf(0, 0)
+                    it.mSurfaceView.getLocationOnScreen(coord)
+                    Color.RED == bitmap.getPixel(coord[0], coord[1])
+                }
+            } finally {
+                eglManager?.release()
+            }
+        }
+    }
+
+    @Test
     fun testTransactionSetBuffer_nullCallback() {
         val scenario = ActivityScenario.launch(SurfaceControlWrapperTestActivity::class.java)
             .moveToState(
@@ -403,8 +511,8 @@
                         // Buffer colorspace is RGBA, so Color.BLUE will be visually Red
                         val buffer =
                             SurfaceControlUtils.getSolidBuffer(
-                                it.DEFAULT_WIDTH,
-                                it.DEFAULT_HEIGHT,
+                                SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                                SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT,
                                 Color.BLUE
                             )
                         assertNotNull(buffer)
@@ -447,8 +555,8 @@
 
                         val buffer =
                             SurfaceControlUtils.getSolidBuffer(
-                                it.DEFAULT_WIDTH,
-                                it.DEFAULT_HEIGHT,
+                                SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                                SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT,
                                 Color.GREEN
                             )
                         assertNotNull(buffer)
@@ -456,8 +564,8 @@
                         // Buffer colorspace is RGBA, so Color.BLUE will be visually Red
                         val buffer2 =
                             SurfaceControlUtils.getSolidBuffer(
-                                it.DEFAULT_WIDTH,
-                                it.DEFAULT_HEIGHT,
+                                SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                                SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT,
                                 Color.BLUE
                             )
                         assertNotNull(buffer2)
@@ -506,24 +614,24 @@
 
                         val buffer =
                             SurfaceControlUtils.getSolidBuffer(
-                                it.DEFAULT_WIDTH,
-                                it.DEFAULT_HEIGHT,
+                                SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                                SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT,
                                 Color.GREEN
                             )
                         assertNotNull(buffer)
 
                         val buffer2 =
                             SurfaceControlUtils.getSolidBuffer(
-                                it.DEFAULT_WIDTH,
-                                it.DEFAULT_HEIGHT,
+                                SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                                SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT,
                                 Color.GREEN
                             )
                         assertNotNull(buffer2)
 
                         val buffer3 =
                             SurfaceControlUtils.getSolidBuffer(
-                                it.DEFAULT_WIDTH,
-                                it.DEFAULT_HEIGHT,
+                                SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                                SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT,
                                 Color.BLUE
                             )
                         assertNotNull(buffer3)
@@ -562,75 +670,6 @@
     }
 
     @Test
-    fun testTransactionSetBuffer_withSyncFence() {
-        val releaseLatch = CountDownLatch(1)
-        val egl = createAndSetupEGLManager(EGLSpec.V14)
-        if (egl.supportsNativeAndroidFence()) {
-            val syncFenceCompat = SyncFenceCompat.createNativeSyncFence(egl.eglSpec)
-            val scenario = ActivityScenario.launch(SurfaceControlWrapperTestActivity::class.java)
-                .moveToState(
-                    Lifecycle.State.CREATED
-                ).onActivity {
-                    val callback = object : SurfaceHolderCallback() {
-                        override fun surfaceCreated(sh: SurfaceHolder) {
-                            val scCompat = SurfaceControlCompat
-                                .Builder()
-                                .setParent(it.getSurfaceView())
-                                .setName("SurfaceControlCompatTest")
-                                .build()
-
-                            val buffer =
-                                SurfaceControlUtils.getSolidBuffer(
-                                    it.DEFAULT_WIDTH,
-                                    it.DEFAULT_HEIGHT,
-                                    Color.GREEN
-                                )
-                            assertNotNull(buffer)
-
-                            // Buffer colorspace is RGBA, so Color.BLUE will be visually Red
-                            val buffer2 =
-                                SurfaceControlUtils.getSolidBuffer(
-                                    it.DEFAULT_WIDTH,
-                                    it.DEFAULT_HEIGHT,
-                                    Color.BLUE
-                                )
-                            assertNotNull(buffer2)
-
-                            SurfaceControlCompat.Transaction()
-                                .setBuffer(
-                                    scCompat,
-                                    buffer,
-                                    syncFenceCompat,
-                                ) {
-                                    releaseLatch.countDown()
-                                }
-                                .setVisibility(scCompat, true)
-                                .commit()
-                            SurfaceControlCompat.Transaction()
-                                .setBuffer(scCompat, buffer2)
-                                .setVisibility(scCompat, true)
-                                .commit()
-                        }
-                    }
-
-                    it.addSurface(it.mSurfaceView, callback)
-                }
-
-            scenario.moveToState(Lifecycle.State.RESUMED).onActivity {
-                assertTrue(releaseLatch.await(3000, TimeUnit.MILLISECONDS))
-                assertTrue(syncFenceCompat.await(3000))
-                SurfaceControlUtils.validateOutput { bitmap ->
-                    val coord = intArrayOf(0, 0)
-                    it.mSurfaceView.getLocationOnScreen(coord)
-                    Color.RED == bitmap.getPixel(coord[0], coord[1])
-                }
-
-                releaseEGLManager(egl)
-            }
-        }
-    }
-
-    @Test
     fun testTransactionSetVisibility_show() {
         val scenario = ActivityScenario.launch(SurfaceControlWrapperTestActivity::class.java)
             .moveToState(
@@ -647,8 +686,8 @@
                         // Buffer colorspace is RGBA, so Color.BLUE will be visually Red
                         val buffer =
                             SurfaceControlUtils.getSolidBuffer(
-                                it.DEFAULT_WIDTH,
-                                it.DEFAULT_HEIGHT,
+                                SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                                SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT,
                                 Color.BLUE
                             )
                         assertNotNull(buffer)
@@ -691,8 +730,8 @@
                         // Buffer colorspace is RGBA, so Color.BLUE will be visually Red
                         val buffer =
                             SurfaceControlUtils.getSolidBuffer(
-                                it.DEFAULT_WIDTH,
-                                it.DEFAULT_HEIGHT,
+                                SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                                SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT,
                                 Color.BLUE
                             )
                         assertNotNull(buffer)
@@ -743,8 +782,8 @@
                             .setBuffer(
                                 scCompat1,
                                 SurfaceControlUtils.getSolidBuffer(
-                                    it.DEFAULT_WIDTH,
-                                    it.DEFAULT_HEIGHT,
+                                    SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                                    SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT,
                                     Color.BLUE
                                 )
                             )
@@ -753,8 +792,8 @@
                             .setBuffer(
                                 scCompat2,
                                 SurfaceControlUtils.getSolidBuffer(
-                                    it.DEFAULT_WIDTH,
-                                    it.DEFAULT_HEIGHT,
+                                    SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                                    SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT,
                                     Color.GREEN
                                 )
                             )
@@ -800,8 +839,8 @@
                             .setBuffer(
                                 scCompat1,
                                 SurfaceControlUtils.getSolidBuffer(
-                                    it.DEFAULT_WIDTH,
-                                    it.DEFAULT_HEIGHT,
+                                    SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                                    SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT,
                                     Color.GREEN
                                 )
                             )
@@ -810,8 +849,8 @@
                             .setBuffer(
                                 scCompat2,
                                 SurfaceControlUtils.getSolidBuffer(
-                                    it.DEFAULT_WIDTH,
-                                    it.DEFAULT_HEIGHT,
+                                    SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                                    SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT,
                                     Color.BLUE
                                 )
                             )
@@ -857,8 +896,8 @@
                             .setBuffer(
                                 scCompat1,
                                 SurfaceControlUtils.getSolidBuffer(
-                                    it.DEFAULT_WIDTH,
-                                    it.DEFAULT_HEIGHT,
+                                    SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                                    SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT,
                                     Color.BLUE
                                 )
                             )
@@ -867,8 +906,8 @@
                             .setBuffer(
                                 scCompat2,
                                 SurfaceControlUtils.getSolidBuffer(
-                                    it.DEFAULT_WIDTH,
-                                    it.DEFAULT_HEIGHT,
+                                    SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                                    SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT,
                                     Color.GREEN
                                 )
                             )
@@ -907,13 +946,18 @@
                         SurfaceControlCompat.Transaction()
                             .setDamageRegion(
                                 scCompat,
-                                Region(0, 0, it.DEFAULT_WIDTH, it.DEFAULT_HEIGHT)
+                                Region(
+                                    0,
+                                    0,
+                                    SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                                    SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT
+                                )
                             )
                             .setBuffer(
                                 scCompat,
                                 SurfaceControlUtils.getSolidBuffer(
-                                    it.DEFAULT_WIDTH,
-                                    it.DEFAULT_HEIGHT,
+                                    SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                                    SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT,
                                     Color.BLUE
                                 )
                             )
@@ -957,8 +1001,8 @@
                             .setBuffer(
                                 scCompat,
                                 SurfaceControlUtils.getSolidBuffer(
-                                    it.DEFAULT_WIDTH,
-                                    it.DEFAULT_HEIGHT,
+                                    SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                                    SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT,
                                     Color.BLUE
                                 )
                             )
@@ -995,8 +1039,8 @@
 
                         // Buffer colorspace is RGBA, so Color.BLUE will be visually Red
                         val buffer = SurfaceControlUtils.getSolidBuffer(
-                            it.DEFAULT_WIDTH,
-                            it.DEFAULT_HEIGHT,
+                            SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                            SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT,
                             Color.BLUE
                         )
 
@@ -1039,8 +1083,8 @@
 
                         // Buffer colorspace is RGBA, so Color.BLUE will be visually Red
                         val buffer = SurfaceControlUtils.getSolidBuffer(
-                            it.DEFAULT_WIDTH,
-                            it.DEFAULT_HEIGHT,
+                            SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                            SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT,
                             Color.BLUE
                         )
                         SurfaceControlCompat.Transaction()
@@ -1082,8 +1126,8 @@
 
                         // Buffer colorspace is RGBA, so Color.BLUE will be visually Red
                         val buffer = SurfaceControlUtils.getSolidBuffer(
-                            it.DEFAULT_WIDTH,
-                            it.DEFAULT_HEIGHT,
+                            SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                            SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT,
                             Color.BLUE
                         )
                         SurfaceControlCompat.Transaction()
@@ -1141,8 +1185,8 @@
 
                         // Buffer colorspace is RGBA, so Color.BLUE will be visually Red
                         val buffer = SurfaceControlUtils.getSolidBuffer(
-                            it.DEFAULT_WIDTH,
-                            it.DEFAULT_HEIGHT,
+                            SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                            SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT,
                             Color.BLUE
                         )
                         SurfaceControlCompat.Transaction()
@@ -1182,8 +1226,8 @@
 
                         // Buffer colorspace is RGBA, so Color.BLUE will be visually Red
                         val buffer = SurfaceControlUtils.getSolidBuffer(
-                            it.DEFAULT_WIDTH,
-                            it.DEFAULT_HEIGHT,
+                            SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                            SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT,
                             Color.BLUE
                         )
 
diff --git a/graphics/graphics-core/src/androidTest/java/androidx/graphics/surface/SurfaceControlWrapperTest.kt b/graphics/graphics-core/src/androidTest/java/androidx/graphics/surface/SurfaceControlWrapperTest.kt
index 2bafbee..80bfb12 100644
--- a/graphics/graphics-core/src/androidTest/java/androidx/graphics/surface/SurfaceControlWrapperTest.kt
+++ b/graphics/graphics-core/src/androidTest/java/androidx/graphics/surface/SurfaceControlWrapperTest.kt
@@ -315,8 +315,8 @@
                         // Buffer colorspace is RGBA, so Color.BLUE will be visually Red
                         val buffer =
                             SurfaceControlUtils.getSolidBuffer(
-                                it.DEFAULT_WIDTH,
-                                it.DEFAULT_HEIGHT,
+                                SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                                SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT,
                                 Color.BLUE
                             )
                         assertNotNull(buffer)
@@ -372,16 +372,16 @@
                         // Buffer colorspace is RGBA, so Color.BLUE will be visually Red
                         val buffer =
                             SurfaceControlUtils.getSolidBuffer(
-                                it.DEFAULT_WIDTH,
-                                it.DEFAULT_HEIGHT,
+                                SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                                SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT,
                                 Color.BLUE
                             )
                         assertNotNull(buffer)
 
                         val buffer2 =
                             SurfaceControlUtils.getSolidBuffer(
-                                it.DEFAULT_WIDTH,
-                                it.DEFAULT_HEIGHT,
+                                SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                                SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT,
                                 Color.GREEN
                             )
                         assertNotNull(buffer2)
@@ -433,8 +433,8 @@
                         // Buffer colorspace is RGBA, so Color.BLUE will be visually Red
                         val buffer =
                             SurfaceControlUtils.getSolidBuffer(
-                                it.DEFAULT_WIDTH,
-                                it.DEFAULT_HEIGHT,
+                                SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                                SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT,
                                 Color.BLUE
                             )
                         assertNotNull(buffer)
@@ -480,8 +480,8 @@
                         // Buffer colorspace is RGBA, so Color.BLUE will be visually Red
                         val buffer =
                             SurfaceControlUtils.getSolidBuffer(
-                                it.DEFAULT_WIDTH,
-                                it.DEFAULT_HEIGHT,
+                                SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                                SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT,
                                 Color.BLUE
                             )
                         assertNotNull(buffer)
@@ -536,8 +536,8 @@
                             .setBuffer(
                                 scCompat1,
                                 SurfaceControlUtils.getSolidBuffer(
-                                    it.DEFAULT_WIDTH,
-                                    it.DEFAULT_HEIGHT,
+                                    SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                                    SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT,
                                     Color.BLUE
                                 )
                             )
@@ -545,8 +545,8 @@
                             .setBuffer(
                                 scCompat2,
                                 SurfaceControlUtils.getSolidBuffer(
-                                    it.DEFAULT_WIDTH,
-                                    it.DEFAULT_HEIGHT,
+                                    SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                                    SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT,
                                     Color.GREEN
                                 )
                             )
@@ -594,8 +594,8 @@
                             .setBuffer(
                                 scCompat1,
                                 SurfaceControlUtils.getSolidBuffer(
-                                    it.DEFAULT_WIDTH,
-                                    it.DEFAULT_HEIGHT,
+                                    SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                                    SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT,
                                     Color.GREEN
                                 )
                             )
@@ -603,8 +603,8 @@
                             .setBuffer(
                                 scCompat2,
                                 SurfaceControlUtils.getSolidBuffer(
-                                    it.DEFAULT_WIDTH,
-                                    it.DEFAULT_HEIGHT,
+                                    SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                                    SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT,
                                     Color.BLUE
                                 )
                             )
@@ -652,8 +652,8 @@
                             .setBuffer(
                                 scCompat1,
                                 SurfaceControlUtils.getSolidBuffer(
-                                    it.DEFAULT_WIDTH,
-                                    it.DEFAULT_HEIGHT,
+                                    SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                                    SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT,
                                     Color.BLUE
                                 )
                             )
@@ -661,8 +661,8 @@
                             .setBuffer(
                                 scCompat2,
                                 SurfaceControlUtils.getSolidBuffer(
-                                    it.DEFAULT_WIDTH,
-                                    it.DEFAULT_HEIGHT,
+                                    SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                                    SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT,
                                     Color.GREEN
                                 )
                             )
@@ -703,13 +703,18 @@
                             .addTransactionCompletedListener(listener)
                             .setDamageRegion(
                                 scCompat,
-                                Region(0, 0, it.DEFAULT_WIDTH, it.DEFAULT_HEIGHT)
+                                Region(
+                                    0,
+                                    0,
+                                    SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                                    SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT
+                                )
                             )
                             .setBuffer(
                                 scCompat,
                                 SurfaceControlUtils.getSolidBuffer(
-                                    it.DEFAULT_WIDTH,
-                                    it.DEFAULT_HEIGHT,
+                                    SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                                    SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT,
                                     Color.BLUE
                                 )
                             )
@@ -755,8 +760,8 @@
                             .setBuffer(
                                 scCompat,
                                 SurfaceControlUtils.getSolidBuffer(
-                                    it.DEFAULT_WIDTH,
-                                    it.DEFAULT_HEIGHT,
+                                    SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                                    SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT,
                                     Color.BLUE
                                 )
                             )
@@ -798,8 +803,8 @@
                             .setBuffer(
                                 scCompat,
                                 SurfaceControlUtils.getSolidBuffer(
-                                    it.DEFAULT_WIDTH,
-                                    it.DEFAULT_HEIGHT,
+                                    SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                                    SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT,
                                     Color.BLUE
                                 )
                             )
@@ -838,8 +843,8 @@
 
                         // Buffer colorspace is RGBA, so Color.BLUE will be visually Red
                         val buffer = SurfaceControlUtils.getSolidBuffer(
-                            it.DEFAULT_WIDTH,
-                            it.DEFAULT_HEIGHT,
+                            SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                            SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT,
                             Color.BLUE
                         )
                         SurfaceControlWrapper.Transaction()
@@ -883,8 +888,8 @@
 
                         // Buffer colorspace is RGBA, so Color.BLUE will be visually Red
                         val buffer = SurfaceControlUtils.getSolidBuffer(
-                            it.DEFAULT_WIDTH,
-                            it.DEFAULT_HEIGHT,
+                            SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                            SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT,
                             Color.BLUE
                         )
                         SurfaceControlWrapper.Transaction()
@@ -929,8 +934,8 @@
 
                         // Buffer colorspace is RGBA, so Color.BLUE will be visually Red
                         val buffer = SurfaceControlUtils.getSolidBuffer(
-                            it.DEFAULT_WIDTH,
-                            it.DEFAULT_HEIGHT,
+                            SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                            SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT,
                             Color.BLUE
                         )
                         SurfaceControlWrapper.Transaction()
@@ -991,8 +996,8 @@
 
                         // Buffer colorspace is RGBA, so Color.BLUE will be visually Red
                         val buffer = SurfaceControlUtils.getSolidBuffer(
-                            it.DEFAULT_WIDTH,
-                            it.DEFAULT_HEIGHT,
+                            SurfaceControlWrapperTestActivity.DEFAULT_WIDTH,
+                            SurfaceControlWrapperTestActivity.DEFAULT_HEIGHT,
                             Color.BLUE
                         )
                         SurfaceControlWrapper.Transaction()
diff --git a/graphics/graphics-core/src/androidTest/java/androidx/graphics/surface/SurfaceControlWrapperTestActivity.kt b/graphics/graphics-core/src/androidTest/java/androidx/graphics/surface/SurfaceControlWrapperTestActivity.kt
index 962cce7..b99dad2 100644
--- a/graphics/graphics-core/src/androidTest/java/androidx/graphics/surface/SurfaceControlWrapperTestActivity.kt
+++ b/graphics/graphics-core/src/androidTest/java/androidx/graphics/surface/SurfaceControlWrapperTestActivity.kt
@@ -27,8 +27,10 @@
     lateinit var mSurfaceView: SurfaceView
     lateinit var mFrameLayout: FrameLayout
     lateinit var mLayoutParams: FrameLayout.LayoutParams
-    var DEFAULT_WIDTH = 100
-    var DEFAULT_HEIGHT = 100
+    companion object {
+        val DEFAULT_WIDTH = 100
+        val DEFAULT_HEIGHT = 100
+    }
 
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
diff --git a/graphics/graphics-core/src/main/java/androidx/graphics/lowlatency/GLFrontBufferedRenderer.kt b/graphics/graphics-core/src/main/java/androidx/graphics/lowlatency/GLFrontBufferedRenderer.kt
index e623c73..1089720 100644
--- a/graphics/graphics-core/src/main/java/androidx/graphics/lowlatency/GLFrontBufferedRenderer.kt
+++ b/graphics/graphics-core/src/main/java/androidx/graphics/lowlatency/GLFrontBufferedRenderer.kt
@@ -71,7 +71,31 @@
      * be synchronized with the [SurfaceControlCompat.Transaction] to show/hide visibility of the
      * front buffered layer as well as updating double buffered layers
      */
-    private val mCallback = callback
+    private val mCallback = object : Callback<T> by callback {
+        @WorkerThread
+        override fun onDoubleBufferedLayerRenderComplete(
+            frontBufferedLayerSurfaceControl: SurfaceControlCompat,
+            transaction: SurfaceControlCompat.Transaction
+        ) {
+            mFrontBufferSyncStrategy.setVisible(false)
+            callback.onDoubleBufferedLayerRenderComplete(
+                frontBufferedLayerSurfaceControl,
+                transaction
+            )
+        }
+
+        @WorkerThread
+        override fun onFrontBufferedLayerRenderComplete(
+            frontBufferedLayerSurfaceControl: SurfaceControlCompat,
+            transaction: SurfaceControlCompat.Transaction
+        ) {
+            mFrontBufferSyncStrategy.setVisible(true)
+            callback.onFrontBufferedLayerRenderComplete(
+                frontBufferedLayerSurfaceControl,
+                transaction
+            )
+        }
+    }
 
     /**
      * [GLRenderer.EGLContextCallback]s used to release the corresponding [RenderBufferPool]
@@ -157,6 +181,12 @@
     private var mFrontBufferedLayerSurfaceControl: SurfaceControlCompat? = null
 
     /**
+     * [FrontBufferSyncStrategy] used for [HardwareBufferRenderer] to conditionally decide
+     * when to create a [SyncFenceCompat] for transaction calls.
+     */
+    private val mFrontBufferSyncStrategy: FrontBufferSyncStrategy
+
+    /**
      * Width of the layers to render. Only if the size changes to we re-initialize the internal
      * state of the [GLFrontBufferedRenderer]
      */
@@ -200,6 +230,17 @@
      */
     private var mIsReleased = false
 
+    /**
+     * Cached value to store what [HardwareBuffer] usage flags are supported on the device.
+     */
+    private val mHardwareBufferUsageFlags: Long
+
+    /**
+     * Flag to determine if [HardwareBuffer.USAGE_FRONT_BUFFER] is supported or not on
+     * the device
+     */
+    private val mSupportsFrontBufferUsage: Boolean
+
     init {
         mParentRenderLayer.setParentLayerCallbacks(mParentLayerCallback)
         val renderer = if (glRenderer == null) {
@@ -216,6 +257,13 @@
         mDoubleBufferedLayerRenderTarget =
             mParentRenderLayer.createRenderTarget(renderer, mCallback)
         mGLRenderer = renderer
+
+        mHardwareBufferUsageFlags = obtainHardwareBufferUsageFlags()
+
+        mSupportsFrontBufferUsage =
+            (mHardwareBufferUsageFlags and HardwareBuffer.USAGE_FRONT_BUFFER) != 0L
+
+        mFrontBufferSyncStrategy = FrontBufferSyncStrategy(mSupportsFrontBufferUsage)
     }
 
     internal fun update(width: Int, height: Int) {
@@ -233,7 +281,7 @@
                 width,
                 height,
                 format = HardwareBuffer.RGBA_8888,
-                usage = obtainHardwareBufferUsageFlags(),
+                usage = mHardwareBufferUsageFlags,
                 maxPoolSize = 5
             )
 
@@ -289,8 +337,10 @@
             mParentBufferParamQueue.add(param)
             mFrontBufferedRenderTarget?.requestRender()
         } else {
-            Log.w(TAG, "Attempt to render to front buffered layer when " +
-                "GLFrontBufferedRenderer has been released")
+            Log.w(
+                TAG, "Attempt to render to front buffered layer when " +
+                    "GLFrontBufferedRenderer has been released"
+            )
         }
     }
 
@@ -318,8 +368,10 @@
             mDoubleBufferedLayerRenderTarget?.requestRender()
             mFrontBufferedLayerRenderer?.clear()
         } else {
-            Log.w(TAG, "Attempt to render to the double buffered layer when " +
-                "GLFrontBufferedRenderer has been released")
+            Log.w(
+                TAG, "Attempt to render to the double buffered layer when " +
+                    "GLFrontBufferedRenderer has been released"
+            )
         }
     }
 
@@ -393,58 +445,68 @@
 
     private fun createFrontBufferedLayerRenderer(
         frontBufferedLayerSurfaceControl: SurfaceControlCompat
-    ) = HardwareBufferRenderer(
-        object : HardwareBufferRenderer.RenderCallbacks {
+    ): HardwareBufferRenderer {
+        return HardwareBufferRenderer(
+            object : HardwareBufferRenderer.RenderCallbacks {
 
-            @WorkerThread
-            override fun obtainRenderBuffer(egl: EGLSpec): RenderBuffer {
-                var buffer = mFrontLayerBuffer
-                if (buffer == null) {
-                    // Allocate and persist a RenderBuffer instance across frames
-                    buffer = mBufferPool?.obtain(egl).also { mFrontLayerBuffer = it }
-                       ?: throw IllegalArgumentException("Unable to obtain RenderBuffer")
+                @WorkerThread
+                override fun obtainRenderBuffer(egl: EGLSpec): RenderBuffer {
+                    var buffer = mFrontLayerBuffer
+                    if (buffer == null) {
+                        // Allocate and persist a RenderBuffer instance across frames
+                        buffer = mBufferPool?.obtain(egl).also { mFrontLayerBuffer = it }
+                            ?: throw IllegalArgumentException("Unable to obtain RenderBuffer")
+                    }
+                    return buffer
                 }
-                return buffer
-            }
 
-            @WorkerThread
-            override fun onDraw(eglManager: EGLManager) {
-                try {
-                    // Explicitly call remove in order to delineate between scenarios where
-                    // no parameters are provided and the consumer explicitly supports nullable
-                    // parameters.
-                    // If poll was used instead, we would not be able to determine if the nullable
-                    // parameter was because there were no items in the queue or the consumer
-                    // explicitly provided null as a placeholder
-                    mCallback.onDrawFrontBufferedLayer(eglManager, mFrontBufferQueueParams.remove())
-                } catch (_: NoSuchElementException) {
-                    // Skip rendering if we have been told to render but we do not have parameters
-                    // Because the call to render to the front buffer takes in a parameter we should
-                    // not run into this scenario.
+                @WorkerThread
+                override fun onDraw(eglManager: EGLManager) {
+                    try {
+                        // Explicitly call remove in order to delineate between scenarios where
+                        // no parameters are provided and the consumer explicitly supports nullable
+                        // parameters.
+                        // If poll was used instead, we would not be able to determine if the nullable
+                        // parameter was because there were no items in the queue or the consumer
+                        // explicitly provided null as a placeholder
+                        mCallback.onDrawFrontBufferedLayer(
+                            eglManager,
+                            mFrontBufferQueueParams.remove()
+                        )
+                    } catch (_: NoSuchElementException) {
+                        // Skip rendering if we have been told to render but we do not have parameters
+                        // Because the call to render to the front buffer takes in a parameter we should
+                        // not run into this scenario.
+                    }
                 }
-            }
 
-            @WorkerThread
-            override fun onDrawComplete(renderBuffer: RenderBuffer) {
-                val transaction = SurfaceControlCompat.Transaction()
-                    // Make this layer the top most layer
-                    .setLayer(frontBufferedLayerSurfaceControl, Integer.MAX_VALUE)
-                    .setBuffer(
-                        frontBufferedLayerSurfaceControl,
-                        renderBuffer.hardwareBuffer,
-                        null
+                @WorkerThread
+                override fun onDrawComplete(
+                    renderBuffer: RenderBuffer,
+                    syncFenceCompat: SyncFenceCompat?
+                ) {
+                    val transaction = SurfaceControlCompat.Transaction()
+                        // Make this layer the top most layer
+                        .setLayer(frontBufferedLayerSurfaceControl, Integer.MAX_VALUE)
+                        .setBuffer(
+                            frontBufferedLayerSurfaceControl,
+                            renderBuffer.hardwareBuffer,
+                            syncFenceCompat
+                        )
+                        .setVisibility(frontBufferedLayerSurfaceControl, true)
+                    mParentRenderLayer.buildReparentTransaction(
+                        frontBufferedLayerSurfaceControl, transaction
                     )
-                    .setVisibility(frontBufferedLayerSurfaceControl, true)
-                mParentRenderLayer.buildReparentTransaction(
-                    frontBufferedLayerSurfaceControl, transaction)
-                mCallback.onFrontBufferedLayerRenderComplete(
-                    frontBufferedLayerSurfaceControl,
-                    transaction
-                )
-                transaction.commit()
-            }
-        }
-    )
+                    mCallback.onFrontBufferedLayerRenderComplete(
+                        frontBufferedLayerSurfaceControl,
+                        transaction
+                    )
+                    transaction.commit()
+                }
+            },
+            mFrontBufferSyncStrategy
+        )
+    }
 
     private fun clearParamQueues() {
         mFrontBufferQueueParams.clear()
diff --git a/graphics/graphics-core/src/main/java/androidx/graphics/lowlatency/HardwareBufferRenderer.kt b/graphics/graphics-core/src/main/java/androidx/graphics/lowlatency/HardwareBufferRenderer.kt
index 288c3e6..14fb6b9 100644
--- a/graphics/graphics-core/src/main/java/androidx/graphics/lowlatency/HardwareBufferRenderer.kt
+++ b/graphics/graphics-core/src/main/java/androidx/graphics/lowlatency/HardwareBufferRenderer.kt
@@ -34,7 +34,8 @@
  */
 @RequiresApi(Build.VERSION_CODES.O)
 internal class HardwareBufferRenderer(
-    private val hardwareBufferRendererCallbacks: RenderCallbacks
+    private val hardwareBufferRendererCallbacks: RenderCallbacks,
+    private val syncStrategy: SyncStrategy = SyncStrategy.ALWAYS
 ) : GLRenderer.RenderCallback {
 
     private val mClear = AtomicBoolean(false)
@@ -63,13 +64,12 @@
             } else {
                 hardwareBufferRendererCallbacks.onDraw(eglManager)
             }
-            GLES20.glFlush()
-            syncFenceCompat = egl.createNativeSyncFence()
 
-            syncFenceCompat.awaitForever()
+            syncFenceCompat = syncStrategy.createSyncFence(egl)
+
             // At this point the HardwareBuffer has the contents of the GL rendering
             // Create a surface Control transaction to dispatch this request
-            hardwareBufferRendererCallbacks.onDrawComplete(buffer)
+            hardwareBufferRendererCallbacks.onDrawComplete(buffer, syncFenceCompat)
         } finally {
             syncFenceCompat?.close()
         }
@@ -98,6 +98,71 @@
          * Callback when [onDraw] is complete and the contents of the draw
          * are reflected in the corresponding [HardwareBuffer]
          */
-        fun onDrawComplete(renderBuffer: RenderBuffer)
+        fun onDrawComplete(renderBuffer: RenderBuffer, syncFenceCompat: SyncFenceCompat?)
+    }
+}
+
+/**
+ * A strategy class for deciding how to utilize [SyncFenceCompat] within
+ * [HardwareBufferRenderer.RenderCallbacks]. SyncStrategy provides default strategies for
+ * usage:
+ *
+ * [SyncStrategy.ALWAYS] will always create a [SyncFenceCompat] to pass into the render
+ * callbacks for [HardwareBufferRenderer]
+ */
+internal interface SyncStrategy {
+    /**
+     * Conditionally generates a [SyncFenceCompat] based upon implementation.
+     *
+     * @param eglSpec an [EGLSpec] object to dictate the version of EGL and make EGL calls.
+     */
+    fun createSyncFence(eglSpec: EGLSpec): SyncFenceCompat?
+
+    companion object {
+        /**
+         * [SyncStrategy] that will always create a [SyncFenceCompat] object
+         */
+        @JvmField
+        val ALWAYS = object : SyncStrategy {
+            override fun createSyncFence(eglSpec: EGLSpec): SyncFenceCompat? {
+                return eglSpec.createNativeSyncFence()
+            }
+        }
+    }
+}
+
+/**
+ * [SyncStrategy] implementation that optimizes for front buffered rendering use cases.
+ * More specifically this attempts to avoid unnecessary synchronization overhead
+ * wherever possible.
+ *
+ * This will always provide a fence if the corresponding layer transitions from
+ * an invisible to a visible state. If the layer is already visible and front
+ * buffer usage flags are support on the device, then no fence is provided. If this
+ * flag is not supported, then a fence is created and "peeked" to ensure contents
+ * are flushed to the single buffer.
+ */
+internal class FrontBufferSyncStrategy(
+    private val supportsFrontBufferUsage: Boolean
+) : SyncStrategy {
+    private var mFrontBufferVisible: Boolean = false
+
+    fun isVisible(): Boolean = mFrontBufferVisible
+
+    fun setVisible(visibility: Boolean) {
+        mFrontBufferVisible = visibility
+    }
+
+    @RequiresApi(Build.VERSION_CODES.Q)
+    override fun createSyncFence(eglSpec: EGLSpec): SyncFenceCompat? {
+        return if (!isVisible()) {
+            eglSpec.createNativeSyncFence()
+        } else if (supportsFrontBufferUsage) {
+            return null
+        } else {
+            val fence = eglSpec.createNativeSyncFence()
+            fence.close()
+            return null
+        }
     }
 }
\ No newline at end of file
diff --git a/graphics/graphics-core/src/main/java/androidx/graphics/lowlatency/SurfaceViewRenderLayer.kt b/graphics/graphics-core/src/main/java/androidx/graphics/lowlatency/SurfaceViewRenderLayer.kt
index 460209b..22fd3f29 100644
--- a/graphics/graphics-core/src/main/java/androidx/graphics/lowlatency/SurfaceViewRenderLayer.kt
+++ b/graphics/graphics-core/src/main/java/androidx/graphics/lowlatency/SurfaceViewRenderLayer.kt
@@ -81,14 +81,17 @@
                 }
 
                 @RequiresApi(Build.VERSION_CODES.TIRAMISU)
-                override fun onDrawComplete(renderBuffer: RenderBuffer) {
+                override fun onDrawComplete(
+                    renderBuffer: RenderBuffer,
+                    syncFenceCompat: SyncFenceCompat?
+                ) {
                     val frontBufferedLayerSurfaceControl = mLayerCallback
-                            ?.getFrontBufferedLayerSurfaceControl()
+                        ?.getFrontBufferedLayerSurfaceControl()
                     val sc = mParentSurfaceControl
-                        // At this point the parentSurfaceControl should already be created
-                        // in the surfaceChanged callback, however, if for whatever reason this
-                        // was not the case, create the double buffered SurfaceControl now and cache
-                        // it
+                    // At this point the parentSurfaceControl should already be created
+                    // in the surfaceChanged callback, however, if for whatever reason this
+                    // was not the case, create the double buffered SurfaceControl now and cache
+                    // it
                         ?: createDoubleBufferedSurfaceControl().also {
                             mParentSurfaceControl = it
                         }
@@ -96,7 +99,7 @@
                         val transaction = SurfaceControlCompat.Transaction()
                             .setVisibility(frontBufferedLayerSurfaceControl, false)
                             .setVisibility(sc, true)
-                            .setBuffer(sc, renderBuffer.hardwareBuffer) {
+                            .setBuffer(sc, renderBuffer.hardwareBuffer, syncFenceCompat) {
                                 mLayerCallback?.getRenderBufferPool()?.release(renderBuffer)
                             }
 
@@ -106,11 +109,13 @@
                         )
                         transaction.commit()
                     } else {
-                        Log.e(TAG, "Error, no front buffered SurfaceControl available to " +
-                            "synchronize transaction with")
+                        Log.e(
+                            TAG, "Error, no front buffered SurfaceControl available to " +
+                                "synchronize transaction with"
+                        )
                     }
                 }
-        })
+            })
         surfaceView.holder.addCallback(object : SurfaceHolder.Callback {
 
             override fun surfaceCreated(holder: SurfaceHolder) {
diff --git a/graphics/graphics-core/src/main/java/androidx/graphics/lowlatency/SyncFenceCompat.kt b/graphics/graphics-core/src/main/java/androidx/graphics/lowlatency/SyncFenceCompat.kt
index 149888b..a137794 100644
--- a/graphics/graphics-core/src/main/java/androidx/graphics/lowlatency/SyncFenceCompat.kt
+++ b/graphics/graphics-core/src/main/java/androidx/graphics/lowlatency/SyncFenceCompat.kt
@@ -18,6 +18,7 @@
 
 import android.opengl.EGL14
 import android.opengl.EGL15
+import android.opengl.GLES20
 import android.os.Build
 import androidx.annotation.RequiresApi
 import androidx.graphics.opengl.egl.EGLSpec
@@ -55,12 +56,26 @@
                 val eglSync: EGLSyncKHR =
                     egl.eglCreateSyncKHR(EGLExt.EGL_SYNC_NATIVE_FENCE_ANDROID, null)
                         ?: throw IllegalArgumentException("Unable to create sync object")
+                GLES20.glFlush()
                 val syncFenceCompat = SyncFenceCompat(egl.eglDupNativeFenceFDANDROID(eglSync))
                 egl.eglDestroySyncKHR(eglSync)
 
                 syncFenceCompat
             }
         }
+
+        /**
+         * An invalid signal time. Represents either the signal time for a SyncFence that isn't
+         * valid (that is, [isValid] is `false`), or if an error occurred while attempting to
+         * retrieve the signal time.
+         */
+        const val SIGNAL_TIME_INVALID: Long = -1L
+
+        /**
+         * A pending signal time. This is equivalent to the max value of a long, representing an
+         * infinitely far point in the future.
+         */
+        const val SIGNAL_TIME_PENDING: Long = Long.MAX_VALUE
     }
 
     internal constructor(syncFence: SyncFence) {
@@ -92,6 +107,22 @@
     override fun close() {
         mImpl.close()
     }
+
+    /**
+     * Returns the time that the fence signaled in the [CLOCK_MONOTONIC] time domain.
+     * This returns [SyncFence.SIGNAL_TIME_INVALID] if the SyncFence is invalid.
+     * If the fence hasn't yet signaled, then [SyncFence.SIGNAL_TIME_PENDING] is returned.
+     */
+    @RequiresApi(Build.VERSION_CODES.O)
+    fun getSignalTime(): Long {
+        return mImpl.getSignalTime()
+    }
+
+    /**
+     * Checks if the SyncFence object is valid.
+     * @return `true` if it is valid, `false` otherwise
+     */
+    fun isValid() = mImpl.isValid()
 }
 
 /**
@@ -109,13 +140,15 @@
 @RequiresApi(Build.VERSION_CODES.TIRAMISU)
 internal class SyncFenceCompatVerificationHelper private constructor() {
     companion object {
+        private val mEmptyAttributes = longArrayOf(EGL14.EGL_NONE.toLong())
+
         @RequiresApi(Build.VERSION_CODES.TIRAMISU)
         @androidx.annotation.DoNotInline
         fun createSyncFenceCompatV33(): SyncFenceCompat {
             val display = EGL15.eglGetPlatformDisplay(
                 EGL15.EGL_PLATFORM_ANDROID_KHR,
                 EGL14.EGL_DEFAULT_DISPLAY.toLong(),
-                longArrayOf(EGL14.EGL_NONE.toLong()),
+                mEmptyAttributes,
                 0
             )
             if (display == EGL15.EGL_NO_DISPLAY) {
@@ -129,10 +162,10 @@
             val eglSync = EGL15.eglCreateSync(
                 display,
                 android.opengl.EGLExt.EGL_SYNC_NATIVE_FENCE_ANDROID,
-                longArrayOf(),
+                mEmptyAttributes,
                 0
             )
-
+            GLES20.glFlush()
             val syncFenceCompat = SyncFenceCompat(
                 android.opengl.EGLExt.eglDupNativeFenceFDANDROID(
                     display,
diff --git a/graphics/graphics-core/src/main/java/androidx/graphics/lowlatency/SyncFenceImpl.kt b/graphics/graphics-core/src/main/java/androidx/graphics/lowlatency/SyncFenceImpl.kt
index 66dc871..a0aa066 100644
--- a/graphics/graphics-core/src/main/java/androidx/graphics/lowlatency/SyncFenceImpl.kt
+++ b/graphics/graphics-core/src/main/java/androidx/graphics/lowlatency/SyncFenceImpl.kt
@@ -16,6 +16,10 @@
 
 package androidx.graphics.lowlatency
 
+import android.os.Build
+import androidx.annotation.RequiresApi
+import androidx.hardware.SyncFence
+
 internal interface SyncFenceImpl {
     /**
      * Waits for a [SyncFenceImpl] to signal for up to the timeout duration
@@ -33,4 +37,18 @@
      * Close the [SyncFenceImpl]
      */
     fun close()
+
+    /**
+     * Returns the time that the fence signaled in the [CLOCK_MONOTONIC] time domain.
+     * This returns [SyncFence.SIGNAL_TIME_INVALID] if the SyncFence is invalid.
+     * If the fence hasn't yet signaled, then [SyncFence.SIGNAL_TIME_PENDING] is returned.
+     */
+    @RequiresApi(Build.VERSION_CODES.O)
+    fun getSignalTime(): Long
+
+    /**
+     * Checks if the SyncFence object is valid.
+     * @return `true` if it is valid, `false` otherwise
+     */
+    fun isValid(): Boolean
 }
\ No newline at end of file
diff --git a/graphics/graphics-core/src/main/java/androidx/graphics/lowlatency/SyncFenceV19.kt b/graphics/graphics-core/src/main/java/androidx/graphics/lowlatency/SyncFenceV19.kt
index 1623412..2e29eb5 100644
--- a/graphics/graphics-core/src/main/java/androidx/graphics/lowlatency/SyncFenceV19.kt
+++ b/graphics/graphics-core/src/main/java/androidx/graphics/lowlatency/SyncFenceV19.kt
@@ -44,4 +44,19 @@
     override fun close() {
         mSyncFence.close()
     }
+
+    /**
+     * See [SyncFenceImpl.getSignalTime]
+     */
+    @RequiresApi(Build.VERSION_CODES.O)
+    override fun getSignalTime(): Long {
+        return mSyncFence.getSignalTime()
+    }
+
+    /**
+     * See [SyncFenceImpl.isValid]
+     */
+    override fun isValid(): Boolean {
+        return mSyncFence.isValid()
+    }
 }
\ No newline at end of file
diff --git a/graphics/graphics-core/src/main/java/androidx/graphics/lowlatency/SyncFenceV33.kt b/graphics/graphics-core/src/main/java/androidx/graphics/lowlatency/SyncFenceV33.kt
index abcb1a0..1f039a3 100644
--- a/graphics/graphics-core/src/main/java/androidx/graphics/lowlatency/SyncFenceV33.kt
+++ b/graphics/graphics-core/src/main/java/androidx/graphics/lowlatency/SyncFenceV33.kt
@@ -45,4 +45,19 @@
     override fun close() {
         mSyncFence.close()
     }
+
+    /**
+     * See [SyncFenceImpl.getSignalTime]
+     */
+    override fun getSignalTime(): Long {
+        return mSyncFence.signalTime
+    }
+
+    /**
+     * Checks if the SyncFence object is valid.
+     * @return `true` if it is valid, `false` otherwise
+     */
+    override fun isValid(): Boolean {
+        return mSyncFence.isValid
+    }
 }
\ No newline at end of file
diff --git a/graphics/graphics-core/src/main/java/androidx/hardware/SyncFence.kt b/graphics/graphics-core/src/main/java/androidx/hardware/SyncFence.kt
index 3977a83..3963976 100644
--- a/graphics/graphics-core/src/main/java/androidx/hardware/SyncFence.kt
+++ b/graphics/graphics-core/src/main/java/androidx/hardware/SyncFence.kt
@@ -14,22 +14,6 @@
  * limitations under the License.
  */
 
-/*
- * Copyright 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 androidx.hardware
 
 import android.os.Build
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/datanotification/DataNotification.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/datanotification/DataNotification.kt
index 4e7119b..56eaa75 100644
--- a/health/connect/connect-client/src/main/java/androidx/health/connect/client/datanotification/DataNotification.kt
+++ b/health/connect/connect-client/src/main/java/androidx/health/connect/client/datanotification/DataNotification.kt
@@ -18,8 +18,10 @@
 
 import android.content.Intent
 import androidx.annotation.RestrictTo
-import androidx.health.connect.client.impl.converters.datatype.getRecordType
+import androidx.health.connect.client.impl.converters.datatype.toDataTypeKClass
 import androidx.health.connect.client.records.Record
+import androidx.health.platform.client.proto.DataProto.DataType
+import androidx.health.platform.client.utils.getProtoMessages
 import kotlin.reflect.KClass
 
 /**
@@ -34,7 +36,7 @@
 ) {
 
     companion object {
-        private const val EXTRA_DATA_TYPE_IDS = "com.google.android.healthdata.extra.DATA_TYPE_IDS"
+        private const val EXTRA_DATA_TYPES = "com.google.android.healthdata.extra.DATA_TYPES"
 
         /**
          * Extracts the notification data from the given [intent]. The [Intent] is usually received
@@ -48,11 +50,13 @@
          */
         @JvmStatic
         fun from(intent: Intent): DataNotification? {
-            val dataTypeIds = intent.getIntArrayExtra(EXTRA_DATA_TYPE_IDS) ?: return null
+            val dataTypes =
+                intent.getProtoMessages(name = EXTRA_DATA_TYPES, parser = DataType::parseFrom)
+                    ?: return null
 
             return DataNotification(
-                dataTypes = dataTypeIds.mapTo(HashSet(), ::getRecordType),
+                dataTypes = dataTypes.mapTo(HashSet(), DataType::toDataTypeKClass),
             )
         }
     }
-}
\ No newline at end of file
+}
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/datatype/DataTypeConverter.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/datatype/DataTypeConverter.kt
index 7735e27..7f98528 100644
--- a/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/datatype/DataTypeConverter.kt
+++ b/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/datatype/DataTypeConverter.kt
@@ -35,3 +35,6 @@
 
 fun String.toDataTypeKClass(): KClass<out Record> =
     RECORDS_TYPE_NAME_MAP[this] ?: throw UnsupportedOperationException("Not supported yet: $this")
+
+fun DataType.toDataTypeKClass(): KClass<out Record> =
+    name.toDataTypeKClass()
diff --git a/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/datatype/TypeIdToRecordType.kt b/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/datatype/TypeIdToRecordType.kt
deleted file mode 100644
index 1be6358..0000000
--- a/health/connect/connect-client/src/main/java/androidx/health/connect/client/impl/converters/datatype/TypeIdToRecordType.kt
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright 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 androidx.health.connect.client.impl.converters.datatype
-
-import androidx.health.connect.client.records.ActiveCaloriesBurnedRecord
-import androidx.health.connect.client.records.BasalBodyTemperatureRecord
-import androidx.health.connect.client.records.BasalMetabolicRateRecord
-import androidx.health.connect.client.records.BloodGlucoseRecord
-import androidx.health.connect.client.records.BloodPressureRecord
-import androidx.health.connect.client.records.BodyFatRecord
-import androidx.health.connect.client.records.BodyTemperatureRecord
-import androidx.health.connect.client.records.BodyWaterMassRecord
-import androidx.health.connect.client.records.BoneMassRecord
-import androidx.health.connect.client.records.CervicalMucusRecord
-import androidx.health.connect.client.records.CyclingPedalingCadenceRecord
-import androidx.health.connect.client.records.DistanceRecord
-import androidx.health.connect.client.records.ElevationGainedRecord
-import androidx.health.connect.client.records.ExerciseEventRecord
-import androidx.health.connect.client.records.ExerciseLapRecord
-import androidx.health.connect.client.records.ExerciseRepetitionsRecord
-import androidx.health.connect.client.records.ExerciseSessionRecord
-import androidx.health.connect.client.records.FloorsClimbedRecord
-import androidx.health.connect.client.records.HeartRateRecord
-import androidx.health.connect.client.records.HeartRateVariabilityDifferentialIndexRecord
-import androidx.health.connect.client.records.HeartRateVariabilityRmssdRecord
-import androidx.health.connect.client.records.HeartRateVariabilitySRecord
-import androidx.health.connect.client.records.HeartRateVariabilitySd2Record
-import androidx.health.connect.client.records.HeartRateVariabilitySdannRecord
-import androidx.health.connect.client.records.HeartRateVariabilitySdnnIndexRecord
-import androidx.health.connect.client.records.HeartRateVariabilitySdnnRecord
-import androidx.health.connect.client.records.HeartRateVariabilitySdsdRecord
-import androidx.health.connect.client.records.HeartRateVariabilityTinnRecord
-import androidx.health.connect.client.records.HeightRecord
-import androidx.health.connect.client.records.HipCircumferenceRecord
-import androidx.health.connect.client.records.HydrationRecord
-import androidx.health.connect.client.records.LeanBodyMassRecord
-import androidx.health.connect.client.records.MenstruationFlowRecord
-import androidx.health.connect.client.records.NutritionRecord
-import androidx.health.connect.client.records.OvulationTestRecord
-import androidx.health.connect.client.records.OxygenSaturationRecord
-import androidx.health.connect.client.records.PowerRecord
-import androidx.health.connect.client.records.Record
-import androidx.health.connect.client.records.RespiratoryRateRecord
-import androidx.health.connect.client.records.RestingHeartRateRecord
-import androidx.health.connect.client.records.SexualActivityRecord
-import androidx.health.connect.client.records.SleepSessionRecord
-import androidx.health.connect.client.records.SleepStageRecord
-import androidx.health.connect.client.records.SpeedRecord
-import androidx.health.connect.client.records.StepsCadenceRecord
-import androidx.health.connect.client.records.StepsRecord
-import androidx.health.connect.client.records.SwimmingStrokesRecord
-import androidx.health.connect.client.records.TotalCaloriesBurnedRecord
-import androidx.health.connect.client.records.Vo2MaxRecord
-import androidx.health.connect.client.records.WaistCircumferenceRecord
-import androidx.health.connect.client.records.WeightRecord
-import androidx.health.connect.client.records.WheelchairPushesRecord
-import kotlin.reflect.KClass
-
-internal val TYPE_ID_TO_RECORD_TYPE_MAP: Map<Int, KClass<out Record>> =
-    mapOf(
-        3 to ExerciseEventRecord::class,
-        55 to ExerciseLapRecord::class,
-        4 to ExerciseSessionRecord::class,
-        6 to DistanceRecord::class,
-        7 to ElevationGainedRecord::class,
-        8 to FloorsClimbedRecord::class,
-        9 to HydrationRecord::class,
-        10 to NutritionRecord::class,
-        11 to SleepStageRecord::class,
-        12 to SleepSessionRecord::class,
-        13 to StepsRecord::class,
-        14 to SwimmingStrokesRecord::class,
-        16 to BasalMetabolicRateRecord::class,
-        17 to BloodGlucoseRecord::class,
-        18 to BloodPressureRecord::class,
-        19 to BodyFatRecord::class,
-        20 to BodyTemperatureRecord::class,
-        21 to BoneMassRecord::class,
-        22 to CervicalMucusRecord::class,
-        28 to HeightRecord::class,
-        29 to HipCircumferenceRecord::class,
-        30 to HeartRateVariabilityDifferentialIndexRecord::class,
-        31 to HeartRateVariabilityRmssdRecord::class,
-        32 to HeartRateVariabilitySRecord::class,
-        33 to HeartRateVariabilitySd2Record::class,
-        34 to HeartRateVariabilitySdannRecord::class,
-        35 to HeartRateVariabilitySdnnIndexRecord::class,
-        36 to HeartRateVariabilitySdnnRecord::class,
-        37 to HeartRateVariabilitySdsdRecord::class,
-        38 to HeartRateVariabilityTinnRecord::class,
-        39 to LeanBodyMassRecord::class,
-        41 to MenstruationFlowRecord::class,
-        42 to OvulationTestRecord::class,
-        43 to OxygenSaturationRecord::class,
-        46 to RespiratoryRateRecord::class,
-        47 to RestingHeartRateRecord::class,
-        48 to SexualActivityRecord::class,
-        51 to Vo2MaxRecord::class,
-        52 to WaistCircumferenceRecord::class,
-        53 to WeightRecord::class,
-        54 to ExerciseRepetitionsRecord::class,
-        56 to HeartRateRecord::class,
-        58 to CyclingPedalingCadenceRecord::class,
-        60 to PowerRecord::class,
-        61 to SpeedRecord::class,
-        62 to StepsCadenceRecord::class,
-        63 to WheelchairPushesRecord::class,
-        64 to BodyWaterMassRecord::class,
-        65 to BasalBodyTemperatureRecord::class,
-        66 to TotalCaloriesBurnedRecord::class,
-        67 to ActiveCaloriesBurnedRecord::class,
-    )
-
-internal fun getRecordType(id: Int): KClass<out Record> =
-    requireNotNull(TYPE_ID_TO_RECORD_TYPE_MAP[id]) { "Unknown data type id: $id" }
diff --git a/health/connect/connect-client/src/main/java/androidx/health/platform/client/utils/IntentExt.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/utils/IntentExt.kt
new file mode 100644
index 0000000..21dbe1f
--- /dev/null
+++ b/health/connect/connect-client/src/main/java/androidx/health/platform/client/utils/IntentExt.kt
@@ -0,0 +1,50 @@
+/*
+ * Copyright 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.
+ */
+
+@file:RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+
+package androidx.health.platform.client.utils
+
+import android.content.Intent
+import android.os.Bundle
+import androidx.annotation.RestrictTo
+import androidx.health.platform.client.proto.AbstractMessageLite
+
+fun Intent.putProtoMessages(name: String, messages: Collection<AbstractMessageLite<*, *>>): Intent =
+    putByteArraysExtra(name = name, byteArrays = messages.map { it.toByteArray() })
+
+fun Intent.putByteArraysExtra(name: String, byteArrays: Collection<ByteArray>): Intent =
+    putExtra(
+        name,
+        Bundle(byteArrays.size).apply {
+            byteArrays.forEachIndexed { index, bytes ->
+                putByteArray(index.toString(), bytes)
+            }
+        },
+    )
+
+fun <T : AbstractMessageLite<*, *>> Intent.getProtoMessages(
+    name: String,
+    parser: (ByteArray) -> T,
+): List<T>? =
+    getByteArraysExtra(name = name)?.map(parser)
+
+fun Intent.getByteArraysExtra(name: String): List<ByteArray>? =
+    getBundleExtra(name)?.let { bundle ->
+        List(bundle.size()) { index ->
+            requireNotNull(bundle.getByteArray(index.toString()))
+        }
+    }
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/ClassNames.kt b/health/connect/connect-client/src/main/java/androidx/health/platform/client/utils/package-info.java
similarity index 65%
copy from room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/ClassNames.kt
copy to health/connect/connect-client/src/main/java/androidx/health/platform/client/utils/package-info.java
index 465ea86..61c752d 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/ClassNames.kt
+++ b/health/connect/connect-client/src/main/java/androidx/health/platform/client/utils/package-info.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2022 The Android Open Source Project
+ * 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.
@@ -14,9 +14,8 @@
  * limitations under the License.
  */
 
-package androidx.room.compiler.codegen
+/** @hide */
+@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
+package androidx.health.platform.client.utils;
 
-import com.squareup.javapoet.ClassName
-
-internal val NULLABLE_ANNOTATION = ClassName.get("androidx.annotation", "Nullable")
-internal val NONNULL_ANNOTATION = ClassName.get("androidx.annotation", "NonNull")
\ No newline at end of file
+import androidx.annotation.RestrictTo;
diff --git a/health/connect/connect-client/src/test/java/androidx/health/connect/client/impl/converters/datatype/TypeIdToRecordTypeTest.kt b/health/connect/connect-client/src/test/java/androidx/health/connect/client/impl/converters/datatype/TypeIdToRecordTypeTest.kt
deleted file mode 100644
index a319bc3..0000000
--- a/health/connect/connect-client/src/test/java/androidx/health/connect/client/impl/converters/datatype/TypeIdToRecordTypeTest.kt
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright 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 androidx.health.connect.client.impl.converters.datatype
-
-import androidx.health.connect.client.RECORD_CLASSES
-import com.google.common.truth.Truth.assertThat
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.junit.runners.JUnit4
-
-@RunWith(JUnit4::class)
-class TypeIdToRecordTypeTest {
-
-    @Test
-    fun containsAllRecordClasses() {
-        assertThat(TYPE_ID_TO_RECORD_TYPE_MAP.values).containsExactlyElementsIn(RECORD_CLASSES)
-    }
-}
diff --git a/health/connect/connect-client/src/test/java/androidx/health/platform/client/utils/IntentExtTest.kt b/health/connect/connect-client/src/test/java/androidx/health/platform/client/utils/IntentExtTest.kt
new file mode 100644
index 0000000..0e117fb
--- /dev/null
+++ b/health/connect/connect-client/src/test/java/androidx/health/platform/client/utils/IntentExtTest.kt
@@ -0,0 +1,104 @@
+/*
+ * Copyright 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 androidx.health.platform.client.utils
+
+import android.content.Intent
+import android.os.Parcel
+import androidx.health.connect.client.impl.converters.records.protoDataType
+import androidx.health.platform.client.proto.DataProto.DataType
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.robolectric.RobolectricTestRunner
+
+@RunWith(RobolectricTestRunner::class)
+class IntentExtTest {
+
+    @Test
+    fun byteArrays_notEmpty() {
+        val originalArrays = List(1024) { ByteArray(it, Int::toByte) }
+
+        val deserializedArrays =
+            Intent()
+                .putByteArraysExtra("key", originalArrays)
+                .serializeDeserialize()
+                .getByteArraysExtra("key")
+
+        assertThat(deserializedArrays?.map(ByteArray::toList))
+            .containsExactlyElementsIn(originalArrays.map(ByteArray::toList))
+    }
+
+    @Test
+    fun byteArrays_empty() {
+        val deserializedArrays =
+            Intent()
+                .putByteArraysExtra("key", emptyList())
+                .serializeDeserialize()
+                .getByteArraysExtra("key")
+
+        assertThat(deserializedArrays).isEmpty()
+    }
+
+    @Test
+    fun byteArrays_null() {
+        val deserializedArrays = Intent().getByteArraysExtra("key")
+
+        assertThat(deserializedArrays).isNull()
+    }
+
+    @Test
+    fun protoMessages_notEmpty() {
+        val originalMessages = List(128) { protoDataType("STEPS") }
+
+        val deserializedMessages =
+            Intent()
+                .putProtoMessages("key", originalMessages)
+                .serializeDeserialize()
+                .getProtoMessages("key", DataType::parseFrom)
+
+        assertThat(deserializedMessages).containsExactlyElementsIn(originalMessages)
+    }
+
+    @Test
+    fun protoMessages_empty() {
+        val deserializedMessages =
+            Intent()
+                .putProtoMessages("key", emptyList())
+                .serializeDeserialize()
+                .getProtoMessages("key", DataType::parseFrom)
+
+        assertThat(deserializedMessages).isEmpty()
+    }
+
+    @Test
+    fun protoMessages_null() {
+        val deserializedArrays = Intent().getProtoMessages("key", DataType::parseFrom)
+
+        assertThat(deserializedArrays).isNull()
+    }
+
+    private fun Intent.serializeDeserialize(): Intent {
+        val parcel = Parcel.obtain()
+        writeToParcel(parcel, 0)
+        parcel.setDataPosition(0)
+        val newIntent = Intent()
+        newIntent.readFromParcel(parcel)
+        parcel.recycle()
+
+        return newIntent
+    }
+}
\ No newline at end of file
diff --git a/leanback/leanback/src/main/res/values-ro/strings.xml b/leanback/leanback/src/main/res/values-ro/strings.xml
index faf5432..c9b239a 100644
--- a/leanback/leanback/src/main/res/values-ro/strings.xml
+++ b/leanback/leanback/src/main/res/values-ro/strings.xml
@@ -25,34 +25,34 @@
     <string name="lb_search_bar_hint_with_title_speech" msgid="6032250334706920550">"Rostiți pentru a căuta <xliff:g id="SEARCH_CONTEXT">%1$s</xliff:g>"</string>
     <string name="lb_control_display_fast_forward_multiplier" msgid="4657191930956702614">"%1$dX"</string>
     <string name="lb_control_display_rewind_multiplier" msgid="4597148235912710942">"%1$dX"</string>
-    <string name="lb_playback_controls_play" msgid="7088090604803481121">"Redați"</string>
-    <string name="lb_playback_controls_pause" msgid="917331776961802657">"Întrerupeți"</string>
-    <string name="lb_playback_controls_fast_forward" msgid="740570111678243493">"Derulați rapid înainte"</string>
-    <string name="lb_playback_controls_fast_forward_multiplier" msgid="5734614175721471329">"Derulați rapid înainte cu %1$dX"</string>
-    <string name="lb_playback_controls_rewind" msgid="2866333981131020771">"Derulați înapoi"</string>
-    <string name="lb_playback_controls_rewind_multiplier" msgid="6038956370475252734">"Derulați înapoi cu %1$dX"</string>
+    <string name="lb_playback_controls_play" msgid="7088090604803481121">"Redă"</string>
+    <string name="lb_playback_controls_pause" msgid="917331776961802657">"Întrerupe"</string>
+    <string name="lb_playback_controls_fast_forward" msgid="740570111678243493">"Derulează rapid înainte"</string>
+    <string name="lb_playback_controls_fast_forward_multiplier" msgid="5734614175721471329">"Derulează rapid înainte cu %1$dX"</string>
+    <string name="lb_playback_controls_rewind" msgid="2866333981131020771">"Derulează înapoi"</string>
+    <string name="lb_playback_controls_rewind_multiplier" msgid="6038956370475252734">"Derulează înapoi cu %1$dX"</string>
     <string name="lb_playback_controls_skip_next" msgid="8117512422682146745">"Ignoră articolul următor"</string>
     <string name="lb_playback_controls_skip_previous" msgid="3481218248309447059">"Ignoră articolul anterior"</string>
     <string name="lb_playback_controls_more_actions" msgid="8730341244454469032">"Mai multe acțiuni"</string>
-    <string name="lb_playback_controls_thumb_up" msgid="3458671378107738666">"Deselectați „Îmi place”"</string>
+    <string name="lb_playback_controls_thumb_up" msgid="3458671378107738666">"Deselectează „Îmi place”"</string>
     <string name="lb_playback_controls_thumb_up_outline" msgid="1385865732502550659">"Selectează „Îmi place”"</string>
-    <string name="lb_playback_controls_thumb_down" msgid="3544533410444618518">"Deselectați „Nu îmi place”"</string>
+    <string name="lb_playback_controls_thumb_down" msgid="3544533410444618518">"Deselectează „Nu îmi place”"</string>
     <string name="lb_playback_controls_thumb_down_outline" msgid="8475278766138652105">"Selectează „Nu îmi place”"</string>
     <string name="lb_playback_controls_repeat_none" msgid="1614290959784265209">"Nu repetați"</string>
     <string name="lb_playback_controls_repeat_all" msgid="8429099206716245199">"Repetați toate"</string>
     <string name="lb_playback_controls_repeat_one" msgid="676658705837320560">"Repetați unul"</string>
-    <string name="lb_playback_controls_shuffle_enable" msgid="5151681938752704485">"Activați redarea în mod aleatoriu"</string>
-    <string name="lb_playback_controls_shuffle_disable" msgid="6793109999253893369">"Dezactivați redarea în mod aleatoriu"</string>
-    <string name="lb_playback_controls_high_quality_enable" msgid="3057698527166674705">"Activați calitatea înaltă"</string>
-    <string name="lb_playback_controls_high_quality_disable" msgid="1209119371486219736">"Dezactivați calitatea înaltă"</string>
-    <string name="lb_playback_controls_closed_captioning_enable" msgid="2346334170216706076">"Activați subtitrările"</string>
-    <string name="lb_playback_controls_closed_captioning_disable" msgid="8691966842977635128">"Dezactivați subtitrările"</string>
-    <string name="lb_playback_controls_picture_in_picture" msgid="5770668162543767702">"Activați modul Picture-in-Picture"</string>
+    <string name="lb_playback_controls_shuffle_enable" msgid="5151681938752704485">"Activează redarea în mod aleatoriu"</string>
+    <string name="lb_playback_controls_shuffle_disable" msgid="6793109999253893369">"Dezactivează redarea în mod aleatoriu"</string>
+    <string name="lb_playback_controls_high_quality_enable" msgid="3057698527166674705">"Activează calitatea înaltă"</string>
+    <string name="lb_playback_controls_high_quality_disable" msgid="1209119371486219736">"Dezactivează calitatea înaltă"</string>
+    <string name="lb_playback_controls_closed_captioning_enable" msgid="2346334170216706076">"Activează subtitrările"</string>
+    <string name="lb_playback_controls_closed_captioning_disable" msgid="8691966842977635128">"Dezactivează subtitrările"</string>
+    <string name="lb_playback_controls_picture_in_picture" msgid="5770668162543767702">"Activează modul Picture-in-Picture"</string>
     <string name="lb_playback_time_separator" msgid="1471121602610716654">"/"</string>
     <string name="lb_playback_controls_shown" msgid="8690223891515602822">"Comenzile media sunt afișate"</string>
     <string name="lb_playback_controls_hidden" msgid="5859666950961624736">"Comenzile media sunt ascunse. Apasă pe butonul direcțional pentru a le afișa."</string>
     <string name="lb_guidedaction_finish_title" msgid="3330958750346333890">"Finalizați"</string>
-    <string name="lb_guidedaction_continue_title" msgid="893619591225519922">"Continuați"</string>
+    <string name="lb_guidedaction_continue_title" msgid="893619591225519922">"Continuă"</string>
     <string name="lb_media_player_error" msgid="3228326776757666747">"Cod de eroare MediaPlayer %1$d suplimentar %2$d"</string>
     <string name="lb_onboarding_get_started" msgid="5549711907371161292">"ÎNCEPEȚI"</string>
     <string name="lb_onboarding_accessibility_next" msgid="2394451791544864917">"Înainte"</string>
diff --git a/libraryversions.toml b/libraryversions.toml
index f5a8f33..44b8c15 100644
--- a/libraryversions.toml
+++ b/libraryversions.toml
@@ -95,7 +95,7 @@
 RECYCLERVIEW_SELECTION = "1.2.0-alpha02"
 REMOTECALLBACK = "1.0.0-alpha02"
 RESOURCEINSPECTION = "1.1.0-alpha01"
-ROOM = "2.5.0-alpha04"
+ROOM = "2.5.0-beta01"
 SAVEDSTATE = "1.3.0-alpha01"
 SECURITY = "1.1.0-alpha04"
 SECURITY_APP_AUTHENTICATOR = "1.0.0-alpha03"
@@ -108,7 +108,7 @@
 SLICE_BUILDERS_KTX = "1.0.0-alpha08"
 SLICE_REMOTECALLBACK = "1.0.0-alpha01"
 SLIDINGPANELAYOUT = "1.3.0-alpha01"
-SQLITE = "2.3.0-alpha06"
+SQLITE = "2.3.0-beta01"
 SQLITE_INSPECTOR = "2.1.0-alpha01"
 STARTUP = "1.2.0-alpha02"
 SWIPEREFRESHLAYOUT = "1.2.0-alpha01"
@@ -140,7 +140,7 @@
 WINDOW = "1.1.0-alpha04"
 WINDOW_EXTENSIONS = "1.1.0-alpha02"
 WINDOW_SIDECAR = "1.0.0-rc01"
-WORK = "2.8.0-alpha05"
+WORK = "2.8.0-beta01"
 
 [groups]
 ACTIVITY = { group = "androidx.activity", atomicGroupVersion = "versions.ACTIVITY" }
diff --git a/media/media/src/main/java/android/support/v4/media/session/MediaControllerCompat.java b/media/media/src/main/java/android/support/v4/media/session/MediaControllerCompat.java
index 7f71344..1b5aeef 100644
--- a/media/media/src/main/java/android/support/v4/media/session/MediaControllerCompat.java
+++ b/media/media/src/main/java/android/support/v4/media/session/MediaControllerCompat.java
@@ -222,18 +222,7 @@
      * @param session The session to be controlled.
      */
     public MediaControllerCompat(Context context, @NonNull MediaSessionCompat session) {
-        if (session == null) {
-            throw new IllegalArgumentException("session must not be null");
-        }
-        mToken = session.getSessionToken();
-
-        if (Build.VERSION.SDK_INT >= 29) {
-            mImpl = new MediaControllerImplApi29(context, mToken);
-        } else if (Build.VERSION.SDK_INT >= 21) {
-            mImpl = new MediaControllerImplApi21(context, mToken);
-        } else {
-            mImpl = new MediaControllerImplBase(mToken);
-        }
+        this(context, session.getSessionToken());
     }
 
     /**
@@ -248,7 +237,9 @@
         }
         mToken = sessionToken;
 
-        if (android.os.Build.VERSION.SDK_INT >= 21) {
+        if (Build.VERSION.SDK_INT >= 29) {
+            mImpl = new MediaControllerImplApi29(context, sessionToken);
+        } else if (Build.VERSION.SDK_INT >= 21) {
             mImpl = new MediaControllerImplApi21(context, sessionToken);
         } else {
             mImpl = new MediaControllerImplBase(sessionToken);
diff --git a/media/version-compat-tests/current/client/src/androidTest/AndroidManifest.xml b/media/version-compat-tests/current/client/src/androidTest/AndroidManifest.xml
index aaf0585..8706903 100644
--- a/media/version-compat-tests/current/client/src/androidTest/AndroidManifest.xml
+++ b/media/version-compat-tests/current/client/src/androidTest/AndroidManifest.xml
@@ -22,8 +22,8 @@
     <application android:supportsRtl="true">
         <receiver android:name="android.support.mediacompat.client.ClientBroadcastReceiver" android:exported="true">
             <intent-filter>
-                <action android:name="android.support.mediacompat.service.action.CALL_MEDIA_CONTROLLER_METHOD"/>
-                <action android:name="android.support.mediacompat.service.action.CALL_TRANSPORT_CONTROLS_METHOD"/>
+                <action android:name="android.support.mediacompat.client.action.CALL_MEDIA_CONTROLLER_METHOD"/>
+                <action android:name="android.support.mediacompat.client.action.CALL_TRANSPORT_CONTROLS_METHOD"/>
             </intent-filter>
         </receiver>
     </application>
diff --git a/media/version-compat-tests/previous/client/src/androidTest/AndroidManifest.xml b/media/version-compat-tests/previous/client/src/androidTest/AndroidManifest.xml
index aaf0585..8706903 100644
--- a/media/version-compat-tests/previous/client/src/androidTest/AndroidManifest.xml
+++ b/media/version-compat-tests/previous/client/src/androidTest/AndroidManifest.xml
@@ -22,8 +22,8 @@
     <application android:supportsRtl="true">
         <receiver android:name="android.support.mediacompat.client.ClientBroadcastReceiver" android:exported="true">
             <intent-filter>
-                <action android:name="android.support.mediacompat.service.action.CALL_MEDIA_CONTROLLER_METHOD"/>
-                <action android:name="android.support.mediacompat.service.action.CALL_TRANSPORT_CONTROLS_METHOD"/>
+                <action android:name="android.support.mediacompat.client.action.CALL_MEDIA_CONTROLLER_METHOD"/>
+                <action android:name="android.support.mediacompat.client.action.CALL_TRANSPORT_CONTROLS_METHOD"/>
             </intent-filter>
         </receiver>
     </application>
diff --git a/media2/media2-common/lint-baseline.xml b/media2/media2-common/lint-baseline.xml
index 37f296f..d4ef3f4 100644
--- a/media2/media2-common/lint-baseline.xml
+++ b/media2/media2-common/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="cli" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
+<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
 
     <issue
         id="KotlinPropertyAccess"
diff --git a/media2/media2-session/src/main/res/values-ro/strings.xml b/media2/media2-session/src/main/res/values-ro/strings.xml
index 0e8c25b..7fbdf7b 100644
--- a/media2/media2-session/src/main/res/values-ro/strings.xml
+++ b/media2/media2-session/src/main/res/values-ro/strings.xml
@@ -18,8 +18,8 @@
 <resources xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="default_notification_channel_name" msgid="7213672915724563695">"Now Playing"</string>
-    <string name="play_button_content_description" msgid="963503759453979404">"Redați"</string>
-    <string name="pause_button_content_description" msgid="3510124037191104584">"Întrerupeți"</string>
+    <string name="play_button_content_description" msgid="963503759453979404">"Redă"</string>
+    <string name="pause_button_content_description" msgid="3510124037191104584">"Întrerupe"</string>
     <string name="skip_to_previous_item_button_content_description" msgid="4352480799561670760">"Treceți la elementul anterior"</string>
     <string name="skip_to_next_item_button_content_description" msgid="6034072145387511457">"Treceți la elementul următor"</string>
 </resources>
diff --git a/media2/media2-widget/src/main/res/values-ro/strings.xml b/media2/media2-widget/src/main/res/values-ro/strings.xml
index 885faf5..8cd5906 100644
--- a/media2/media2-widget/src/main/res/values-ro/strings.xml
+++ b/media2/media2-widget/src/main/res/values-ro/strings.xml
@@ -38,12 +38,12 @@
     <string name="mcv2_settings_button_desc" msgid="811917224044739656">"Setări"</string>
     <string name="mcv2_cc_is_on" msgid="5427119422911561783">"Subtitrarea este activată. Ascunde-o cu un clic."</string>
     <string name="mcv2_cc_is_off" msgid="2380791179816122456">"Subtitrarea este dezactivată. Afișează-o cu un clic."</string>
-    <string name="mcv2_replay_button_desc" msgid="3128622733570179596">"Redați din nou"</string>
-    <string name="mcv2_play_button_desc" msgid="4881308324856085359">"Redați"</string>
-    <string name="mcv2_pause_button_desc" msgid="7391720675120766278">"Întrerupeți"</string>
+    <string name="mcv2_replay_button_desc" msgid="3128622733570179596">"Redă din nou"</string>
+    <string name="mcv2_play_button_desc" msgid="4881308324856085359">"Redă"</string>
+    <string name="mcv2_pause_button_desc" msgid="7391720675120766278">"Întrerupe"</string>
     <string name="mcv2_previous_button_desc" msgid="3080315055670437389">"Conținutul media anterior"</string>
     <string name="mcv2_next_button_desc" msgid="1204572886248099893">"Conținutul media următor"</string>
-    <string name="mcv2_rewind_button_desc" msgid="578809901971186362">"Derulați înapoi zece secunde"</string>
-    <string name="mcv2_ffwd_button_desc" msgid="611689280746097673">"Derulați înainte 30 de secunde"</string>
+    <string name="mcv2_rewind_button_desc" msgid="578809901971186362">"Derulează înapoi zece secunde"</string>
+    <string name="mcv2_ffwd_button_desc" msgid="611689280746097673">"Derulează înainte 30 de secunde"</string>
     <string name="mcv2_full_screen_button_desc" msgid="1609817079594941003">"Ecran complet"</string>
 </resources>
diff --git a/mediarouter/mediarouter/src/main/res/values-ro/strings.xml b/mediarouter/mediarouter/src/main/res/values-ro/strings.xml
index 831d91f..a115b22 100644
--- a/mediarouter/mediarouter/src/main/res/values-ro/strings.xml
+++ b/mediarouter/mediarouter/src/main/res/values-ro/strings.xml
@@ -18,17 +18,17 @@
     xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
     <string name="mr_system_route_name" msgid="7449553026175453403">"Sistem"</string>
     <string name="mr_user_route_category_name" msgid="4088331695424166162">"Dispozitive"</string>
-    <string name="mr_button_content_description" msgid="2939063992730535343">"Proiectați"</string>
-    <string name="mr_cast_button_disconnected" msgid="8071109333469380363">"Proiectați. S-a deconectat"</string>
-    <string name="mr_cast_button_connecting" msgid="6629927151350192407">"Proiectați. Se conectează"</string>
-    <string name="mr_cast_button_connected" msgid="6073720094880410356">"Proiectați. S-a conectat"</string>
-    <string name="mr_chooser_title" msgid="1419936397646839840">"Proiectați pe"</string>
+    <string name="mr_button_content_description" msgid="2939063992730535343">"Proiectează"</string>
+    <string name="mr_cast_button_disconnected" msgid="8071109333469380363">"Proiectează. S-a deconectat"</string>
+    <string name="mr_cast_button_connecting" msgid="6629927151350192407">"Proiectează. Se conectează"</string>
+    <string name="mr_cast_button_connected" msgid="6073720094880410356">"Proiectează. S-a conectat"</string>
+    <string name="mr_chooser_title" msgid="1419936397646839840">"Proiectează pe"</string>
     <string name="mr_chooser_searching" msgid="6114250663023140921">"Se caută dispozitive"</string>
     <string name="mr_controller_disconnect" msgid="7812275474138309497">"Deconectează"</string>
     <string name="mr_controller_stop_casting" msgid="804210341192624074">"Nu mai proiectați"</string>
     <string name="mr_controller_close_description" msgid="5684434439232634509">"Închide"</string>
-    <string name="mr_controller_play" msgid="1253345086594430054">"Redați"</string>
-    <string name="mr_controller_pause" msgid="747801650871398383">"Întrerupeți"</string>
+    <string name="mr_controller_play" msgid="1253345086594430054">"Redă"</string>
+    <string name="mr_controller_pause" msgid="747801650871398383">"Întrerupe"</string>
     <string name="mr_controller_stop" msgid="5497722768305745508">"Oprește"</string>
     <string name="mr_controller_expand_group" msgid="4521419834052044261">"Extinde"</string>
     <string name="mr_controller_collapse_group" msgid="2585048604188129749">"Restrânge"</string>
@@ -39,6 +39,6 @@
     <string name="mr_controller_casting_screen" msgid="9171231064758955152">"Se proiectează ecranul"</string>
     <string name="mr_dialog_default_group_name" msgid="4115858704575247342">"Grup"</string>
     <string name="mr_dialog_groupable_header" msgid="4307018456678388936">"Adaugă un dispozitiv"</string>
-    <string name="mr_dialog_transferable_header" msgid="6068257520605505468">"Redați într-un grup"</string>
+    <string name="mr_dialog_transferable_header" msgid="6068257520605505468">"Redă într-un grup"</string>
     <string name="mr_cast_dialog_title_view_placeholder" msgid="2175930138959078155">"Nu sunt informații disponibile"</string>
 </resources>
diff --git a/navigation/navigation-ui/api/current.txt b/navigation/navigation-ui/api/current.txt
index 9551da2..27e99a9 100644
--- a/navigation/navigation-ui/api/current.txt
+++ b/navigation/navigation-ui/api/current.txt
@@ -11,6 +11,7 @@
     method public androidx.navigation.ui.AppBarConfiguration.OnNavigateUpListener? getFallbackOnNavigateUpListener();
     method public androidx.customview.widget.Openable? getOpenableLayout();
     method public java.util.Set<java.lang.Integer> getTopLevelDestinations();
+    method public boolean isTopLevelDestination(androidx.navigation.NavDestination destination);
     property @Deprecated public final androidx.drawerlayout.widget.DrawerLayout? drawerLayout;
     property public final androidx.navigation.ui.AppBarConfiguration.OnNavigateUpListener? fallbackOnNavigateUpListener;
     property public final androidx.customview.widget.Openable? openableLayout;
diff --git a/navigation/navigation-ui/api/public_plus_experimental_current.txt b/navigation/navigation-ui/api/public_plus_experimental_current.txt
index 62b5ce4..7cb97e2 100644
--- a/navigation/navigation-ui/api/public_plus_experimental_current.txt
+++ b/navigation/navigation-ui/api/public_plus_experimental_current.txt
@@ -11,6 +11,7 @@
     method public androidx.navigation.ui.AppBarConfiguration.OnNavigateUpListener? getFallbackOnNavigateUpListener();
     method public androidx.customview.widget.Openable? getOpenableLayout();
     method public java.util.Set<java.lang.Integer> getTopLevelDestinations();
+    method public boolean isTopLevelDestination(androidx.navigation.NavDestination destination);
     property @Deprecated public final androidx.drawerlayout.widget.DrawerLayout? drawerLayout;
     property public final androidx.navigation.ui.AppBarConfiguration.OnNavigateUpListener? fallbackOnNavigateUpListener;
     property public final androidx.customview.widget.Openable? openableLayout;
diff --git a/navigation/navigation-ui/api/restricted_current.txt b/navigation/navigation-ui/api/restricted_current.txt
index 9551da2..27e99a9 100644
--- a/navigation/navigation-ui/api/restricted_current.txt
+++ b/navigation/navigation-ui/api/restricted_current.txt
@@ -11,6 +11,7 @@
     method public androidx.navigation.ui.AppBarConfiguration.OnNavigateUpListener? getFallbackOnNavigateUpListener();
     method public androidx.customview.widget.Openable? getOpenableLayout();
     method public java.util.Set<java.lang.Integer> getTopLevelDestinations();
+    method public boolean isTopLevelDestination(androidx.navigation.NavDestination destination);
     property @Deprecated public final androidx.drawerlayout.widget.DrawerLayout? drawerLayout;
     property public final androidx.navigation.ui.AppBarConfiguration.OnNavigateUpListener? fallbackOnNavigateUpListener;
     property public final androidx.customview.widget.Openable? openableLayout;
diff --git a/navigation/navigation-ui/src/androidTest/java/androidx/navigation/ui/AppBarConfigurationTest.kt b/navigation/navigation-ui/src/androidTest/java/androidx/navigation/ui/AppBarConfigurationTest.kt
index c2576ae..83c849d 100644
--- a/navigation/navigation-ui/src/androidTest/java/androidx/navigation/ui/AppBarConfigurationTest.kt
+++ b/navigation/navigation-ui/src/androidTest/java/androidx/navigation/ui/AppBarConfigurationTest.kt
@@ -17,10 +17,14 @@
 package androidx.navigation.ui
 
 import android.content.Context
+import androidx.appcompat.widget.Toolbar
 import androidx.drawerlayout.widget.DrawerLayout
 import androidx.navigation.NavController
+import androidx.navigation.NavDestinationBuilder
+import androidx.navigation.NavHostController
 import androidx.navigation.createGraph
 import androidx.navigation.plusAssign
+import androidx.test.annotation.UiThreadTest
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.LargeTest
 import androidx.test.platform.app.InstrumentationRegistry
@@ -90,4 +94,124 @@
         assertThat(appBarConfiguration.fallbackOnNavigateUpListener)
             .isEqualTo(onNavigateUpListener)
     }
+
+    @UiThreadTest
+    @Test
+    fun testIsTopLevelDestination_menuItemAsNestedGraph() {
+        val navController = NavHostController(context)
+        val navigator = TestNavigator()
+        navController.apply {
+            navigatorProvider.addNavigator(navigator)
+            setGraph(R.navigation.simple_graph)
+        }
+
+        val toolbar = Toolbar(context).apply {
+            inflateMenu(R.menu.menu)
+        }
+        val appBarConfig = AppBarConfiguration.Builder(
+            topLevelMenu = toolbar.menu
+        ).build()
+        // start destination of menu_item_graph, a nested graph (and start dest) inside simple_graph
+        assertThat(navController.currentDestination?.id).isEqualTo(
+            R.id.itemHome
+        )
+        // start destination of menu_item_graph which should be a topLevelDestination
+        assertThat(
+            appBarConfig.isTopLevelDestination(
+                navController.currentDestination!!
+            )
+        ).isTrue()
+        // non-starting destination within menu_item_graph
+        assertThat(
+            appBarConfig.isTopLevelDestination(
+                navController.currentDestination!!.parent!!.findNode(R.id.itemSecondDestination)!!
+            )
+        ).isFalse()
+    }
+
+    @UiThreadTest
+    @Test
+    fun testIsTopLevelDestination_menuItemAsIndividualItem() {
+        val navController = NavHostController(context)
+        val navigator = TestNavigator()
+        navController.apply {
+            navigatorProvider.addNavigator(navigator)
+            setGraph(R.navigation.simple_graph)
+        }
+
+        val toolbar = Toolbar(context).apply {
+            inflateMenu(R.menu.menu)
+        }
+        val appBarConfig = AppBarConfiguration.Builder(
+            topLevelMenu = toolbar.menu
+        ).build()
+
+        // menu_item_graph is a NavGraph. The graph id itself should not be a top level destination.
+        assertThat(
+            appBarConfig.isTopLevelDestination(
+                navController.graph.findNode(R.id.menu_item_graph)!!
+            )
+        ).isFalse()
+
+        // menu_item2 which is not a graph. Even though it is not the startDestination of
+        // its parent (simple_graph), it should be added as a topLevelDestination
+        // via AppBarConfig.Builder(menu) constructor.
+        assertThat(
+            appBarConfig.isTopLevelDestination(
+                navController.graph.findNode(R.id.menu_item2)!!
+            )
+        ).isTrue()
+    }
+
+    @UiThreadTest
+    @Test
+    fun testIsTopLevelDestination_simpleGraph() {
+        val navController = NavController(context)
+        val navGraph = navController.apply {
+            navigatorProvider += TestNavigator()
+        }.createGraph(startDestination = "1") {
+            test("1")
+            test("2")
+        }
+        navController.setGraph(navGraph, null)
+        val builder = AppBarConfiguration.Builder(navGraph)
+        val appBarConfiguration = builder.build()
+
+        assertThat(appBarConfiguration.isTopLevelDestination(
+            navController.graph.findNode("1")!!)
+        ).isTrue()
+        assertThat(
+            appBarConfiguration.isTopLevelDestination(navController.graph.findNode("2")!!)
+        ).isFalse()
+    }
+
+    @UiThreadTest
+    @Test
+    fun testIsTopLevelDestination_fromDestinationIds() {
+        val navigator = TestNavigator()
+
+        val dest1 = NavDestinationBuilder(navigator, "1").build()
+        val dest2 = NavDestinationBuilder(navigator, "2").build()
+
+        val builder = AppBarConfiguration.Builder(dest1.id, dest2.id)
+        val appBarConfiguration = builder.build()
+
+        assertThat(appBarConfiguration.isTopLevelDestination(dest1)).isTrue()
+        assertThat(appBarConfiguration.isTopLevelDestination(dest2)).isTrue()
+    }
+
+    @UiThreadTest
+    @Test
+    fun testIsTopLevelDestination_fromSetOfDestinationIds() {
+        val navigator = TestNavigator()
+
+        val dest1 = NavDestinationBuilder(navigator, "1").build()
+        val dest2 = NavDestinationBuilder(navigator, "2").build()
+
+        val builder = AppBarConfiguration.Builder(setOf(dest1.id, dest2.id))
+        val appBarConfiguration = builder.build()
+
+        assertThat(appBarConfiguration.isTopLevelDestination(dest1)).isTrue()
+        assertThat(appBarConfiguration.isTopLevelDestination(dest2)).isTrue()
+    }
 }
diff --git a/navigation/navigation-ui/src/androidTest/java/androidx/navigation/ui/NavigationUITest.kt b/navigation/navigation-ui/src/androidTest/java/androidx/navigation/ui/NavigationUITest.kt
index 356161d..0796ff3 100644
--- a/navigation/navigation-ui/src/androidTest/java/androidx/navigation/ui/NavigationUITest.kt
+++ b/navigation/navigation-ui/src/androidTest/java/androidx/navigation/ui/NavigationUITest.kt
@@ -23,18 +23,14 @@
 import androidx.core.content.res.TypedArrayUtils.getString
 import androidx.navigation.NavController
 import androidx.navigation.NavDestination
-import androidx.navigation.NavGraph
-import androidx.navigation.NavGraphNavigator
 import androidx.navigation.NavHostController
 import androidx.navigation.NavType
 import androidx.navigation.createGraph
-import androidx.navigation.ui.NavigationUI.matchDestinations
 import androidx.test.annotation.UiThreadTest
 import androidx.test.core.app.ApplicationProvider
 import androidx.test.ext.junit.runners.AndroidJUnit4
 import androidx.test.filters.SmallTest
 import androidx.testutils.TestNavigator
-import androidx.testutils.TestNavigatorProvider
 import androidx.testutils.test
 import com.google.common.truth.Truth.assertThat
 import org.junit.Test
@@ -43,15 +39,6 @@
 @SmallTest
 @RunWith(AndroidJUnit4::class)
 class NavigationUITest {
-    @Test
-    fun matchDestinationsTest() {
-        val destination = TestNavigator().createDestination().apply {
-            id = 1
-            parent = NavGraph(NavGraphNavigator(TestNavigatorProvider()))
-        }
-
-        assertThat(destination.matchDestinations(setOf(1, 2))).isTrue()
-    }
 
     @UiThreadTest
     @Test
diff --git a/navigation/navigation-ui/src/main/java/androidx/navigation/ui/AbstractAppBarOnDestinationChangedListener.kt b/navigation/navigation-ui/src/main/java/androidx/navigation/ui/AbstractAppBarOnDestinationChangedListener.kt
index 9962d7b..3b2c798 100644
--- a/navigation/navigation-ui/src/main/java/androidx/navigation/ui/AbstractAppBarOnDestinationChangedListener.kt
+++ b/navigation/navigation-ui/src/main/java/androidx/navigation/ui/AbstractAppBarOnDestinationChangedListener.kt
@@ -26,7 +26,6 @@
 import androidx.navigation.FloatingWindow
 import androidx.navigation.NavController
 import androidx.navigation.NavDestination
-import androidx.navigation.ui.NavigationUI.matchDestinations
 import java.lang.ref.WeakReference
 
 /**
@@ -36,9 +35,8 @@
  */
 internal abstract class AbstractAppBarOnDestinationChangedListener(
     private val context: Context,
-    configuration: AppBarConfiguration
+    private val configuration: AppBarConfiguration
 ) : NavController.OnDestinationChangedListener {
-    private val topLevelDestinations: Set<Int> = configuration.topLevelDestinations
     private val openableLayoutWeakReference = configuration.openableLayout?.run {
         WeakReference(this)
     }
@@ -68,7 +66,7 @@
             setTitle(label)
         }
 
-        val isTopLevelDestination = destination.matchDestinations(topLevelDestinations)
+        val isTopLevelDestination = configuration.isTopLevelDestination(destination)
         if (openableLayout == null && isTopLevelDestination) {
             setNavigationIcon(null, 0)
         } else {
diff --git a/navigation/navigation-ui/src/main/java/androidx/navigation/ui/AppBarConfiguration.kt b/navigation/navigation-ui/src/main/java/androidx/navigation/ui/AppBarConfiguration.kt
index 252f385..827a259b 100644
--- a/navigation/navigation-ui/src/main/java/androidx/navigation/ui/AppBarConfiguration.kt
+++ b/navigation/navigation-ui/src/main/java/androidx/navigation/ui/AppBarConfiguration.kt
@@ -17,8 +17,11 @@
 
 import android.annotation.SuppressLint
 import android.view.Menu
+import android.view.MenuItem
 import androidx.customview.widget.Openable
 import androidx.drawerlayout.widget.DrawerLayout
+import androidx.navigation.NavDestination
+import androidx.navigation.NavDestination.Companion.hierarchy
 import androidx.navigation.NavGraph
 import androidx.navigation.NavGraph.Companion.findStartDestination
 import androidx.navigation.ui.AppBarConfiguration.OnNavigateUpListener
@@ -80,6 +83,31 @@
         } else null
 
     /**
+     * Determines whether a [NavDestination] is a top level destination in [AppBarConfiguration].
+     *
+     * Returns true if the [NavDestination] was added directly as a top level destination via
+     * [AppBarConfiguration.Builder] constructors such as
+     * `AppBarConfiguration.Builder(topLevelDestinationIds: Set<Int>)`.
+     * If destination was added with a [AppBarConfiguration.Builder] that could take in a graph,
+     * i.e. `AppBarConfiguration.Builder(NavGraph)` or`AppBarConfiguration.Builder(Menu)`, this
+     * helper will return true if the destination is the start destination of a graph
+     * (including nested graphs i.e. [MenuItem] that are also [NavGraph]), or an individual
+     * [MenuItem] within the [Menu].
+     *
+     * @param destination the [NavDestination] to check whether it is a topLevelDestination
+     */
+    public fun isTopLevelDestination(destination: NavDestination): Boolean {
+        return destination.hierarchy.any { parent ->
+            when (parent.id in topLevelDestinations) {
+                true -> if (parent is NavGraph) {
+                            destination.id == parent.findStartDestination().id
+                        } else true
+                else -> false
+            }
+        }
+    }
+
+    /**
      * The Builder class for constructing new [AppBarConfiguration] instances.
      */
     public class Builder {
diff --git a/navigation/navigation-ui/src/main/java/androidx/navigation/ui/NavigationUI.kt b/navigation/navigation-ui/src/main/java/androidx/navigation/ui/NavigationUI.kt
index 920eff2..9a5a17e 100644
--- a/navigation/navigation-ui/src/main/java/androidx/navigation/ui/NavigationUI.kt
+++ b/navigation/navigation-ui/src/main/java/androidx/navigation/ui/NavigationUI.kt
@@ -205,9 +205,8 @@
     ): Boolean {
         val openableLayout = configuration.openableLayout
         val currentDestination = navController.currentDestination
-        val topLevelDestinations = configuration.topLevelDestinations
         return if (openableLayout != null && currentDestination != null &&
-            currentDestination.matchDestinations(topLevelDestinations)
+            configuration.isTopLevelDestination(currentDestination)
         ) {
             openableLayout.open()
             true
@@ -708,13 +707,4 @@
     @JvmStatic
     internal fun NavDestination.matchDestination(@IdRes destId: Int): Boolean =
         hierarchy.any { it.id == destId }
-
-    /**
-     * Determines whether the given `destinationIds` match the NavDestination. This
-     * handles both the default case (the destination's id is in the given ids) and the nested
-     * case where the given ids is a parent/grandparent/etc of the destination.
-     */
-    @JvmStatic
-    internal fun NavDestination.matchDestinations(destinationIds: Set<Int?>): Boolean =
-        hierarchy.any { destinationIds.contains(it.id) }
 }
diff --git a/navigation/navigation-ui/src/main/res/menu/menu.xml b/navigation/navigation-ui/src/main/res/menu/menu.xml
new file mode 100644
index 0000000..245cf19
--- /dev/null
+++ b/navigation/navigation-ui/src/main/res/menu/menu.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright 2019, 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.
+  -->
+
+<menu xmlns:android="http://schemas.android.com/apk/res/android">
+    <item
+        android:id="@+id/menu_item_graph"
+        android:title="menu_item1_title" />
+    <item
+        android:id="@+id/menu_item2"
+        android:title="menu_item2_title" />
+</menu>
diff --git a/navigation/navigation-ui/src/main/res/navigation/menu_item_graph.xml b/navigation/navigation-ui/src/main/res/navigation/menu_item_graph.xml
new file mode 100644
index 0000000..4a65edc
--- /dev/null
+++ b/navigation/navigation-ui/src/main/res/navigation/menu_item_graph.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright 2019, 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.
+  -->
+
+<navigation
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/menu_item_graph"
+    app:startDestination="@+id/itemHome">
+
+    <test
+        android:id="@+id/itemHome"
+        android:name="androidx.navigation.ui.androidTest.EmptyFragment">
+        <action
+            android:id="@+id/itemHome_to_itemSecondDestination"
+            app:destination="@id/itemSecondDestination" />
+    </test>
+    <test
+        android:id="@+id/itemSecondDestination"
+        android:name="androidx.navigation.ui.androidTest.EmptyFragment">
+    </test>
+</navigation>
diff --git a/navigation/navigation-ui/src/main/res/navigation/simple_graph.xml b/navigation/navigation-ui/src/main/res/navigation/simple_graph.xml
new file mode 100644
index 0000000..1fd0cd2
--- /dev/null
+++ b/navigation/navigation-ui/src/main/res/navigation/simple_graph.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+  ~ Copyright 2019, 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.
+  -->
+<navigation
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/simple_graph"
+    app:startDestination="@+id/menu_item_graph">
+
+    <test
+        android:id="@+id/menu_item2"
+        android:name="androidx.navigation.ui.androidTest.EmptyFragment">
+    </test>
+
+    <include app:graph="@navigation/menu_item_graph"/>
+</navigation>
diff --git a/paging/paging-common/lint-baseline.xml b/paging/paging-common/lint-baseline.xml
new file mode 100644
index 0000000..2bfe322
--- /dev/null
+++ b/paging/paging-common/lint-baseline.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
+
+    <issue
+        id="SupportAnnotationUsage"
+        message="Did you mean `@get:VisibleForTesting`? Without `get:` this annotates the constructor parameter itself instead of the associated getter."
+        errorLine1="        @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE)"
+        errorLine2="        ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/kotlin/androidx/paging/PageFetcher.kt"/>
+    </issue>
+
+    <issue
+        id="SupportAnnotationUsage"
+        message="Did you mean `@get:RestrictTo`? Without `get:` this annotates the constructor parameter itself instead of the associated getter."
+        errorLine1="    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/kotlin/androidx/paging/PagedList.kt"/>
+    </issue>
+
+</issues>
diff --git a/paging/paging-testing/api/current.txt b/paging/paging-testing/api/current.txt
index acdc8f2..f05d8b03 100644
--- a/paging/paging-testing/api/current.txt
+++ b/paging/paging-testing/api/current.txt
@@ -6,6 +6,7 @@
     method public suspend Object? append(kotlin.coroutines.Continuation<? super androidx.paging.PagingSource.LoadResult<Key,Value>>);
     method public suspend Object? getLastLoadedPage(kotlin.coroutines.Continuation<? super androidx.paging.PagingSource.LoadResult.Page<Key,Value>>);
     method public suspend Object? getPages(kotlin.coroutines.Continuation<? super java.util.List<? extends androidx.paging.PagingSource.LoadResult.Page<Key,Value>>>);
+    method public suspend Object? getPagingState(int anchorPosition, kotlin.coroutines.Continuation<? super androidx.paging.PagingState<Key,Value>>);
     method public suspend Object? prepend(kotlin.coroutines.Continuation<? super androidx.paging.PagingSource.LoadResult<Key,Value>>);
     method public suspend Object? refresh(optional Key? initialKey, optional kotlin.coroutines.Continuation<? super androidx.paging.PagingSource.LoadResult<Key,Value>>);
   }
diff --git a/paging/paging-testing/api/public_plus_experimental_current.txt b/paging/paging-testing/api/public_plus_experimental_current.txt
index acdc8f2..f05d8b03 100644
--- a/paging/paging-testing/api/public_plus_experimental_current.txt
+++ b/paging/paging-testing/api/public_plus_experimental_current.txt
@@ -6,6 +6,7 @@
     method public suspend Object? append(kotlin.coroutines.Continuation<? super androidx.paging.PagingSource.LoadResult<Key,Value>>);
     method public suspend Object? getLastLoadedPage(kotlin.coroutines.Continuation<? super androidx.paging.PagingSource.LoadResult.Page<Key,Value>>);
     method public suspend Object? getPages(kotlin.coroutines.Continuation<? super java.util.List<? extends androidx.paging.PagingSource.LoadResult.Page<Key,Value>>>);
+    method public suspend Object? getPagingState(int anchorPosition, kotlin.coroutines.Continuation<? super androidx.paging.PagingState<Key,Value>>);
     method public suspend Object? prepend(kotlin.coroutines.Continuation<? super androidx.paging.PagingSource.LoadResult<Key,Value>>);
     method public suspend Object? refresh(optional Key? initialKey, optional kotlin.coroutines.Continuation<? super androidx.paging.PagingSource.LoadResult<Key,Value>>);
   }
diff --git a/paging/paging-testing/api/restricted_current.txt b/paging/paging-testing/api/restricted_current.txt
index acdc8f2..f05d8b03 100644
--- a/paging/paging-testing/api/restricted_current.txt
+++ b/paging/paging-testing/api/restricted_current.txt
@@ -6,6 +6,7 @@
     method public suspend Object? append(kotlin.coroutines.Continuation<? super androidx.paging.PagingSource.LoadResult<Key,Value>>);
     method public suspend Object? getLastLoadedPage(kotlin.coroutines.Continuation<? super androidx.paging.PagingSource.LoadResult.Page<Key,Value>>);
     method public suspend Object? getPages(kotlin.coroutines.Continuation<? super java.util.List<? extends androidx.paging.PagingSource.LoadResult.Page<Key,Value>>>);
+    method public suspend Object? getPagingState(int anchorPosition, kotlin.coroutines.Continuation<? super androidx.paging.PagingState<Key,Value>>);
     method public suspend Object? prepend(kotlin.coroutines.Continuation<? super androidx.paging.PagingSource.LoadResult<Key,Value>>);
     method public suspend Object? refresh(optional Key? initialKey, optional kotlin.coroutines.Continuation<? super androidx.paging.PagingSource.LoadResult<Key,Value>>);
   }
diff --git a/paging/paging-testing/src/main/java/androidx/paging/testing/TestPager.kt b/paging/paging-testing/src/main/java/androidx/paging/testing/TestPager.kt
index 4c7a1b8..4ca869f 100644
--- a/paging/paging-testing/src/main/java/androidx/paging/testing/TestPager.kt
+++ b/paging/paging-testing/src/main/java/androidx/paging/testing/TestPager.kt
@@ -25,6 +25,8 @@
 import androidx.paging.PagingSource.LoadParams
 import androidx.paging.PagingSource.LoadResult
 import androidx.paging.Pager
+import androidx.paging.PagingSource.LoadResult.Page.Companion.COUNT_UNDEFINED
+import androidx.paging.PagingState
 import java.util.concurrent.atomic.AtomicBoolean
 import kotlinx.coroutines.sync.Mutex
 import kotlinx.coroutines.sync.withLock
@@ -181,6 +183,93 @@
         }
     }
 
+    /**
+     * Returns a [PagingState] to generate a [LoadParams.key] by supplying it to
+     * [PagingSource.getRefreshKey]. The key returned from [PagingSource.getRefreshKey]
+     * should be used as the [LoadParams.Refresh.key] when calling [refresh] on a new generation of
+     * TestPager.
+     *
+     * The anchorPosition must be within index of loaded items, which can include
+     * placeholders if [PagingConfig.enablePlaceholders] is true. For example:
+     * - No placeholders: If 40 items have been loaded so far , anchorPosition must be
+     * in [0 .. 39].
+     * - With placeholders: If there are a total of 100 loadable items, the anchorPosition
+     * must be in [0..99].
+     *
+     * The [anchorPosition] should be the index that the user has hypothetically
+     * scrolled to on the UI. Since the [PagingState.anchorPosition] in Paging can be based
+     * on any item or placeholder currently visible on the screen, the actual
+     * value of [PagingState.anchorPosition] may not exactly match the [anchorPosition] passed
+     * to this function even if viewing the same page of data.
+     *
+     * @param anchorPosition the index representing the last accessed item within the
+     * items presented on the UI, which may be a placeholder if
+     * [PagingConfig.enablePlaceholders] is true.
+     *
+     * @throws IllegalStateException if anchorPosition is out of bounds
+     */
+    public suspend fun getPagingState(anchorPosition: Int): PagingState<Key, Value> {
+        lock.withLock {
+            checkWithinBoundary(anchorPosition)
+            return PagingState(
+                pages = pages.toList(),
+                anchorPosition = anchorPosition,
+                config = config,
+                leadingPlaceholderCount = getLeadingPlaceholderCount()
+            )
+        }
+    }
+
+    /**
+     * Ensures the anchorPosition is within boundary of loaded data.
+     *
+     * If placeholders are enabled, the provided anchorPosition must be within boundaries of
+     * [0 .. itemCount - 1], which includes placeholders before and after loaded data.
+     *
+     * If placeholders are disabled, the provided anchorPosition must be within boundaries of
+     * [0 .. loaded data size - 1].
+     *
+     * @throws IllegalStateException if anchorPosition is out of bounds
+     */
+    private fun checkWithinBoundary(anchorPosition: Int) {
+        val loadedSize = pages.fold(0) { acc, page ->
+            acc + page.data.size
+        }
+        val maxBoundary = if (config.enablePlaceholders) {
+            (pages.firstOrNull()?.itemsBefore ?: 0) + loadedSize +
+                (pages.lastOrNull()?.itemsAfter ?: 0) - 1
+        } else {
+            loadedSize - 1
+        }
+        check(anchorPosition in 0..maxBoundary) {
+            "anchorPosition $anchorPosition is out of bounds between [0..$maxBoundary]. Please " +
+                "provide a valid anchorPosition."
+        }
+    }
+
+    // Number of placeholders before the first loaded item if placeholders are enabled, otherwise 0.
+    private fun getLeadingPlaceholderCount(): Int {
+        return if (config.enablePlaceholders) {
+            // itemsBefore represents placeholders before first loaded item, and can be
+            // one of three.
+            // 1. valid int if implemented
+            // 2. null if pages empty
+            // 3. COUNT_UNDEFINED if not implemented
+            val itemsBefore: Int? = pages.firstOrNull()?.itemsBefore
+            // finalItemsBefore is `null` if it is either case 2. or 3.
+            val finalItemsBefore = if (itemsBefore == null || itemsBefore == COUNT_UNDEFINED) {
+                null
+            } else {
+                itemsBefore
+            }
+            // This will ultimately return 0 if user didn't implement itemsBefore or if pages
+            // are empty, i.e. user called getPagingState before any loads.
+            finalItemsBefore ?: 0
+        } else {
+            0
+        }
+    }
+
     private fun ensureValidPagingSource() {
         check(!pagingSource.invalid) {
             "This TestPager cannot perform further loads as PagingSource $pagingSource has " +
diff --git a/paging/paging-testing/src/test/kotlin/androidx/paging/testing/TestPagerTest.kt b/paging/paging-testing/src/test/kotlin/androidx/paging/testing/TestPagerTest.kt
index 07112b1..af95c90 100644
--- a/paging/paging-testing/src/test/kotlin/androidx/paging/testing/TestPagerTest.kt
+++ b/paging/paging-testing/src/test/kotlin/androidx/paging/testing/TestPagerTest.kt
@@ -18,12 +18,14 @@
 
 import androidx.paging.PagingConfig
 import androidx.paging.PagingSource.LoadResult
+import androidx.paging.PagingState
 import androidx.paging.TestPagingSource
 import com.google.common.truth.Truth.assertThat
 import kotlin.test.assertFailsWith
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.launch
+import kotlinx.coroutines.test.advanceUntilIdle
 import kotlinx.coroutines.test.runTest
 import org.junit.Assert.assertTrue
 import org.junit.Test
@@ -162,19 +164,42 @@
             assertThat(pages).hasSize(1)
             assertThat(pages).containsExactlyElementsIn(
                 listOf(
-                    LoadResult.Page(
-                        data = listOf(0, 1, 2, 3, 4),
-                        prevKey = null,
-                        nextKey = 5,
-                        itemsBefore = 0,
-                        itemsAfter = 95
-                    )
+                    listOf(0, 1, 2, 3, 4).asPage()
                 )
             ).inOrder()
         }
     }
 
     @Test
+    fun getPages_multiplePages() = runTest {
+        val source = TestPagingSource()
+        val pager = TestPager(source, CONFIG)
+
+        pager.run {
+            refresh(20)
+            prepend()
+        }
+        assertThat(pager.getPages()).containsExactlyElementsIn(
+            listOf(
+                // prepend
+                listOf(17, 18, 19).asPage(),
+                // refresh
+                listOf(20, 21, 22, 23, 24).asPage(),
+            )
+        ).inOrder()
+    }
+
+    @Test
+    fun getPages_fromEmptyList() = runTest {
+        val source = TestPagingSource()
+        val pager = TestPager(source, CONFIG)
+        val pages = pager.run {
+            getPages()
+        }
+        assertThat(pages).isEmpty()
+    }
+
+    @Test
     fun getPages_afterInvalidPagingSource() {
         val source = TestPagingSource()
         val pager = TestPager(source, CONFIG)
@@ -189,26 +214,55 @@
             }
             assertThat(pages).containsExactlyElementsIn(
                 listOf(
-                    LoadResult.Page(
-                        data = listOf(0, 1, 2, 3, 4),
-                        prevKey = null,
-                        nextKey = 5,
-                        itemsBefore = 0,
-                        itemsAfter = 95
-                    ),
-                    LoadResult.Page(
-                        data = listOf(5, 6, 7),
-                        prevKey = 4,
-                        nextKey = 8,
-                        itemsBefore = 5,
-                        itemsAfter = 92
-                    )
+                    listOf(0, 1, 2, 3, 4).asPage(),
+                    listOf(5, 6, 7).asPage()
                 )
             ).inOrder()
         }
     }
 
     @Test
+    fun getPages_multiThread() = runTest {
+        val source = TestPagingSource()
+        val pager = TestPager(source, CONFIG)
+
+        var pages: List<LoadResult.Page<Int, Int>>? = null
+        val job = launch {
+            pager.run {
+                refresh(20) // first
+                pages = getPages() // third
+                prepend() // fifth
+            }
+        }
+        job.start()
+        assertTrue(job.isActive)
+        val pages2 = pager.run {
+            delay(200) // let launch start first
+            append() // second
+            prepend() // fourth
+            getPages() // sixth
+        }
+
+        advanceUntilIdle()
+        assertThat(pages).containsExactlyElementsIn(
+            listOf(
+                // should contain first and second load
+                listOf(20, 21, 22, 23, 24).asPage(), // refresh
+                listOf(25, 26, 27).asPage(), // append
+            )
+        ).inOrder()
+        assertThat(pages2).containsExactlyElementsIn(
+            // should contain all loads
+            listOf(
+                listOf(14, 15, 16).asPage(),
+                listOf(17, 18, 19).asPage(),
+                listOf(20, 21, 22, 23, 24).asPage(),
+                listOf(25, 26, 27).asPage(),
+            )
+        ).inOrder()
+    }
+
+    @Test
     fun multipleRefresh_onSinglePager_throws() {
         val source = TestPagingSource()
         val pager = TestPager(source, CONFIG)
@@ -265,20 +319,8 @@
         assertThat(result.data).containsExactlyElementsIn(listOf(5, 6, 7)).inOrder()
         assertThat(pager.getPages()).containsExactlyElementsIn(
             listOf(
-                LoadResult.Page(
-                    data = listOf(0, 1, 2, 3, 4),
-                    prevKey = null,
-                    nextKey = 5,
-                    itemsBefore = 0,
-                    itemsAfter = 95
-                ),
-                LoadResult.Page(
-                    data = listOf(5, 6, 7),
-                    prevKey = 4,
-                    nextKey = 8,
-                    itemsBefore = 5,
-                    itemsAfter = 92
-                )
+                listOf(0, 1, 2, 3, 4).asPage(),
+                listOf(5, 6, 7).asPage()
             )
         ).inOrder()
     }
@@ -298,21 +340,9 @@
         assertThat(pager.getPages()).containsExactlyElementsIn(
             listOf(
                 // prepend
-                LoadResult.Page(
-                    data = listOf(27, 28, 29),
-                    prevKey = 26,
-                    nextKey = 30,
-                    itemsBefore = 27,
-                    itemsAfter = 70
-                ),
+                listOf(27, 28, 29).asPage(),
                 // refresh
-                LoadResult.Page(
-                    data = listOf(30, 31, 32, 33, 34),
-                    prevKey = 29,
-                    nextKey = 35,
-                    itemsBefore = 30,
-                    itemsAfter = 65
-                ),
+                listOf(30, 31, 32, 33, 34).asPage()
             )
         ).inOrder()
     }
@@ -380,27 +410,9 @@
 
         assertThat(pager.getPages()).containsExactlyElementsIn(
             listOf(
-                LoadResult.Page(
-                    data = listOf(20, 21, 22, 23, 24),
-                    prevKey = 19,
-                    nextKey = 25,
-                    itemsBefore = 20,
-                    itemsAfter = 75
-                ),
-                LoadResult.Page(
-                    data = listOf(25, 26, 27),
-                    prevKey = 24,
-                    nextKey = 28,
-                    itemsBefore = 25,
-                    itemsAfter = 72
-                ),
-                LoadResult.Page(
-                    data = listOf(28, 29, 30),
-                    prevKey = 27,
-                    nextKey = 31,
-                    itemsBefore = 28,
-                    itemsAfter = 69
-                )
+                listOf(20, 21, 22, 23, 24).asPage(),
+                listOf(25, 26, 27).asPage(),
+                listOf(28, 29, 30).asPage()
             )
         ).inOrder()
     }
@@ -420,29 +432,11 @@
         assertThat(pager.getPages()).containsExactlyElementsIn(
             listOf(
                 // 2nd prepend
-                LoadResult.Page(
-                    data = listOf(14, 15, 16),
-                    prevKey = 13,
-                    nextKey = 17,
-                    itemsBefore = 14,
-                    itemsAfter = 83
-                ),
+                listOf(14, 15, 16).asPage(),
                 // 1st prepend
-                LoadResult.Page(
-                    data = listOf(17, 18, 19),
-                    prevKey = 16,
-                    nextKey = 20,
-                    itemsBefore = 17,
-                    itemsAfter = 80
-                ),
+                listOf(17, 18, 19).asPage(),
                 // refresh
-                LoadResult.Page(
-                    data = listOf(20, 21, 22, 23, 24),
-                    prevKey = 19,
-                    nextKey = 25,
-                    itemsBefore = 20,
-                    itemsAfter = 75
-                ),
+                listOf(20, 21, 22, 23, 24).asPage(),
             )
         ).inOrder()
     }
@@ -461,29 +455,11 @@
         assertThat(pager.getPages()).containsExactlyElementsIn(
             listOf(
                 // prepend
-                LoadResult.Page(
-                    data = listOf(17, 18, 19),
-                    prevKey = 16,
-                    nextKey = 20,
-                    itemsBefore = 17,
-                    itemsAfter = 80
-                ),
+                listOf(17, 18, 19).asPage(),
                 // refresh
-                LoadResult.Page(
-                    data = listOf(20, 21, 22, 23, 24),
-                    prevKey = 19,
-                    nextKey = 25,
-                    itemsBefore = 20,
-                    itemsAfter = 75
-                ),
+                listOf(20, 21, 22, 23, 24).asPage(),
                 // append
-                LoadResult.Page(
-                    data = listOf(25, 26, 27),
-                    prevKey = 24,
-                    nextKey = 28,
-                    itemsBefore = 25,
-                    itemsAfter = 72
-                ),
+                listOf(25, 26, 27).asPage(),
             )
         ).inOrder()
     }
@@ -502,29 +478,11 @@
         assertThat(pager.getPages()).containsExactlyElementsIn(
             listOf(
                 // prepend
-                LoadResult.Page(
-                    data = listOf(17, 18, 19),
-                    prevKey = 16,
-                    nextKey = 20,
-                    itemsBefore = 17,
-                    itemsAfter = 80
-                ),
+                listOf(17, 18, 19).asPage(),
                 // refresh
-                LoadResult.Page(
-                    data = listOf(20, 21, 22, 23, 24),
-                    prevKey = 19,
-                    nextKey = 25,
-                    itemsBefore = 20,
-                    itemsAfter = 75
-                ),
+                listOf(20, 21, 22, 23, 24).asPage(),
                 // append
-                LoadResult.Page(
-                    data = listOf(25, 26, 27),
-                    prevKey = 24,
-                    nextKey = 28,
-                    itemsBefore = 25,
-                    itemsAfter = 72
-                ),
+                listOf(25, 26, 27).asPage(),
             )
         ).inOrder()
     }
@@ -554,50 +512,17 @@
             prepend().also { loadOrder.add(4) } // fourth load
         }
 
-        job.invokeOnCompletion {
-            launch {
-                assertThat(loadOrder).containsExactlyElementsIn(listOf(1, 2, 3, 4, 5)).inOrder()
-                assertThat(pager.getPages()).containsExactlyElementsIn(
-                    listOf(
-                        LoadResult.Page(
-                            data = listOf(14, 15, 16),
-                            prevKey = 13,
-                            nextKey = 17,
-                            itemsBefore = 14,
-                            itemsAfter = 83
-                        ),
-                        LoadResult.Page(
-                            data = listOf(17, 18, 19),
-                            prevKey = 16,
-                            nextKey = 20,
-                            itemsBefore = 17,
-                            itemsAfter = 80
-                        ),
-                        LoadResult.Page(
-                            data = listOf(20, 21, 22, 23, 24),
-                            prevKey = 19,
-                            nextKey = 25,
-                            itemsBefore = 20,
-                            itemsAfter = 75
-                        ),
-                        LoadResult.Page(
-                            data = listOf(25, 26, 27),
-                            prevKey = 24,
-                            nextKey = 28,
-                            itemsBefore = 25,
-                            itemsAfter = 72
-                        ),
-                        LoadResult.Page(
-                            data = listOf(28, 29, 30),
-                            prevKey = 27,
-                            nextKey = 31,
-                            itemsBefore = 28,
-                            itemsAfter = 69
-                        ),
-                    )
-                ).inOrder()
-            }
-        }
+        advanceUntilIdle()
+        assertThat(loadOrder).containsExactlyElementsIn(listOf(1, 2, 3, 4, 5)).inOrder()
+        assertThat(pager.getPages()).containsExactlyElementsIn(
+            listOf(
+                listOf(14, 15, 16).asPage(),
+                listOf(17, 18, 19).asPage(),
+                listOf(20, 21, 22, 23, 24).asPage(),
+                listOf(25, 26, 27).asPage(),
+                listOf(28, 29, 30).asPage(),
+            )
+        ).inOrder()
     }
 
     @Test
@@ -630,59 +555,171 @@
             getPages().also { loadOrder.add(6) }
         }
 
-        job.invokeOnCompletion {
-            launch {
-                assertThat(loadOrder).containsExactlyElementsIn(
-                    listOf(1, 2, 3, 4, 5, 6, 7)
-                ).inOrder()
-                assertThat(lastLoadedPage).isEqualTo(
-                    LoadResult.Page(
-                        data = listOf(25, 26, 27),
-                        prevKey = 24,
-                        nextKey = 28,
-                        itemsBefore = 25,
-                        itemsAfter = 72
-                    ),
-                )
-                // should not contain the second prepend, with a total of 4 pages
-                assertThat(pages).containsExactlyElementsIn(
-                    listOf(
-                        LoadResult.Page( // first prepend
-                            data = listOf(17, 18, 19),
-                            prevKey = 16,
-                            nextKey = 20,
-                            itemsBefore = 17,
-                            itemsAfter = 80
-                        ),
-                        LoadResult.Page( // refresh
-                            data = listOf(20, 21, 22, 23, 24),
-                            prevKey = 19,
-                            nextKey = 25,
-                            itemsBefore = 20,
-                            itemsAfter = 75
-                        ),
-                        LoadResult.Page( // first append
-                            data = listOf(25, 26, 27),
-                            prevKey = 24,
-                            nextKey = 28,
-                            itemsBefore = 25,
-                            itemsAfter = 72
-                        ),
-                        LoadResult.Page( // second append
-                            data = listOf(28, 29, 30),
-                            prevKey = 27,
-                            nextKey = 31,
-                            itemsBefore = 28,
-                            itemsAfter = 69
-                        ),
-                    )
-                ).inOrder()
-            }
+        advanceUntilIdle()
+        assertThat(loadOrder).containsExactlyElementsIn(
+            listOf(1, 2, 3, 4, 5, 6, 7)
+        ).inOrder()
+        assertThat(lastLoadedPage).isEqualTo(
+            listOf(25, 26, 27).asPage(),
+        )
+        // should not contain the second prepend, with a total of 4 pages
+        assertThat(pages).containsExactlyElementsIn(
+            listOf(
+                listOf(17, 18, 19).asPage(), // first prepend
+                listOf(20, 21, 22, 23, 24).asPage(), // refresh
+                listOf(25, 26, 27).asPage(), // first append
+                listOf(28, 29, 30).asPage(), // second append
+            )
+        ).inOrder()
+    }
+
+    @Test
+    fun getPagingStateWithAnchorPosition_placeHoldersEnabled() = runTest {
+        val source = TestPagingSource()
+        val pager = TestPager(source, CONFIG)
+
+        val state = pager.run {
+            refresh(20)
+            prepend()
+            append()
+            getPagingState(7)
         }
+        assertThat(state).isEqualTo(
+            PagingState(
+                pages = listOf(
+                    listOf(17, 18, 19).asPage(),
+                    // refresh
+                    listOf(20, 21, 22, 23, 24).asPage(),
+                    // append
+                    listOf(25, 26, 27).asPage(),
+                ),
+                anchorPosition = 7,
+                config = CONFIG,
+                leadingPlaceholderCount = 17
+            )
+        )
+    }
+
+    @Test
+    fun getPagingStateWithAnchorPosition_placeHoldersDisabled() = runTest {
+        val source = TestPagingSource(placeholdersEnabled = false)
+        val config = PagingConfig(
+            pageSize = 3,
+            initialLoadSize = 5,
+            enablePlaceholders = false
+        )
+        val pager = TestPager(source, config)
+
+        val state = pager.run {
+            refresh(20)
+            prepend()
+            append()
+            getPagingState(7)
+        }
+        assertThat(state).isEqualTo(
+            PagingState(
+                pages = listOf(
+                    listOf(17, 18, 19).asPage(placeholdersEnabled = false),
+                    // refresh
+                    listOf(20, 21, 22, 23, 24).asPage(placeholdersEnabled = false),
+                    // append
+                    listOf(25, 26, 27).asPage(placeholdersEnabled = false),
+                ),
+                anchorPosition = 7,
+                config = config,
+                leadingPlaceholderCount = 0
+            )
+        )
+    }
+
+    @Test
+    fun getPagingStateWithAnchorPosition_indexOutOfBoundsWithPlaceholders() = runTest {
+        val source = TestPagingSource()
+        val pager = TestPager(source, CONFIG)
+
+        val msg = assertFailsWith<IllegalStateException> {
+            pager.run {
+                refresh()
+                append()
+                getPagingState(-1)
+            }
+        }.localizedMessage
+        assertThat(msg).isEqualTo(
+            "anchorPosition -1 is out of bounds between [0..${ITEM_COUNT - 1}]. Please " +
+                "provide a valid anchorPosition."
+        )
+
+        val msg2 = assertFailsWith<IllegalStateException> {
+            pager.run {
+                getPagingState(ITEM_COUNT)
+            }
+        }.localizedMessage
+        assertThat(msg2).isEqualTo(
+            "anchorPosition $ITEM_COUNT is out of bounds between [0..${ITEM_COUNT - 1}]. " +
+                "Please provide a valid anchorPosition."
+        )
+    }
+
+    @Test
+    fun getPagingStateWithAnchorPosition_indexOutOfBoundsWithoutPlaceholders() = runTest {
+        val source = TestPagingSource()
+        val pager = TestPager(
+            source,
+            PagingConfig(
+                pageSize = 3,
+                initialLoadSize = 5,
+                enablePlaceholders = false
+            )
+        )
+
+        val msg = assertFailsWith<IllegalStateException> {
+            pager.run {
+                refresh()
+                append()
+                getPagingState(-1)
+            }
+        }.localizedMessage
+        assertThat(msg).isEqualTo(
+            "anchorPosition -1 is out of bounds between [0..7]. Please " +
+                "provide a valid anchorPosition."
+        )
+
+        // total loaded items = 8, anchorPos with index 8 should be out of bounds
+        val msg2 = assertFailsWith<IllegalStateException> {
+            pager.run {
+                getPagingState(8)
+            }
+        }.localizedMessage
+        assertThat(msg2).isEqualTo(
+            "anchorPosition 8 is out of bounds between [0..7]. Please " +
+        "provide a valid anchorPosition."
+        )
     }
 
     private val CONFIG = PagingConfig(
         pageSize = 3,
         initialLoadSize = 5,
     )
+
+    private fun List<Int>.asPage(placeholdersEnabled: Boolean = true): LoadResult.Page<Int, Int> {
+        val itemsBefore = if (placeholdersEnabled) {
+            if (first() == 0) 0 else first()
+        } else {
+            Int.MIN_VALUE
+        }
+        val itemsAfter = if (placeholdersEnabled) {
+            if (last() == ITEM_COUNT - 1) 0 else ITEM_COUNT - 1 - last()
+        } else {
+            Int.MIN_VALUE
+        }
+        return LoadResult.Page(
+            data = this,
+            prevKey = if (first() == 0) null else first() - 1,
+            nextKey = if (last() == ITEM_COUNT - 1) null else last() + 1,
+            itemsBefore = itemsBefore,
+            itemsAfter = itemsAfter
+        )
+    }
+
+    private val ITEM_COUNT = 100
 }
\ No newline at end of file
diff --git a/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/AnchorTest.kt b/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/AnchorTest.kt
new file mode 100644
index 0000000..4f3f8e7
--- /dev/null
+++ b/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/AnchorTest.kt
@@ -0,0 +1,144 @@
+/*
+ * Copyright 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 androidx.recyclerview.widget
+
+import android.view.View
+import android.view.ViewGroup
+import android.widget.FrameLayout
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.MediumTest
+import androidx.test.platform.app.InstrumentationRegistry
+import com.google.common.truth.Truth.assertThat
+import kotlin.coroutines.resume
+import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.runBlocking
+import kotlinx.coroutines.suspendCancellableCoroutine
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@MediumTest
+@RunWith(AndroidJUnit4::class)
+class AnchorTest : BaseRecyclerViewInstrumentationTest() {
+
+    @Test
+    fun noAnchoringWhenViewportNotFilled(): Unit = runBlocking(Dispatchers.Main) {
+        val mainAdapter = AnchorTestAdapter(0)
+        // This simulates a loading spinning added to the end via ConcatAdapter, such as Paging does
+        val suffixAdapter = AnchorTestAdapter(1)
+        val concatAdapter = ConcatAdapter(mainAdapter, suffixAdapter)
+
+        val context = InstrumentationRegistry.getInstrumentation().context
+        val layoutManager = LinearLayoutManager(
+            context,
+            LinearLayoutManager.VERTICAL,
+            false
+        )
+        mRecyclerView = RecyclerView(context)
+        mRecyclerView.layoutParams = TestedFrameLayout.FullControlLayoutParams(100, 100)
+        mRecyclerView.adapter = concatAdapter
+        mRecyclerView.layoutManager = layoutManager
+        activity.container.addView(mRecyclerView)
+        mRecyclerView.awaitLayout()
+
+        assertThat(layoutManager.findFirstVisibleItemPosition()).isEqualTo(0)
+        assertThat(layoutManager.findLastVisibleItemPosition()).isEqualTo(0)
+
+        mainAdapter.numItems = 20
+        mRecyclerView.awaitLayout()
+        // Before this was fixed, this would anchor to the "spinner" and end up at the
+        // bottom of the list (first visible item would be 11)
+        assertThat(layoutManager.findFirstVisibleItemPosition()).isEqualTo(0)
+        assertThat(layoutManager.findLastVisibleItemPosition()).isEqualTo(9)
+    }
+
+    @Test
+    fun noAnchoringWhenFillingWrapContentRecyclerView(): Unit = runBlocking(Dispatchers.Main) {
+        val mainAdapter = AnchorTestAdapter(0)
+        // This simulates a loading spinning added to the end via ConcatAdapter, such as Paging does
+        val suffixAdapter = AnchorTestAdapter(1)
+        val concatAdapter = ConcatAdapter(mainAdapter, suffixAdapter)
+
+        val context = InstrumentationRegistry.getInstrumentation().context
+        val layoutManager = LinearLayoutManager(
+            context,
+            LinearLayoutManager.VERTICAL,
+            false
+        )
+
+        val frame = FrameLayout(context)
+        frame.layoutParams = TestedFrameLayout.FullControlLayoutParams(100, 100)
+        mRecyclerView = RecyclerView(context)
+        mRecyclerView.layoutParams =
+            FrameLayout.LayoutParams(100, ViewGroup.LayoutParams.WRAP_CONTENT)
+        mRecyclerView.adapter = concatAdapter
+        mRecyclerView.layoutManager = layoutManager
+        frame.addView(mRecyclerView)
+        activity.container.addView(frame)
+        mRecyclerView.awaitLayout()
+
+        assertThat(layoutManager.findFirstVisibleItemPosition()).isEqualTo(0)
+        assertThat(layoutManager.findLastVisibleItemPosition()).isEqualTo(0)
+
+        mainAdapter.numItems = 20
+        mRecyclerView.awaitLayout()
+
+        // Before this was fixed, this would anchor to the "spinner" and end up at the
+        // bottom of the list (first visible item would be 11)
+        assertThat(layoutManager.findFirstVisibleItemPosition()).isEqualTo(0)
+        assertThat(layoutManager.findLastVisibleItemPosition()).isEqualTo(9)
+    }
+
+    private class AnchorTestAdapter(length: Int) :
+        RecyclerView.Adapter<AnchorTestAdapter.ViewHolder>() {
+        class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
+
+        var numItems: Int = length
+            set(value) {
+                val old = field
+                val diff = value - old
+                if (diff < 0) {
+                    TODO("Length reduction not supported")
+                }
+                field = value
+                notifyItemRangeInserted(old, diff)
+            }
+
+        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
+            val lp = RecyclerView.LayoutParams(10, 10)
+            val v = View(parent.context)
+            v.layoutParams = lp
+            return ViewHolder(v)
+        }
+
+        override fun getItemCount(): Int = numItems
+
+        override fun onBindViewHolder(holder: ViewHolder, position: Int) {
+        }
+    }
+}
+
+private suspend fun View.awaitLayout() {
+    suspendCancellableCoroutine { continuation ->
+        val runnable = Runnable {
+            continuation.resume(Unit)
+        }
+        continuation.invokeOnCancellation {
+            this.removeCallbacks(runnable)
+        }
+        this.post(runnable)
+    }
+}
\ No newline at end of file
diff --git a/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/LinearLayoutManagerMeasureAnchorTest.kt b/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/LinearLayoutManagerMeasureAnchorTest.kt
new file mode 100644
index 0000000..0fca345
--- /dev/null
+++ b/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/LinearLayoutManagerMeasureAnchorTest.kt
@@ -0,0 +1,120 @@
+/*
+ * Copyright 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 androidx.recyclerview.widget
+
+import android.content.Context
+import android.view.View
+import android.view.ViewGroup
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import androidx.test.filters.SmallTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import java.lang.IllegalArgumentException
+
+@RunWith(AndroidJUnit4::class)
+@SmallTest
+public class LinearLayoutManagerMeasureAnchorTest {
+
+    @Test
+    public fun testStackFromEndVertical() {
+        test(true, false, true)
+    }
+
+    @Test
+    public fun testReverseLayoutVertical() {
+        test(false, true, true)
+    }
+
+    @Test
+    public fun testStackFromEndHorizontal() {
+        test(true, false, false)
+    }
+
+    @Test
+    public fun testReverseLayoutHorizontal() {
+        test(false, true, false)
+    }
+
+    public fun test(reverseLayout: Boolean, stackFromEnd: Boolean, vertical: Boolean) {
+
+        if (!(reverseLayout xor stackFromEnd)) {
+            throw IllegalArgumentException("Must be reverseLayout xor stackFromEnd")
+        }
+
+        // Arrange
+
+        val context = ApplicationProvider.getApplicationContext<Context>()
+        val recyclerView = RecyclerView(context)
+        val orientation = if (vertical) RecyclerView.VERTICAL else RecyclerView.HORIZONTAL
+        recyclerView.layoutManager =
+            LinearLayoutManager(context, orientation, reverseLayout).apply {
+                this.stackFromEnd = stackFromEnd
+            }
+        recyclerView.adapter = TestAdapter(context, vertical)
+
+        // Act
+
+        recyclerView.measure(
+            View.MeasureSpec.makeMeasureSpec(200, View.MeasureSpec.AT_MOST),
+            View.MeasureSpec.makeMeasureSpec(200, View.MeasureSpec.AT_MOST)
+        )
+        recyclerView.measure(
+            View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.AT_MOST),
+            View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.AT_MOST)
+        )
+        recyclerView.layout(0, 0, 100, 100)
+
+        // Assert
+
+        val view: View? =
+            (0 until recyclerView.childCount)
+                .map { recyclerView.getChildAt(it) }
+                .find { it.tag == if (reverseLayout) 0 else 9 }
+
+        assertThat(view).isNotNull()
+        if (vertical) {
+            assertThat(view!!.top).isEqualTo(0)
+        } else {
+            assertThat(view!!.left).isEqualTo(0)
+        }
+    }
+
+    internal class TestAdapter(val context: Context, val vertical: Boolean) :
+        RecyclerView.Adapter<TestViewHolder>() {
+
+        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TestViewHolder {
+            val view = View(context)
+            view.layoutParams = if (vertical) {
+                ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 100)
+            } else {
+                ViewGroup.LayoutParams(100, ViewGroup.LayoutParams.MATCH_PARENT)
+            }
+            return TestViewHolder(view)
+        }
+
+        override fun onBindViewHolder(holder: TestViewHolder, position: Int) {
+            holder.itemView.tag = position
+        }
+
+        override fun getItemCount(): Int {
+            return 10
+        }
+    }
+
+    internal class TestViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
+}
\ No newline at end of file
diff --git a/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/RecyclerViewPreviousMeasuredDimensionsTest.kt b/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/RecyclerViewPreviousMeasuredDimensionsTest.kt
new file mode 100644
index 0000000..3b42020
--- /dev/null
+++ b/recyclerview/recyclerview/src/androidTest/java/androidx/recyclerview/widget/RecyclerViewPreviousMeasuredDimensionsTest.kt
@@ -0,0 +1,149 @@
+/*
+ * Copyright 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 androidx.recyclerview.widget
+
+import android.content.Context
+import android.view.View
+import android.view.View.MeasureSpec.UNSPECIFIED
+import android.view.View.MeasureSpec.AT_MOST
+import android.view.View.MeasureSpec.EXACTLY
+import android.view.ViewGroup
+import androidx.test.core.app.ApplicationProvider
+import androidx.test.filters.SmallTest
+import com.google.common.truth.Truth.assertThat
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.Parameterized
+
+@RunWith(Parameterized::class)
+@SmallTest
+public class RecyclerViewPreviousMeasuredDimensionsTest(
+    private val firstWidthMode: Int,
+    private val firstHeightMode: Int,
+    private val secondWidthMode: Int,
+    private val secondHeightMode: Int
+) {
+
+    public companion object {
+        @JvmStatic
+        @Parameterized.Parameters(
+            name = "firstWidthMode={0}, firstHeightMode={1}, " +
+                "secondWidthMode={2}, secondHeightMode={3}"
+        )
+        public fun data(): Collection<Array<Int>> {
+            val widthModes = listOf(
+                UNSPECIFIED,
+                EXACTLY,
+                AT_MOST
+            )
+
+            val data = ArrayList<Array<Int>>()
+            for (firstWidthMode in widthModes) {
+                for (firstHeightMode in widthModes) {
+                    for (secondWidthMode in widthModes) {
+                        for (secondHeightMode in widthModes) {
+                            data.add(
+                                listOf(
+                                    firstWidthMode,
+                                    firstHeightMode,
+                                    secondWidthMode,
+                                    secondHeightMode
+                                ).toTypedArray()
+                            )
+                        }
+                    }
+                }
+            }
+            return data
+        }
+    }
+
+    @Test
+    public fun previousMeasuredDimensionTest() {
+
+        // Arrange
+
+        val context = ApplicationProvider.getApplicationContext<Context>()
+        val recyclerView = RecyclerView(context)
+        recyclerView.layoutManager =
+            LinearLayoutManager(context).apply {
+                this.stackFromEnd = stackFromEnd
+            }
+        recyclerView.adapter = TestAdapter(context)
+
+        // Assert 0
+
+        assertThat(recyclerView.mState.previousMeasuredWidth).isEqualTo(0)
+        assertThat(recyclerView.mState.previousMeasuredHeight).isEqualTo(0)
+
+        // Act 1
+
+        recyclerView.measure(
+            View.MeasureSpec.makeMeasureSpec(100, firstWidthMode),
+            View.MeasureSpec.makeMeasureSpec(100, firstHeightMode)
+        )
+
+        // Assert 1
+
+        val expectedPreviousWidth1 = if (firstWidthMode == UNSPECIFIED) 300 else 100
+        val expectedPreviousHeight1 = if (firstHeightMode == UNSPECIFIED) 300 else 100
+        assertThat(recyclerView.mState.previousMeasuredWidth).isEqualTo(expectedPreviousWidth1)
+        assertThat(recyclerView.mState.previousMeasuredHeight).isEqualTo(expectedPreviousHeight1)
+
+        // Act 2
+
+        recyclerView.measure(
+            View.MeasureSpec.makeMeasureSpec(200, secondWidthMode),
+            View.MeasureSpec.makeMeasureSpec(200, secondHeightMode)
+        )
+
+        // Assert 2
+
+        val expectedPreviousWidth2 = if (secondWidthMode == UNSPECIFIED) 300 else 200
+        val expectedPreviousHeight2 = if (secondHeightMode == UNSPECIFIED) 300 else 200
+        assertThat(recyclerView.mState.previousMeasuredWidth).isEqualTo(expectedPreviousWidth2)
+        assertThat(recyclerView.mState.previousMeasuredHeight).isEqualTo(expectedPreviousHeight2)
+
+        // Act 3, layout should not have any affect on previous measured values.
+
+        recyclerView.layout(0, 0, 500, 500)
+
+        // Assert 3
+
+        assertThat(recyclerView.mState.previousMeasuredWidth).isEqualTo(expectedPreviousWidth2)
+        assertThat(recyclerView.mState.previousMeasuredHeight).isEqualTo(expectedPreviousHeight2)
+    }
+
+    internal class TestAdapter(val context: Context) :
+        RecyclerView.Adapter<TestViewHolder>() {
+
+        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TestViewHolder {
+            val view = View(context)
+            view.layoutParams = ViewGroup.LayoutParams(300, 300)
+            return TestViewHolder(view)
+        }
+
+        override fun onBindViewHolder(holder: TestViewHolder, position: Int) {
+            holder.itemView.tag = position
+        }
+
+        override fun getItemCount(): Int {
+            return 1
+        }
+    }
+
+    internal class TestViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)
+}
\ No newline at end of file
diff --git a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/GridLayoutManager.java b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/GridLayoutManager.java
index 01935b5..4c4aba2 100644
--- a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/GridLayoutManager.java
+++ b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/GridLayoutManager.java
@@ -964,6 +964,9 @@
         /**
          * Returns the final span index of the provided position.
          * <p>
+         * If {@link #getOrientation()} is {@link #VERTICAL}, this is a column value.
+         * If {@link #getOrientation()} is {@link #HORIZONTAL}, this is a row value.
+         * <p>
          * If you have a faster way to calculate span index for your items, you should override
          * this method. Otherwise, you should enable span index cache
          * ({@link #setSpanIndexCacheEnabled(boolean)}) for better performance. When caching is
@@ -1040,6 +1043,9 @@
         /**
          * Returns the index of the group this position belongs.
          * <p>
+         * If {@link #getOrientation()} is {@link #VERTICAL}, this is a row value.
+         * If {@link #getOrientation()} is {@link #HORIZONTAL}, this is a column value.
+         * <p>
          * For example, if grid has 3 columns and each item occupies 1 span, span group index
          * for item 1 will be 0, item 5 will be 1.
          *
diff --git a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/LinearLayoutManager.java b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/LinearLayoutManager.java
index 22fd533..c7b7852 100644
--- a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/LinearLayoutManager.java
+++ b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/LinearLayoutManager.java
@@ -85,6 +85,30 @@
      */
     private boolean mLastStackFromEnd;
 
+    /**
+     * Whether the last layout filled the entire viewport
+     *
+     * If the last layout did not fill the viewport, we should not attempt to calculate an
+     * anchoring based on the current children (other than if one is focused), because there
+     * isn't any scrolling that could have occurred that would indicate a position in the list
+     * that needs to be preserved - and in fact, trying to do so could produce the wrong result,
+     * such as the case of anchoring to a loading spinner at the end of the list.
+     */
+    private boolean mLastLayoutFilledViewport = false;
+
+    /**
+     * Whether the *current* layout filled the entire viewport
+     *
+     * This is used to populate mLastLayoutFilledViewport. It exists as a separate variable
+     * because we need to populate it at the correct moment, which is tricky due to the
+     * LayoutManager layout being called multiple times.  We want to not set it in prelayout
+     * (because that's not the real layout), but we want to set it the *first* time that the
+     * actual layout is run, because for certain non-exact layout cases, there are two passes,
+     * with the second pass being provided an EXACTLY spec (when the actual spec was non-exact).
+     * This would otherwise incorrectly believe the viewport was filled, because it was provided
+     * just enough space to contain the content, and thus it would always fill the viewport.
+     */
+    private Boolean mThisLayoutFilledViewport = null;
 
     /**
      * Defines if layout should be calculated from end to start.
@@ -571,11 +595,26 @@
         // resolve layout direction
         resolveShouldLayoutReverse();
 
+        boolean layoutFromEnd = mShouldReverseLayout ^ mStackFromEnd;
+
+        // The 2 booleans below are necessary because if we are laying out from the end, and the
+        // previous measured dimension is different from the new measured value, then any
+        // previously calculated anchor will be incorrect.
+        boolean reCalcAnchorDueToVertical = layoutFromEnd
+                && getOrientation() == RecyclerView.VERTICAL
+                && state.getPreviousMeasuredHeight() != getHeight();
+        boolean reCalcAnchorDueToHorizontal = layoutFromEnd
+                && getOrientation() == RecyclerView.HORIZONTAL
+                && state.getPreviousMeasuredWidth() != getWidth();
+
+        boolean reCalcAnchor = reCalcAnchorDueToVertical || reCalcAnchorDueToHorizontal
+                || mPendingScrollPosition != RecyclerView.NO_POSITION || mPendingSavedState != null;
+
         final View focused = getFocusedChild();
-        if (!mAnchorInfo.mValid || mPendingScrollPosition != RecyclerView.NO_POSITION
-                || mPendingSavedState != null) {
+
+        if (!mAnchorInfo.mValid || reCalcAnchor) {
             mAnchorInfo.reset();
-            mAnchorInfo.mLayoutFromEnd = mShouldReverseLayout ^ mStackFromEnd;
+            mAnchorInfo.mLayoutFromEnd = layoutFromEnd;
             // calculate anchor position and coordinate
             updateAnchorInfoForLayout(recycler, state, mAnchorInfo);
             mAnchorInfo.mValid = true;
@@ -714,13 +753,17 @@
             // because layout from end may be changed by scroll to position
             // we re-calculate it.
             // find which side we should check for gaps.
-            if (mShouldReverseLayout ^ mStackFromEnd) {
+            if (layoutFromEnd) {
                 int fixOffset = fixLayoutEndGap(endOffset, recycler, state, true);
                 startOffset += fixOffset;
                 endOffset += fixOffset;
                 fixOffset = fixLayoutStartGap(startOffset, recycler, state, false);
                 startOffset += fixOffset;
                 endOffset += fixOffset;
+                if (!state.isPreLayout() && mThisLayoutFilledViewport == null) {
+                    mThisLayoutFilledViewport =
+                            (startOffset <= mOrientationHelper.getStartAfterPadding());
+                }
             } else {
                 int fixOffset = fixLayoutStartGap(startOffset, recycler, state, true);
                 startOffset += fixOffset;
@@ -728,6 +771,10 @@
                 fixOffset = fixLayoutEndGap(endOffset, recycler, state, false);
                 startOffset += fixOffset;
                 endOffset += fixOffset;
+                if (!state.isPreLayout() && mThisLayoutFilledViewport == null) {
+                    mThisLayoutFilledViewport =
+                            (endOffset >= mOrientationHelper.getEndAfterPadding());
+                }
             }
         }
         layoutForPredictiveAnimations(recycler, state, startOffset, endOffset);
@@ -749,6 +796,8 @@
         mPendingSavedState = null; // we don't need this anymore
         mPendingScrollPosition = RecyclerView.NO_POSITION;
         mPendingScrollPositionOffset = INVALID_OFFSET;
+        mLastLayoutFilledViewport = mThisLayoutFilledViewport != null && mThisLayoutFilledViewport;
+        mThisLayoutFilledViewport = null;
         mAnchorInfo.reset();
     }
 
@@ -858,11 +907,19 @@
         if (getChildCount() == 0) {
             return false;
         }
+
         final View focused = getFocusedChild();
         if (focused != null && anchorInfo.isViewValidAsAnchor(focused, state)) {
             anchorInfo.assignFromViewAndKeepVisibleRect(focused, getPosition(focused));
             return true;
         }
+
+        // If we did not fill the layout, don't anchor. This prevents, for example,
+        // anchoring to the bottom of the list when there is a loading indicator.
+        if (!mLastLayoutFilledViewport) {
+            return false;
+        }
+
         if (mLastStackFromEnd != mStackFromEnd) {
             return false;
         }
diff --git a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/RecyclerView.java b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/RecyclerView.java
index df4de2d..866b4c4 100644
--- a/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/RecyclerView.java
+++ b/recyclerview/recyclerview/src/main/java/androidx/recyclerview/widget/RecyclerView.java
@@ -2226,7 +2226,7 @@
 
     /**
      * <p>Compute the horizontal offset of the horizontal scrollbar's thumb within the horizontal
-     * range. This value is used to compute the length of the thumb within the scrollbar's track.
+     * range. This value is used to compute the position of the thumb within the scrollbar's track.
      * </p>
      *
      * <p>The range is expressed in arbitrary units that must be the same as the units used by
@@ -2287,7 +2287,7 @@
      * {@link RecyclerView.LayoutManager#computeHorizontalScrollRange(RecyclerView.State)} in your
      * LayoutManager.</p>
      *
-     * @return The total horizontal range represented by the vertical scrollbar
+     * @return The total horizontal range represented by the horizontal scrollbar
      * @see RecyclerView.LayoutManager#computeHorizontalScrollRange(RecyclerView.State)
      */
     @Override
@@ -2300,7 +2300,7 @@
 
     /**
      * <p>Compute the vertical offset of the vertical scrollbar's thumb within the vertical range.
-     * This value is used to compute the length of the thumb within the scrollbar's track. </p>
+     * This value is used to compute the position of the thumb within the scrollbar's track. </p>
      *
      * <p>The range is expressed in arbitrary units that must be the same as the units used by
      * {@link #computeVerticalScrollRange()} and {@link #computeVerticalScrollExtent()}.</p>
@@ -3946,6 +3946,12 @@
 
     @Override
     protected void onMeasure(int widthSpec, int heightSpec) {
+        internalOnMeasure(widthSpec, heightSpec);
+        mState.mPreviousMeasuredWidth = this.getMeasuredWidth();
+        mState.mPreviousMeasuredHeight = this.getMeasuredHeight();
+    }
+
+    private void internalOnMeasure(int widthSpec, int heightSpec) {
         if (mLayout == null) {
             defaultOnMeasure(widthSpec, heightSpec);
             return;
@@ -10893,7 +10899,7 @@
          * <p>Default implementation returns 0.</p>
          *
          * @param state Current State of RecyclerView where you can find total item count
-         * @return The total horizontal range represented by the vertical scrollbar
+         * @return The total horizontal range represented by the horizontal scrollbar
          * @see RecyclerView#computeHorizontalScrollRange()
          */
         public int computeHorizontalScrollRange(@NonNull State state) {
@@ -13296,6 +13302,42 @@
         boolean mRunPredictiveAnimations = false;
 
         /**
+         * The values in these fields reflect the values passed to
+         * {@link RecyclerView#setMeasuredDimension(int, int)} and are set just before
+         * {@link RecyclerView#onMeasure(int, int)} is completed. They are intended to be used to
+         * during onMeasure(int, int) to know how the RecyclerView was measured during previous
+         * calls to onMeasure(int, int).
+         */
+        int mPreviousMeasuredWidth = 0;
+        int mPreviousMeasuredHeight = 0;
+
+        // TODO(b/181991552): Make this public after 1.2.0 stable.
+        /**
+         * Returns the previously measured width of the {@link RecyclerView} that was most
+         * recently set via {@link RecyclerView#setMeasuredDimension(int, int)} during the most
+         * recent call to {@link RecyclerView#onMeasure(int, int)}. This is intended to be used
+         * during {@link LayoutManager#onLayoutChildren(Recycler, State)} when
+         * {@link State#isMeasuring()} is {@code true} in order to understand how the current
+         * measure specs compare to the result of any previous measurement.
+         */
+        int getPreviousMeasuredWidth() {
+            return mPreviousMeasuredWidth;
+        }
+
+        // TODO(b/181991552): Make this public after 1.2.0 stable.
+        /**
+         * Returns the previously measured height of the {@link RecyclerView} that was most
+         * recently set via {@link RecyclerView#setMeasuredDimension(int, int)} during the most
+         * recent call to {@link RecyclerView#onMeasure(int, int)}. This is intended to be used
+         * during {@link LayoutManager#onLayoutChildren(Recycler, State)} when
+         * {@link State#isMeasuring()} is {@code true} in order to understand how the current
+         * measure specs compare to the result of any previous measurement.
+         */
+        int getPreviousMeasuredHeight() {
+            return mPreviousMeasuredHeight;
+        }
+
+        /**
          * This data is saved before a layout calculation happens. After the layout is finished,
          * if the previously focused view has been replaced with another view for the same item, we
          * move the focus to the new item automatically.
diff --git a/room/room-common/api/2.5.0-beta01.txt b/room/room-common/api/2.5.0-beta01.txt
new file mode 100644
index 0000000..8e1573a
--- /dev/null
+++ b/room/room-common/api/2.5.0-beta01.txt
@@ -0,0 +1,412 @@
+// Signature format: 4.0
+package androidx.room {
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface AutoMigration {
+    method public abstract int from();
+    method public abstract kotlin.reflect.KClass<?> spec() default java.lang.Object;
+    method public abstract int to();
+    property public abstract int from;
+    property public abstract kotlin.reflect.KClass<?> spec;
+    property public abstract int to;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={}) public @interface BuiltInTypeConverters {
+    method public abstract androidx.room.BuiltInTypeConverters.State enums() default androidx.room.BuiltInTypeConverters.State.INHERITED;
+    method public abstract androidx.room.BuiltInTypeConverters.State uuid() default androidx.room.BuiltInTypeConverters.State.INHERITED;
+    property public abstract androidx.room.BuiltInTypeConverters.State enums;
+    property public abstract androidx.room.BuiltInTypeConverters.State uuid;
+  }
+
+  public enum BuiltInTypeConverters.State {
+    method public static androidx.room.BuiltInTypeConverters.State valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.room.BuiltInTypeConverters.State[] values();
+    enum_constant public static final androidx.room.BuiltInTypeConverters.State DISABLED;
+    enum_constant public static final androidx.room.BuiltInTypeConverters.State ENABLED;
+    enum_constant public static final androidx.room.BuiltInTypeConverters.State INHERITED;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.FUNCTION}) public @interface ColumnInfo {
+    method @androidx.room.ColumnInfo.Collate public abstract int collate() default androidx.room.ColumnInfo.UNSPECIFIED;
+    method public abstract String defaultValue() default androidx.room.ColumnInfo.VALUE_UNSPECIFIED;
+    method public abstract boolean index() default false;
+    method public abstract String name() default androidx.room.ColumnInfo.INHERIT_FIELD_NAME;
+    method @androidx.room.ColumnInfo.SQLiteTypeAffinity public abstract int typeAffinity() default androidx.room.ColumnInfo.UNDEFINED;
+    property @androidx.room.ColumnInfo.Collate public abstract int collate;
+    property public abstract String defaultValue;
+    property public abstract boolean index;
+    property public abstract String name;
+    property @androidx.room.ColumnInfo.SQLiteTypeAffinity public abstract int typeAffinity;
+    field public static final int BINARY = 2; // 0x2
+    field public static final int BLOB = 5; // 0x5
+    field public static final androidx.room.ColumnInfo.Companion Companion;
+    field public static final String INHERIT_FIELD_NAME = "[field-name]";
+    field public static final int INTEGER = 3; // 0x3
+    field @RequiresApi(21) public static final int LOCALIZED = 5; // 0x5
+    field public static final int NOCASE = 3; // 0x3
+    field public static final int REAL = 4; // 0x4
+    field public static final int RTRIM = 4; // 0x4
+    field public static final int TEXT = 2; // 0x2
+    field public static final int UNDEFINED = 1; // 0x1
+    field @RequiresApi(21) public static final int UNICODE = 6; // 0x6
+    field public static final int UNSPECIFIED = 1; // 0x1
+    field public static final String VALUE_UNSPECIFIED = "[value-unspecified]";
+  }
+
+  @IntDef({androidx.room.ColumnInfo.UNSPECIFIED, androidx.room.ColumnInfo.BINARY, androidx.room.ColumnInfo.NOCASE, androidx.room.ColumnInfo.RTRIM, androidx.room.ColumnInfo.LOCALIZED, androidx.room.ColumnInfo.UNICODE}) @RequiresApi(21) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public static @interface ColumnInfo.Collate {
+  }
+
+  public static final class ColumnInfo.Companion {
+    field public static final int BINARY = 2; // 0x2
+    field public static final int BLOB = 5; // 0x5
+    field public static final String INHERIT_FIELD_NAME = "[field-name]";
+    field public static final int INTEGER = 3; // 0x3
+    field @RequiresApi(21) public static final int LOCALIZED = 5; // 0x5
+    field public static final int NOCASE = 3; // 0x3
+    field public static final int REAL = 4; // 0x4
+    field public static final int RTRIM = 4; // 0x4
+    field public static final int TEXT = 2; // 0x2
+    field public static final int UNDEFINED = 1; // 0x1
+    field @RequiresApi(21) public static final int UNICODE = 6; // 0x6
+    field public static final int UNSPECIFIED = 1; // 0x1
+    field public static final String VALUE_UNSPECIFIED = "[value-unspecified]";
+  }
+
+  @IntDef({androidx.room.ColumnInfo.UNDEFINED, androidx.room.ColumnInfo.TEXT, androidx.room.ColumnInfo.INTEGER, androidx.room.ColumnInfo.REAL, androidx.room.ColumnInfo.BLOB}) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public static @interface ColumnInfo.SQLiteTypeAffinity {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface Dao {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface Database {
+    method public abstract androidx.room.AutoMigration[] autoMigrations();
+    method public abstract kotlin.reflect.KClass<?>[] entities();
+    method public abstract boolean exportSchema() default true;
+    method public abstract int version();
+    method public abstract kotlin.reflect.KClass<?>[] views();
+    property public abstract androidx.room.AutoMigration[] autoMigrations;
+    property public abstract kotlin.reflect.KClass<?>[] entities;
+    property public abstract boolean exportSchema;
+    property public abstract int version;
+    property public abstract kotlin.reflect.KClass<?>[] views;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface DatabaseView {
+    method public abstract String value() default "";
+    method public abstract String viewName() default "";
+    property public abstract String value;
+    property public abstract String viewName;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.FUNCTION) public @interface Delete {
+    method public abstract kotlin.reflect.KClass<?> entity() default java.lang.Object;
+    property public abstract kotlin.reflect.KClass<?> entity;
+  }
+
+  @java.lang.annotation.Repeatable(DeleteColumn.Entries::class) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface DeleteColumn {
+    method public abstract String columnName();
+    method public abstract String tableName();
+    property public abstract String columnName;
+    property public abstract String tableName;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public static @interface DeleteColumn.Entries {
+    method public abstract androidx.room.DeleteColumn[] value();
+    property public abstract androidx.room.DeleteColumn[] value;
+  }
+
+  @java.lang.annotation.Repeatable(DeleteTable.Entries::class) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface DeleteTable {
+    method public abstract String tableName();
+    property public abstract String tableName;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public static @interface DeleteTable.Entries {
+    method public abstract androidx.room.DeleteTable[] value();
+    property public abstract androidx.room.DeleteTable[] value;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.FUNCTION}) public @interface Embedded {
+    method public abstract String prefix() default "";
+    property public abstract String prefix;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface Entity {
+    method public abstract androidx.room.ForeignKey[] foreignKeys();
+    method public abstract String[] ignoredColumns();
+    method public abstract androidx.room.Index[] indices();
+    method public abstract boolean inheritSuperIndices() default false;
+    method public abstract String[] primaryKeys();
+    method public abstract String tableName() default "";
+    property public abstract androidx.room.ForeignKey[] foreignKeys;
+    property public abstract String[] ignoredColumns;
+    property public abstract androidx.room.Index[] indices;
+    property public abstract boolean inheritSuperIndices;
+    property public abstract String[] primaryKeys;
+    property public abstract String tableName;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={}) public @interface ForeignKey {
+    method public abstract String[] childColumns();
+    method public abstract boolean deferred() default false;
+    method public abstract kotlin.reflect.KClass<?> entity();
+    method @androidx.room.ForeignKey.Action public abstract int onDelete() default androidx.room.ForeignKey.NO_ACTION;
+    method @androidx.room.ForeignKey.Action public abstract int onUpdate() default androidx.room.ForeignKey.NO_ACTION;
+    method public abstract String[] parentColumns();
+    property public abstract String[] childColumns;
+    property public abstract boolean deferred;
+    property public abstract kotlin.reflect.KClass<?> entity;
+    property @androidx.room.ForeignKey.Action public abstract int onDelete;
+    property @androidx.room.ForeignKey.Action public abstract int onUpdate;
+    property public abstract String[] parentColumns;
+    field public static final int CASCADE = 5; // 0x5
+    field public static final androidx.room.ForeignKey.Companion Companion;
+    field public static final int NO_ACTION = 1; // 0x1
+    field public static final int RESTRICT = 2; // 0x2
+    field public static final int SET_DEFAULT = 4; // 0x4
+    field public static final int SET_NULL = 3; // 0x3
+  }
+
+  @IntDef({androidx.room.ForeignKey.NO_ACTION, androidx.room.ForeignKey.RESTRICT, androidx.room.ForeignKey.SET_NULL, androidx.room.ForeignKey.SET_DEFAULT, androidx.room.ForeignKey.CASCADE}) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public static @interface ForeignKey.Action {
+  }
+
+  public static final class ForeignKey.Companion {
+    field public static final int CASCADE = 5; // 0x5
+    field public static final int NO_ACTION = 1; // 0x1
+    field public static final int RESTRICT = 2; // 0x2
+    field public static final int SET_DEFAULT = 4; // 0x4
+    field public static final int SET_NULL = 3; // 0x3
+  }
+
+  @RequiresApi(16) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface Fts3 {
+    method public abstract String tokenizer() default androidx.room.FtsOptions.TOKENIZER_SIMPLE;
+    method public abstract String[] tokenizerArgs();
+    property public abstract String tokenizer;
+    property public abstract String[] tokenizerArgs;
+  }
+
+  @RequiresApi(16) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface Fts4 {
+    method public abstract kotlin.reflect.KClass<?> contentEntity() default java.lang.Object;
+    method public abstract String languageId() default "";
+    method public abstract androidx.room.FtsOptions.MatchInfo matchInfo() default androidx.room.FtsOptions.MatchInfo.FTS4;
+    method public abstract String[] notIndexed();
+    method public abstract androidx.room.FtsOptions.Order order() default androidx.room.FtsOptions.Order.ASC;
+    method public abstract int[] prefix();
+    method public abstract String tokenizer() default androidx.room.FtsOptions.TOKENIZER_SIMPLE;
+    method public abstract String[] tokenizerArgs();
+    property public abstract kotlin.reflect.KClass<?> contentEntity;
+    property public abstract String languageId;
+    property public abstract androidx.room.FtsOptions.MatchInfo matchInfo;
+    property public abstract String[] notIndexed;
+    property public abstract androidx.room.FtsOptions.Order order;
+    property public abstract int[] prefix;
+    property public abstract String tokenizer;
+    property public abstract String[] tokenizerArgs;
+  }
+
+  public final class FtsOptions {
+    field public static final androidx.room.FtsOptions INSTANCE;
+    field public static final String TOKENIZER_ICU = "icu";
+    field public static final String TOKENIZER_PORTER = "porter";
+    field public static final String TOKENIZER_SIMPLE = "simple";
+    field @RequiresApi(21) public static final String TOKENIZER_UNICODE61 = "unicode61";
+  }
+
+  public enum FtsOptions.MatchInfo {
+    method public static androidx.room.FtsOptions.MatchInfo valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.room.FtsOptions.MatchInfo[] values();
+    enum_constant public static final androidx.room.FtsOptions.MatchInfo FTS3;
+    enum_constant public static final androidx.room.FtsOptions.MatchInfo FTS4;
+  }
+
+  public enum FtsOptions.Order {
+    method public static androidx.room.FtsOptions.Order valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.room.FtsOptions.Order[] values();
+    enum_constant public static final androidx.room.FtsOptions.Order ASC;
+    enum_constant public static final androidx.room.FtsOptions.Order DESC;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.CONSTRUCTOR, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER}) public @interface Ignore {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={}) public @interface Index {
+    method public abstract String name() default "";
+    method public abstract androidx.room.Index.Order[] orders();
+    method public abstract boolean unique() default false;
+    method public abstract String[] value();
+    property public abstract String name;
+    property public abstract androidx.room.Index.Order[] orders;
+    property public abstract boolean unique;
+    property public abstract String[] value;
+  }
+
+  public enum Index.Order {
+    method public static androidx.room.Index.Order valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.room.Index.Order[] values();
+    enum_constant public static final androidx.room.Index.Order ASC;
+    enum_constant public static final androidx.room.Index.Order DESC;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.FUNCTION) public @interface Insert {
+    method public abstract kotlin.reflect.KClass<?> entity() default java.lang.Object;
+    method @androidx.room.OnConflictStrategy public abstract int onConflict() default androidx.room.OnConflictStrategy.ABORT;
+    property public abstract kotlin.reflect.KClass<?> entity;
+    property @androidx.room.OnConflictStrategy public abstract int onConflict;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={}) public @interface Junction {
+    method public abstract String entityColumn() default "";
+    method public abstract String parentColumn() default "";
+    method public abstract kotlin.reflect.KClass<?> value();
+    property public abstract String entityColumn;
+    property public abstract String parentColumn;
+    property public abstract kotlin.reflect.KClass<?> value;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.FUNCTION) public @interface MapInfo {
+    method public abstract String keyColumn() default "";
+    method public abstract String keyTable() default "";
+    method public abstract String valueColumn() default "";
+    method public abstract String valueTable() default "";
+    property public abstract String keyColumn;
+    property public abstract String keyTable;
+    property public abstract String valueColumn;
+    property public abstract String valueTable;
+  }
+
+  @IntDef({androidx.room.OnConflictStrategy.Companion.NONE, androidx.room.OnConflictStrategy.Companion.REPLACE, androidx.room.OnConflictStrategy.Companion.ROLLBACK, androidx.room.OnConflictStrategy.Companion.ABORT, androidx.room.OnConflictStrategy.Companion.FAIL, androidx.room.OnConflictStrategy.Companion.IGNORE}) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public @interface OnConflictStrategy {
+    field public static final int ABORT = 3; // 0x3
+    field public static final androidx.room.OnConflictStrategy.Companion Companion;
+    field @Deprecated public static final int FAIL = 4; // 0x4
+    field public static final int IGNORE = 5; // 0x5
+    field public static final int NONE = 0; // 0x0
+    field public static final int REPLACE = 1; // 0x1
+    field @Deprecated public static final int ROLLBACK = 2; // 0x2
+  }
+
+  public static final class OnConflictStrategy.Companion {
+    field public static final int ABORT = 3; // 0x3
+    field @Deprecated public static final int FAIL = 4; // 0x4
+    field public static final int IGNORE = 5; // 0x5
+    field public static final int NONE = 0; // 0x0
+    field public static final int REPLACE = 1; // 0x1
+    field @Deprecated public static final int ROLLBACK = 2; // 0x2
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.FUNCTION}) public @interface PrimaryKey {
+    method public abstract boolean autoGenerate() default false;
+    property public abstract boolean autoGenerate;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface ProvidedAutoMigrationSpec {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface ProvidedTypeConverter {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER}) public @interface Query {
+    method public abstract String value();
+    property public abstract String value;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.FUNCTION) public @interface RawQuery {
+    method public abstract kotlin.reflect.KClass<?>[] observedEntities();
+    property public abstract kotlin.reflect.KClass<?>[] observedEntities;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.FUNCTION}) public @interface Relation {
+    method public abstract androidx.room.Junction associateBy() default androidx.room.Junction(java.lang.Object);
+    method public abstract kotlin.reflect.KClass<?> entity() default java.lang.Object;
+    method public abstract String entityColumn();
+    method public abstract String parentColumn();
+    method public abstract String[] projection();
+    property public abstract androidx.room.Junction associateBy;
+    property public abstract kotlin.reflect.KClass<?> entity;
+    property public abstract String entityColumn;
+    property public abstract String parentColumn;
+    property public abstract String[] projection;
+  }
+
+  @java.lang.annotation.Repeatable(RenameColumn.Entries::class) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface RenameColumn {
+    method public abstract String fromColumnName();
+    method public abstract String tableName();
+    method public abstract String toColumnName();
+    property public abstract String fromColumnName;
+    property public abstract String tableName;
+    property public abstract String toColumnName;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public static @interface RenameColumn.Entries {
+    method public abstract androidx.room.RenameColumn[] value();
+    property public abstract androidx.room.RenameColumn[] value;
+  }
+
+  @java.lang.annotation.Repeatable(RenameTable.Entries::class) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface RenameTable {
+    method public abstract String fromTableName();
+    method public abstract String toTableName();
+    property public abstract String fromTableName;
+    property public abstract String toTableName;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public static @interface RenameTable.Entries {
+    method public abstract androidx.room.RenameTable[] value();
+    property public abstract androidx.room.RenameTable[] value;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.CLASS}) public @interface RewriteQueriesToDropUnusedColumns {
+  }
+
+  public class RoomWarnings {
+    ctor @Deprecated public RoomWarnings();
+    field public static final String AMBIGUOUS_COLUMN_IN_RESULT = "ROOM_AMBIGUOUS_COLUMN_IN_RESULT";
+    field public static final String CANNOT_CREATE_VERIFICATION_DATABASE = "ROOM_CANNOT_CREATE_VERIFICATION_DATABASE";
+    field public static final String CURSOR_MISMATCH = "ROOM_CURSOR_MISMATCH";
+    field public static final androidx.room.RoomWarnings.Companion Companion;
+    field public static final String DEFAULT_CONSTRUCTOR = "ROOM_DEFAULT_CONSTRUCTOR";
+    field public static final String DOES_NOT_IMPLEMENT_EQUALS_HASHCODE = "ROOM_TYPE_DOES_NOT_IMPLEMENT_EQUALS_HASHCODE";
+    field public static final String INDEX_FROM_EMBEDDED_ENTITY_IS_DROPPED = "ROOM_EMBEDDED_ENTITY_INDEX_IS_DROPPED";
+    field public static final String INDEX_FROM_EMBEDDED_FIELD_IS_DROPPED = "ROOM_EMBEDDED_INDEX_IS_DROPPED";
+    field public static final String INDEX_FROM_PARENT_FIELD_IS_DROPPED = "ROOM_PARENT_FIELD_INDEX_IS_DROPPED";
+    field public static final String INDEX_FROM_PARENT_IS_DROPPED = "ROOM_PARENT_INDEX_IS_DROPPED";
+    field public static final String MISMATCHED_GETTER = "ROOM_MISMATCHED_GETTER_TYPE";
+    field public static final String MISMATCHED_SETTER = "ROOM_MISMATCHED_SETTER_TYPE";
+    field public static final String MISSING_INDEX_ON_FOREIGN_KEY_CHILD = "ROOM_MISSING_FOREIGN_KEY_CHILD_INDEX";
+    field public static final String MISSING_INDEX_ON_JUNCTION = "MISSING_INDEX_ON_JUNCTION";
+    field public static final String MISSING_JAVA_TMP_DIR = "ROOM_MISSING_JAVA_TMP_DIR";
+    field public static final String MISSING_SCHEMA_LOCATION = "ROOM_MISSING_SCHEMA_LOCATION";
+    field public static final String PRIMARY_KEY_FROM_EMBEDDED_IS_DROPPED = "ROOM_EMBEDDED_PRIMARY_KEY_IS_DROPPED";
+    field public static final String RELATION_QUERY_WITHOUT_TRANSACTION = "ROOM_RELATION_QUERY_WITHOUT_TRANSACTION";
+    field public static final String RELATION_TYPE_MISMATCH = "ROOM_RELATION_TYPE_MISMATCH";
+  }
+
+  public static final class RoomWarnings.Companion {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.CLASS}) public @interface SkipQueryVerification {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.FUNCTION) public @interface Transaction {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.FUNCTION) public @interface TypeConverter {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.CLASS}) public @interface TypeConverters {
+    method public abstract androidx.room.BuiltInTypeConverters builtInTypeConverters() default androidx.room.BuiltInTypeConverters();
+    method public abstract kotlin.reflect.KClass<?>[] value();
+    property public abstract androidx.room.BuiltInTypeConverters builtInTypeConverters;
+    property public abstract kotlin.reflect.KClass<?>[] value;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.FUNCTION) public @interface Update {
+    method public abstract kotlin.reflect.KClass<?> entity() default java.lang.Object;
+    method @androidx.room.OnConflictStrategy public abstract int onConflict() default androidx.room.OnConflictStrategy.ABORT;
+    property public abstract kotlin.reflect.KClass<?> entity;
+    property @androidx.room.OnConflictStrategy public abstract int onConflict;
+  }
+
+  @RequiresApi(16) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.FUNCTION) public @interface Upsert {
+    method public abstract kotlin.reflect.KClass<?> entity() default java.lang.Object;
+    property public abstract kotlin.reflect.KClass<?> entity;
+  }
+
+}
+
diff --git a/room/room-common/api/public_plus_experimental_2.5.0-beta01.txt b/room/room-common/api/public_plus_experimental_2.5.0-beta01.txt
new file mode 100644
index 0000000..8e1573a
--- /dev/null
+++ b/room/room-common/api/public_plus_experimental_2.5.0-beta01.txt
@@ -0,0 +1,412 @@
+// Signature format: 4.0
+package androidx.room {
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface AutoMigration {
+    method public abstract int from();
+    method public abstract kotlin.reflect.KClass<?> spec() default java.lang.Object;
+    method public abstract int to();
+    property public abstract int from;
+    property public abstract kotlin.reflect.KClass<?> spec;
+    property public abstract int to;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={}) public @interface BuiltInTypeConverters {
+    method public abstract androidx.room.BuiltInTypeConverters.State enums() default androidx.room.BuiltInTypeConverters.State.INHERITED;
+    method public abstract androidx.room.BuiltInTypeConverters.State uuid() default androidx.room.BuiltInTypeConverters.State.INHERITED;
+    property public abstract androidx.room.BuiltInTypeConverters.State enums;
+    property public abstract androidx.room.BuiltInTypeConverters.State uuid;
+  }
+
+  public enum BuiltInTypeConverters.State {
+    method public static androidx.room.BuiltInTypeConverters.State valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.room.BuiltInTypeConverters.State[] values();
+    enum_constant public static final androidx.room.BuiltInTypeConverters.State DISABLED;
+    enum_constant public static final androidx.room.BuiltInTypeConverters.State ENABLED;
+    enum_constant public static final androidx.room.BuiltInTypeConverters.State INHERITED;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.FUNCTION}) public @interface ColumnInfo {
+    method @androidx.room.ColumnInfo.Collate public abstract int collate() default androidx.room.ColumnInfo.UNSPECIFIED;
+    method public abstract String defaultValue() default androidx.room.ColumnInfo.VALUE_UNSPECIFIED;
+    method public abstract boolean index() default false;
+    method public abstract String name() default androidx.room.ColumnInfo.INHERIT_FIELD_NAME;
+    method @androidx.room.ColumnInfo.SQLiteTypeAffinity public abstract int typeAffinity() default androidx.room.ColumnInfo.UNDEFINED;
+    property @androidx.room.ColumnInfo.Collate public abstract int collate;
+    property public abstract String defaultValue;
+    property public abstract boolean index;
+    property public abstract String name;
+    property @androidx.room.ColumnInfo.SQLiteTypeAffinity public abstract int typeAffinity;
+    field public static final int BINARY = 2; // 0x2
+    field public static final int BLOB = 5; // 0x5
+    field public static final androidx.room.ColumnInfo.Companion Companion;
+    field public static final String INHERIT_FIELD_NAME = "[field-name]";
+    field public static final int INTEGER = 3; // 0x3
+    field @RequiresApi(21) public static final int LOCALIZED = 5; // 0x5
+    field public static final int NOCASE = 3; // 0x3
+    field public static final int REAL = 4; // 0x4
+    field public static final int RTRIM = 4; // 0x4
+    field public static final int TEXT = 2; // 0x2
+    field public static final int UNDEFINED = 1; // 0x1
+    field @RequiresApi(21) public static final int UNICODE = 6; // 0x6
+    field public static final int UNSPECIFIED = 1; // 0x1
+    field public static final String VALUE_UNSPECIFIED = "[value-unspecified]";
+  }
+
+  @IntDef({androidx.room.ColumnInfo.UNSPECIFIED, androidx.room.ColumnInfo.BINARY, androidx.room.ColumnInfo.NOCASE, androidx.room.ColumnInfo.RTRIM, androidx.room.ColumnInfo.LOCALIZED, androidx.room.ColumnInfo.UNICODE}) @RequiresApi(21) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public static @interface ColumnInfo.Collate {
+  }
+
+  public static final class ColumnInfo.Companion {
+    field public static final int BINARY = 2; // 0x2
+    field public static final int BLOB = 5; // 0x5
+    field public static final String INHERIT_FIELD_NAME = "[field-name]";
+    field public static final int INTEGER = 3; // 0x3
+    field @RequiresApi(21) public static final int LOCALIZED = 5; // 0x5
+    field public static final int NOCASE = 3; // 0x3
+    field public static final int REAL = 4; // 0x4
+    field public static final int RTRIM = 4; // 0x4
+    field public static final int TEXT = 2; // 0x2
+    field public static final int UNDEFINED = 1; // 0x1
+    field @RequiresApi(21) public static final int UNICODE = 6; // 0x6
+    field public static final int UNSPECIFIED = 1; // 0x1
+    field public static final String VALUE_UNSPECIFIED = "[value-unspecified]";
+  }
+
+  @IntDef({androidx.room.ColumnInfo.UNDEFINED, androidx.room.ColumnInfo.TEXT, androidx.room.ColumnInfo.INTEGER, androidx.room.ColumnInfo.REAL, androidx.room.ColumnInfo.BLOB}) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public static @interface ColumnInfo.SQLiteTypeAffinity {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface Dao {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface Database {
+    method public abstract androidx.room.AutoMigration[] autoMigrations();
+    method public abstract kotlin.reflect.KClass<?>[] entities();
+    method public abstract boolean exportSchema() default true;
+    method public abstract int version();
+    method public abstract kotlin.reflect.KClass<?>[] views();
+    property public abstract androidx.room.AutoMigration[] autoMigrations;
+    property public abstract kotlin.reflect.KClass<?>[] entities;
+    property public abstract boolean exportSchema;
+    property public abstract int version;
+    property public abstract kotlin.reflect.KClass<?>[] views;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface DatabaseView {
+    method public abstract String value() default "";
+    method public abstract String viewName() default "";
+    property public abstract String value;
+    property public abstract String viewName;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.FUNCTION) public @interface Delete {
+    method public abstract kotlin.reflect.KClass<?> entity() default java.lang.Object;
+    property public abstract kotlin.reflect.KClass<?> entity;
+  }
+
+  @java.lang.annotation.Repeatable(DeleteColumn.Entries::class) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface DeleteColumn {
+    method public abstract String columnName();
+    method public abstract String tableName();
+    property public abstract String columnName;
+    property public abstract String tableName;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public static @interface DeleteColumn.Entries {
+    method public abstract androidx.room.DeleteColumn[] value();
+    property public abstract androidx.room.DeleteColumn[] value;
+  }
+
+  @java.lang.annotation.Repeatable(DeleteTable.Entries::class) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface DeleteTable {
+    method public abstract String tableName();
+    property public abstract String tableName;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public static @interface DeleteTable.Entries {
+    method public abstract androidx.room.DeleteTable[] value();
+    property public abstract androidx.room.DeleteTable[] value;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.FUNCTION}) public @interface Embedded {
+    method public abstract String prefix() default "";
+    property public abstract String prefix;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface Entity {
+    method public abstract androidx.room.ForeignKey[] foreignKeys();
+    method public abstract String[] ignoredColumns();
+    method public abstract androidx.room.Index[] indices();
+    method public abstract boolean inheritSuperIndices() default false;
+    method public abstract String[] primaryKeys();
+    method public abstract String tableName() default "";
+    property public abstract androidx.room.ForeignKey[] foreignKeys;
+    property public abstract String[] ignoredColumns;
+    property public abstract androidx.room.Index[] indices;
+    property public abstract boolean inheritSuperIndices;
+    property public abstract String[] primaryKeys;
+    property public abstract String tableName;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={}) public @interface ForeignKey {
+    method public abstract String[] childColumns();
+    method public abstract boolean deferred() default false;
+    method public abstract kotlin.reflect.KClass<?> entity();
+    method @androidx.room.ForeignKey.Action public abstract int onDelete() default androidx.room.ForeignKey.NO_ACTION;
+    method @androidx.room.ForeignKey.Action public abstract int onUpdate() default androidx.room.ForeignKey.NO_ACTION;
+    method public abstract String[] parentColumns();
+    property public abstract String[] childColumns;
+    property public abstract boolean deferred;
+    property public abstract kotlin.reflect.KClass<?> entity;
+    property @androidx.room.ForeignKey.Action public abstract int onDelete;
+    property @androidx.room.ForeignKey.Action public abstract int onUpdate;
+    property public abstract String[] parentColumns;
+    field public static final int CASCADE = 5; // 0x5
+    field public static final androidx.room.ForeignKey.Companion Companion;
+    field public static final int NO_ACTION = 1; // 0x1
+    field public static final int RESTRICT = 2; // 0x2
+    field public static final int SET_DEFAULT = 4; // 0x4
+    field public static final int SET_NULL = 3; // 0x3
+  }
+
+  @IntDef({androidx.room.ForeignKey.NO_ACTION, androidx.room.ForeignKey.RESTRICT, androidx.room.ForeignKey.SET_NULL, androidx.room.ForeignKey.SET_DEFAULT, androidx.room.ForeignKey.CASCADE}) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public static @interface ForeignKey.Action {
+  }
+
+  public static final class ForeignKey.Companion {
+    field public static final int CASCADE = 5; // 0x5
+    field public static final int NO_ACTION = 1; // 0x1
+    field public static final int RESTRICT = 2; // 0x2
+    field public static final int SET_DEFAULT = 4; // 0x4
+    field public static final int SET_NULL = 3; // 0x3
+  }
+
+  @RequiresApi(16) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface Fts3 {
+    method public abstract String tokenizer() default androidx.room.FtsOptions.TOKENIZER_SIMPLE;
+    method public abstract String[] tokenizerArgs();
+    property public abstract String tokenizer;
+    property public abstract String[] tokenizerArgs;
+  }
+
+  @RequiresApi(16) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface Fts4 {
+    method public abstract kotlin.reflect.KClass<?> contentEntity() default java.lang.Object;
+    method public abstract String languageId() default "";
+    method public abstract androidx.room.FtsOptions.MatchInfo matchInfo() default androidx.room.FtsOptions.MatchInfo.FTS4;
+    method public abstract String[] notIndexed();
+    method public abstract androidx.room.FtsOptions.Order order() default androidx.room.FtsOptions.Order.ASC;
+    method public abstract int[] prefix();
+    method public abstract String tokenizer() default androidx.room.FtsOptions.TOKENIZER_SIMPLE;
+    method public abstract String[] tokenizerArgs();
+    property public abstract kotlin.reflect.KClass<?> contentEntity;
+    property public abstract String languageId;
+    property public abstract androidx.room.FtsOptions.MatchInfo matchInfo;
+    property public abstract String[] notIndexed;
+    property public abstract androidx.room.FtsOptions.Order order;
+    property public abstract int[] prefix;
+    property public abstract String tokenizer;
+    property public abstract String[] tokenizerArgs;
+  }
+
+  public final class FtsOptions {
+    field public static final androidx.room.FtsOptions INSTANCE;
+    field public static final String TOKENIZER_ICU = "icu";
+    field public static final String TOKENIZER_PORTER = "porter";
+    field public static final String TOKENIZER_SIMPLE = "simple";
+    field @RequiresApi(21) public static final String TOKENIZER_UNICODE61 = "unicode61";
+  }
+
+  public enum FtsOptions.MatchInfo {
+    method public static androidx.room.FtsOptions.MatchInfo valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.room.FtsOptions.MatchInfo[] values();
+    enum_constant public static final androidx.room.FtsOptions.MatchInfo FTS3;
+    enum_constant public static final androidx.room.FtsOptions.MatchInfo FTS4;
+  }
+
+  public enum FtsOptions.Order {
+    method public static androidx.room.FtsOptions.Order valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.room.FtsOptions.Order[] values();
+    enum_constant public static final androidx.room.FtsOptions.Order ASC;
+    enum_constant public static final androidx.room.FtsOptions.Order DESC;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.CONSTRUCTOR, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER}) public @interface Ignore {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={}) public @interface Index {
+    method public abstract String name() default "";
+    method public abstract androidx.room.Index.Order[] orders();
+    method public abstract boolean unique() default false;
+    method public abstract String[] value();
+    property public abstract String name;
+    property public abstract androidx.room.Index.Order[] orders;
+    property public abstract boolean unique;
+    property public abstract String[] value;
+  }
+
+  public enum Index.Order {
+    method public static androidx.room.Index.Order valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.room.Index.Order[] values();
+    enum_constant public static final androidx.room.Index.Order ASC;
+    enum_constant public static final androidx.room.Index.Order DESC;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.FUNCTION) public @interface Insert {
+    method public abstract kotlin.reflect.KClass<?> entity() default java.lang.Object;
+    method @androidx.room.OnConflictStrategy public abstract int onConflict() default androidx.room.OnConflictStrategy.ABORT;
+    property public abstract kotlin.reflect.KClass<?> entity;
+    property @androidx.room.OnConflictStrategy public abstract int onConflict;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={}) public @interface Junction {
+    method public abstract String entityColumn() default "";
+    method public abstract String parentColumn() default "";
+    method public abstract kotlin.reflect.KClass<?> value();
+    property public abstract String entityColumn;
+    property public abstract String parentColumn;
+    property public abstract kotlin.reflect.KClass<?> value;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.FUNCTION) public @interface MapInfo {
+    method public abstract String keyColumn() default "";
+    method public abstract String keyTable() default "";
+    method public abstract String valueColumn() default "";
+    method public abstract String valueTable() default "";
+    property public abstract String keyColumn;
+    property public abstract String keyTable;
+    property public abstract String valueColumn;
+    property public abstract String valueTable;
+  }
+
+  @IntDef({androidx.room.OnConflictStrategy.Companion.NONE, androidx.room.OnConflictStrategy.Companion.REPLACE, androidx.room.OnConflictStrategy.Companion.ROLLBACK, androidx.room.OnConflictStrategy.Companion.ABORT, androidx.room.OnConflictStrategy.Companion.FAIL, androidx.room.OnConflictStrategy.Companion.IGNORE}) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public @interface OnConflictStrategy {
+    field public static final int ABORT = 3; // 0x3
+    field public static final androidx.room.OnConflictStrategy.Companion Companion;
+    field @Deprecated public static final int FAIL = 4; // 0x4
+    field public static final int IGNORE = 5; // 0x5
+    field public static final int NONE = 0; // 0x0
+    field public static final int REPLACE = 1; // 0x1
+    field @Deprecated public static final int ROLLBACK = 2; // 0x2
+  }
+
+  public static final class OnConflictStrategy.Companion {
+    field public static final int ABORT = 3; // 0x3
+    field @Deprecated public static final int FAIL = 4; // 0x4
+    field public static final int IGNORE = 5; // 0x5
+    field public static final int NONE = 0; // 0x0
+    field public static final int REPLACE = 1; // 0x1
+    field @Deprecated public static final int ROLLBACK = 2; // 0x2
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.FUNCTION}) public @interface PrimaryKey {
+    method public abstract boolean autoGenerate() default false;
+    property public abstract boolean autoGenerate;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface ProvidedAutoMigrationSpec {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface ProvidedTypeConverter {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER}) public @interface Query {
+    method public abstract String value();
+    property public abstract String value;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.FUNCTION) public @interface RawQuery {
+    method public abstract kotlin.reflect.KClass<?>[] observedEntities();
+    property public abstract kotlin.reflect.KClass<?>[] observedEntities;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.FUNCTION}) public @interface Relation {
+    method public abstract androidx.room.Junction associateBy() default androidx.room.Junction(java.lang.Object);
+    method public abstract kotlin.reflect.KClass<?> entity() default java.lang.Object;
+    method public abstract String entityColumn();
+    method public abstract String parentColumn();
+    method public abstract String[] projection();
+    property public abstract androidx.room.Junction associateBy;
+    property public abstract kotlin.reflect.KClass<?> entity;
+    property public abstract String entityColumn;
+    property public abstract String parentColumn;
+    property public abstract String[] projection;
+  }
+
+  @java.lang.annotation.Repeatable(RenameColumn.Entries::class) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface RenameColumn {
+    method public abstract String fromColumnName();
+    method public abstract String tableName();
+    method public abstract String toColumnName();
+    property public abstract String fromColumnName;
+    property public abstract String tableName;
+    property public abstract String toColumnName;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public static @interface RenameColumn.Entries {
+    method public abstract androidx.room.RenameColumn[] value();
+    property public abstract androidx.room.RenameColumn[] value;
+  }
+
+  @java.lang.annotation.Repeatable(RenameTable.Entries::class) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface RenameTable {
+    method public abstract String fromTableName();
+    method public abstract String toTableName();
+    property public abstract String fromTableName;
+    property public abstract String toTableName;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public static @interface RenameTable.Entries {
+    method public abstract androidx.room.RenameTable[] value();
+    property public abstract androidx.room.RenameTable[] value;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.CLASS}) public @interface RewriteQueriesToDropUnusedColumns {
+  }
+
+  public class RoomWarnings {
+    ctor @Deprecated public RoomWarnings();
+    field public static final String AMBIGUOUS_COLUMN_IN_RESULT = "ROOM_AMBIGUOUS_COLUMN_IN_RESULT";
+    field public static final String CANNOT_CREATE_VERIFICATION_DATABASE = "ROOM_CANNOT_CREATE_VERIFICATION_DATABASE";
+    field public static final String CURSOR_MISMATCH = "ROOM_CURSOR_MISMATCH";
+    field public static final androidx.room.RoomWarnings.Companion Companion;
+    field public static final String DEFAULT_CONSTRUCTOR = "ROOM_DEFAULT_CONSTRUCTOR";
+    field public static final String DOES_NOT_IMPLEMENT_EQUALS_HASHCODE = "ROOM_TYPE_DOES_NOT_IMPLEMENT_EQUALS_HASHCODE";
+    field public static final String INDEX_FROM_EMBEDDED_ENTITY_IS_DROPPED = "ROOM_EMBEDDED_ENTITY_INDEX_IS_DROPPED";
+    field public static final String INDEX_FROM_EMBEDDED_FIELD_IS_DROPPED = "ROOM_EMBEDDED_INDEX_IS_DROPPED";
+    field public static final String INDEX_FROM_PARENT_FIELD_IS_DROPPED = "ROOM_PARENT_FIELD_INDEX_IS_DROPPED";
+    field public static final String INDEX_FROM_PARENT_IS_DROPPED = "ROOM_PARENT_INDEX_IS_DROPPED";
+    field public static final String MISMATCHED_GETTER = "ROOM_MISMATCHED_GETTER_TYPE";
+    field public static final String MISMATCHED_SETTER = "ROOM_MISMATCHED_SETTER_TYPE";
+    field public static final String MISSING_INDEX_ON_FOREIGN_KEY_CHILD = "ROOM_MISSING_FOREIGN_KEY_CHILD_INDEX";
+    field public static final String MISSING_INDEX_ON_JUNCTION = "MISSING_INDEX_ON_JUNCTION";
+    field public static final String MISSING_JAVA_TMP_DIR = "ROOM_MISSING_JAVA_TMP_DIR";
+    field public static final String MISSING_SCHEMA_LOCATION = "ROOM_MISSING_SCHEMA_LOCATION";
+    field public static final String PRIMARY_KEY_FROM_EMBEDDED_IS_DROPPED = "ROOM_EMBEDDED_PRIMARY_KEY_IS_DROPPED";
+    field public static final String RELATION_QUERY_WITHOUT_TRANSACTION = "ROOM_RELATION_QUERY_WITHOUT_TRANSACTION";
+    field public static final String RELATION_TYPE_MISMATCH = "ROOM_RELATION_TYPE_MISMATCH";
+  }
+
+  public static final class RoomWarnings.Companion {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.CLASS}) public @interface SkipQueryVerification {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.FUNCTION) public @interface Transaction {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.FUNCTION) public @interface TypeConverter {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.CLASS}) public @interface TypeConverters {
+    method public abstract androidx.room.BuiltInTypeConverters builtInTypeConverters() default androidx.room.BuiltInTypeConverters();
+    method public abstract kotlin.reflect.KClass<?>[] value();
+    property public abstract androidx.room.BuiltInTypeConverters builtInTypeConverters;
+    property public abstract kotlin.reflect.KClass<?>[] value;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.FUNCTION) public @interface Update {
+    method public abstract kotlin.reflect.KClass<?> entity() default java.lang.Object;
+    method @androidx.room.OnConflictStrategy public abstract int onConflict() default androidx.room.OnConflictStrategy.ABORT;
+    property public abstract kotlin.reflect.KClass<?> entity;
+    property @androidx.room.OnConflictStrategy public abstract int onConflict;
+  }
+
+  @RequiresApi(16) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.FUNCTION) public @interface Upsert {
+    method public abstract kotlin.reflect.KClass<?> entity() default java.lang.Object;
+    property public abstract kotlin.reflect.KClass<?> entity;
+  }
+
+}
+
diff --git a/room/room-common/api/restricted_2.5.0-beta01.txt b/room/room-common/api/restricted_2.5.0-beta01.txt
new file mode 100644
index 0000000..9abdd2f
--- /dev/null
+++ b/room/room-common/api/restricted_2.5.0-beta01.txt
@@ -0,0 +1,421 @@
+// Signature format: 4.0
+package androidx.room {
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface AutoMigration {
+    method public abstract int from();
+    method public abstract kotlin.reflect.KClass<?> spec() default java.lang.Object;
+    method public abstract int to();
+    property public abstract int from;
+    property public abstract kotlin.reflect.KClass<?> spec;
+    property public abstract int to;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={}) public @interface BuiltInTypeConverters {
+    method public abstract androidx.room.BuiltInTypeConverters.State enums() default androidx.room.BuiltInTypeConverters.State.INHERITED;
+    method public abstract androidx.room.BuiltInTypeConverters.State uuid() default androidx.room.BuiltInTypeConverters.State.INHERITED;
+    property public abstract androidx.room.BuiltInTypeConverters.State enums;
+    property public abstract androidx.room.BuiltInTypeConverters.State uuid;
+  }
+
+  public enum BuiltInTypeConverters.State {
+    method public static androidx.room.BuiltInTypeConverters.State valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.room.BuiltInTypeConverters.State[] values();
+    enum_constant public static final androidx.room.BuiltInTypeConverters.State DISABLED;
+    enum_constant public static final androidx.room.BuiltInTypeConverters.State ENABLED;
+    enum_constant public static final androidx.room.BuiltInTypeConverters.State INHERITED;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.FUNCTION}) public @interface ColumnInfo {
+    method @androidx.room.ColumnInfo.Collate public abstract int collate() default androidx.room.ColumnInfo.UNSPECIFIED;
+    method public abstract String defaultValue() default androidx.room.ColumnInfo.VALUE_UNSPECIFIED;
+    method public abstract boolean index() default false;
+    method public abstract String name() default androidx.room.ColumnInfo.INHERIT_FIELD_NAME;
+    method @androidx.room.ColumnInfo.SQLiteTypeAffinity public abstract int typeAffinity() default androidx.room.ColumnInfo.UNDEFINED;
+    property @androidx.room.ColumnInfo.Collate public abstract int collate;
+    property public abstract String defaultValue;
+    property public abstract boolean index;
+    property public abstract String name;
+    property @androidx.room.ColumnInfo.SQLiteTypeAffinity public abstract int typeAffinity;
+    field public static final int BINARY = 2; // 0x2
+    field public static final int BLOB = 5; // 0x5
+    field public static final androidx.room.ColumnInfo.Companion Companion;
+    field public static final String INHERIT_FIELD_NAME = "[field-name]";
+    field public static final int INTEGER = 3; // 0x3
+    field @RequiresApi(21) public static final int LOCALIZED = 5; // 0x5
+    field public static final int NOCASE = 3; // 0x3
+    field public static final int REAL = 4; // 0x4
+    field public static final int RTRIM = 4; // 0x4
+    field public static final int TEXT = 2; // 0x2
+    field public static final int UNDEFINED = 1; // 0x1
+    field @RequiresApi(21) public static final int UNICODE = 6; // 0x6
+    field public static final int UNSPECIFIED = 1; // 0x1
+    field public static final String VALUE_UNSPECIFIED = "[value-unspecified]";
+  }
+
+  @IntDef({androidx.room.ColumnInfo.UNSPECIFIED, androidx.room.ColumnInfo.BINARY, androidx.room.ColumnInfo.NOCASE, androidx.room.ColumnInfo.RTRIM, androidx.room.ColumnInfo.LOCALIZED, androidx.room.ColumnInfo.UNICODE}) @RequiresApi(21) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public static @interface ColumnInfo.Collate {
+  }
+
+  public static final class ColumnInfo.Companion {
+    field public static final int BINARY = 2; // 0x2
+    field public static final int BLOB = 5; // 0x5
+    field public static final String INHERIT_FIELD_NAME = "[field-name]";
+    field public static final int INTEGER = 3; // 0x3
+    field @RequiresApi(21) public static final int LOCALIZED = 5; // 0x5
+    field public static final int NOCASE = 3; // 0x3
+    field public static final int REAL = 4; // 0x4
+    field public static final int RTRIM = 4; // 0x4
+    field public static final int TEXT = 2; // 0x2
+    field public static final int UNDEFINED = 1; // 0x1
+    field @RequiresApi(21) public static final int UNICODE = 6; // 0x6
+    field public static final int UNSPECIFIED = 1; // 0x1
+    field public static final String VALUE_UNSPECIFIED = "[value-unspecified]";
+  }
+
+  @IntDef({androidx.room.ColumnInfo.UNDEFINED, androidx.room.ColumnInfo.TEXT, androidx.room.ColumnInfo.INTEGER, androidx.room.ColumnInfo.REAL, androidx.room.ColumnInfo.BLOB}) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public static @interface ColumnInfo.SQLiteTypeAffinity {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface Dao {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface Database {
+    method public abstract androidx.room.AutoMigration[] autoMigrations();
+    method public abstract kotlin.reflect.KClass<?>[] entities();
+    method public abstract boolean exportSchema() default true;
+    method public abstract int version();
+    method public abstract kotlin.reflect.KClass<?>[] views();
+    property public abstract androidx.room.AutoMigration[] autoMigrations;
+    property public abstract kotlin.reflect.KClass<?>[] entities;
+    property public abstract boolean exportSchema;
+    property public abstract int version;
+    property public abstract kotlin.reflect.KClass<?>[] views;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface DatabaseView {
+    method public abstract String value() default "";
+    method public abstract String viewName() default "";
+    property public abstract String value;
+    property public abstract String viewName;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.FUNCTION) public @interface Delete {
+    method public abstract kotlin.reflect.KClass<?> entity() default java.lang.Object;
+    property public abstract kotlin.reflect.KClass<?> entity;
+  }
+
+  @java.lang.annotation.Repeatable(DeleteColumn.Entries::class) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface DeleteColumn {
+    method public abstract String columnName();
+    method public abstract String tableName();
+    property public abstract String columnName;
+    property public abstract String tableName;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public static @interface DeleteColumn.Entries {
+    method public abstract androidx.room.DeleteColumn[] value();
+    property public abstract androidx.room.DeleteColumn[] value;
+  }
+
+  @java.lang.annotation.Repeatable(DeleteTable.Entries::class) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface DeleteTable {
+    method public abstract String tableName();
+    property public abstract String tableName;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public static @interface DeleteTable.Entries {
+    method public abstract androidx.room.DeleteTable[] value();
+    property public abstract androidx.room.DeleteTable[] value;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.FUNCTION}) public @interface Embedded {
+    method public abstract String prefix() default "";
+    property public abstract String prefix;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface Entity {
+    method public abstract androidx.room.ForeignKey[] foreignKeys();
+    method public abstract String[] ignoredColumns();
+    method public abstract androidx.room.Index[] indices();
+    method public abstract boolean inheritSuperIndices() default false;
+    method public abstract String[] primaryKeys();
+    method public abstract String tableName() default "";
+    property public abstract androidx.room.ForeignKey[] foreignKeys;
+    property public abstract String[] ignoredColumns;
+    property public abstract androidx.room.Index[] indices;
+    property public abstract boolean inheritSuperIndices;
+    property public abstract String[] primaryKeys;
+    property public abstract String tableName;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={}) public @interface ForeignKey {
+    method public abstract String[] childColumns();
+    method public abstract boolean deferred() default false;
+    method public abstract kotlin.reflect.KClass<?> entity();
+    method @androidx.room.ForeignKey.Action public abstract int onDelete() default androidx.room.ForeignKey.NO_ACTION;
+    method @androidx.room.ForeignKey.Action public abstract int onUpdate() default androidx.room.ForeignKey.NO_ACTION;
+    method public abstract String[] parentColumns();
+    property public abstract String[] childColumns;
+    property public abstract boolean deferred;
+    property public abstract kotlin.reflect.KClass<?> entity;
+    property @androidx.room.ForeignKey.Action public abstract int onDelete;
+    property @androidx.room.ForeignKey.Action public abstract int onUpdate;
+    property public abstract String[] parentColumns;
+    field public static final int CASCADE = 5; // 0x5
+    field public static final androidx.room.ForeignKey.Companion Companion;
+    field public static final int NO_ACTION = 1; // 0x1
+    field public static final int RESTRICT = 2; // 0x2
+    field public static final int SET_DEFAULT = 4; // 0x4
+    field public static final int SET_NULL = 3; // 0x3
+  }
+
+  @IntDef({androidx.room.ForeignKey.NO_ACTION, androidx.room.ForeignKey.RESTRICT, androidx.room.ForeignKey.SET_NULL, androidx.room.ForeignKey.SET_DEFAULT, androidx.room.ForeignKey.CASCADE}) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public static @interface ForeignKey.Action {
+  }
+
+  public static final class ForeignKey.Companion {
+    field public static final int CASCADE = 5; // 0x5
+    field public static final int NO_ACTION = 1; // 0x1
+    field public static final int RESTRICT = 2; // 0x2
+    field public static final int SET_DEFAULT = 4; // 0x4
+    field public static final int SET_NULL = 3; // 0x3
+  }
+
+  @RequiresApi(16) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface Fts3 {
+    method public abstract String tokenizer() default androidx.room.FtsOptions.TOKENIZER_SIMPLE;
+    method public abstract String[] tokenizerArgs();
+    property public abstract String tokenizer;
+    property public abstract String[] tokenizerArgs;
+  }
+
+  @RequiresApi(16) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface Fts4 {
+    method public abstract kotlin.reflect.KClass<?> contentEntity() default java.lang.Object;
+    method public abstract String languageId() default "";
+    method public abstract androidx.room.FtsOptions.MatchInfo matchInfo() default androidx.room.FtsOptions.MatchInfo.FTS4;
+    method public abstract String[] notIndexed();
+    method public abstract androidx.room.FtsOptions.Order order() default androidx.room.FtsOptions.Order.ASC;
+    method public abstract int[] prefix();
+    method public abstract String tokenizer() default androidx.room.FtsOptions.TOKENIZER_SIMPLE;
+    method public abstract String[] tokenizerArgs();
+    property public abstract kotlin.reflect.KClass<?> contentEntity;
+    property public abstract String languageId;
+    property public abstract androidx.room.FtsOptions.MatchInfo matchInfo;
+    property public abstract String[] notIndexed;
+    property public abstract androidx.room.FtsOptions.Order order;
+    property public abstract int[] prefix;
+    property public abstract String tokenizer;
+    property public abstract String[] tokenizerArgs;
+  }
+
+  public final class FtsOptions {
+    field public static final androidx.room.FtsOptions INSTANCE;
+    field public static final String TOKENIZER_ICU = "icu";
+    field public static final String TOKENIZER_PORTER = "porter";
+    field public static final String TOKENIZER_SIMPLE = "simple";
+    field @RequiresApi(21) public static final String TOKENIZER_UNICODE61 = "unicode61";
+  }
+
+  public enum FtsOptions.MatchInfo {
+    method public static androidx.room.FtsOptions.MatchInfo valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.room.FtsOptions.MatchInfo[] values();
+    enum_constant public static final androidx.room.FtsOptions.MatchInfo FTS3;
+    enum_constant public static final androidx.room.FtsOptions.MatchInfo FTS4;
+  }
+
+  public enum FtsOptions.Order {
+    method public static androidx.room.FtsOptions.Order valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.room.FtsOptions.Order[] values();
+    enum_constant public static final androidx.room.FtsOptions.Order ASC;
+    enum_constant public static final androidx.room.FtsOptions.Order DESC;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.CONSTRUCTOR, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER}) public @interface Ignore {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={}) public @interface Index {
+    method public abstract String name() default "";
+    method public abstract androidx.room.Index.Order[] orders();
+    method public abstract boolean unique() default false;
+    method public abstract String[] value();
+    property public abstract String name;
+    property public abstract androidx.room.Index.Order[] orders;
+    property public abstract boolean unique;
+    property public abstract String[] value;
+  }
+
+  public enum Index.Order {
+    method public static androidx.room.Index.Order valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.room.Index.Order[] values();
+    enum_constant public static final androidx.room.Index.Order ASC;
+    enum_constant public static final androidx.room.Index.Order DESC;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.FUNCTION) public @interface Insert {
+    method public abstract kotlin.reflect.KClass<?> entity() default java.lang.Object;
+    method @androidx.room.OnConflictStrategy public abstract int onConflict() default androidx.room.OnConflictStrategy.ABORT;
+    property public abstract kotlin.reflect.KClass<?> entity;
+    property @androidx.room.OnConflictStrategy public abstract int onConflict;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={}) public @interface Junction {
+    method public abstract String entityColumn() default "";
+    method public abstract String parentColumn() default "";
+    method public abstract kotlin.reflect.KClass<?> value();
+    property public abstract String entityColumn;
+    property public abstract String parentColumn;
+    property public abstract kotlin.reflect.KClass<?> value;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.FUNCTION) public @interface MapInfo {
+    method public abstract String keyColumn() default "";
+    method public abstract String keyTable() default "";
+    method public abstract String valueColumn() default "";
+    method public abstract String valueTable() default "";
+    property public abstract String keyColumn;
+    property public abstract String keyTable;
+    property public abstract String valueColumn;
+    property public abstract String valueTable;
+  }
+
+  @IntDef({androidx.room.OnConflictStrategy.Companion.NONE, androidx.room.OnConflictStrategy.Companion.REPLACE, androidx.room.OnConflictStrategy.Companion.ROLLBACK, androidx.room.OnConflictStrategy.Companion.ABORT, androidx.room.OnConflictStrategy.Companion.FAIL, androidx.room.OnConflictStrategy.Companion.IGNORE}) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) public @interface OnConflictStrategy {
+    field public static final int ABORT = 3; // 0x3
+    field public static final androidx.room.OnConflictStrategy.Companion Companion;
+    field @Deprecated public static final int FAIL = 4; // 0x4
+    field public static final int IGNORE = 5; // 0x5
+    field public static final int NONE = 0; // 0x0
+    field public static final int REPLACE = 1; // 0x1
+    field @Deprecated public static final int ROLLBACK = 2; // 0x2
+  }
+
+  public static final class OnConflictStrategy.Companion {
+    field public static final int ABORT = 3; // 0x3
+    field @Deprecated public static final int FAIL = 4; // 0x4
+    field public static final int IGNORE = 5; // 0x5
+    field public static final int NONE = 0; // 0x0
+    field public static final int REPLACE = 1; // 0x1
+    field @Deprecated public static final int ROLLBACK = 2; // 0x2
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.FUNCTION}) public @interface PrimaryKey {
+    method public abstract boolean autoGenerate() default false;
+    property public abstract boolean autoGenerate;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface ProvidedAutoMigrationSpec {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface ProvidedTypeConverter {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.PROPERTY_GETTER}) public @interface Query {
+    method public abstract String value();
+    property public abstract String value;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.FUNCTION) public @interface RawQuery {
+    method public abstract kotlin.reflect.KClass<?>[] observedEntities();
+    property public abstract kotlin.reflect.KClass<?>[] observedEntities;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.FUNCTION}) public @interface Relation {
+    method public abstract androidx.room.Junction associateBy() default androidx.room.Junction(java.lang.Object);
+    method public abstract kotlin.reflect.KClass<?> entity() default java.lang.Object;
+    method public abstract String entityColumn();
+    method public abstract String parentColumn();
+    method public abstract String[] projection();
+    property public abstract androidx.room.Junction associateBy;
+    property public abstract kotlin.reflect.KClass<?> entity;
+    property public abstract String entityColumn;
+    property public abstract String parentColumn;
+    property public abstract String[] projection;
+  }
+
+  @java.lang.annotation.Repeatable(RenameColumn.Entries::class) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface RenameColumn {
+    method public abstract String fromColumnName();
+    method public abstract String tableName();
+    method public abstract String toColumnName();
+    property public abstract String fromColumnName;
+    property public abstract String tableName;
+    property public abstract String toColumnName;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public static @interface RenameColumn.Entries {
+    method public abstract androidx.room.RenameColumn[] value();
+    property public abstract androidx.room.RenameColumn[] value;
+  }
+
+  @java.lang.annotation.Repeatable(RenameTable.Entries::class) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface RenameTable {
+    method public abstract String fromTableName();
+    method public abstract String toTableName();
+    property public abstract String fromTableName;
+    property public abstract String toTableName;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public static @interface RenameTable.Entries {
+    method public abstract androidx.room.RenameTable[] value();
+    property public abstract androidx.room.RenameTable[] value;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.CLASS}) public @interface RewriteQueriesToDropUnusedColumns {
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class RoomMasterTable {
+    method public static String createInsertQuery(String hash);
+    field public static final String CREATE_QUERY = "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)";
+    field public static final String DEFAULT_ID = "42";
+    field public static final String NAME = "room_master_table";
+    field public static final String READ_QUERY = "SELECT identity_hash FROM room_master_table WHERE id = 42 LIMIT 1";
+    field public static final String TABLE_NAME = "room_master_table";
+  }
+
+  public class RoomWarnings {
+    ctor @Deprecated public RoomWarnings();
+    field public static final String AMBIGUOUS_COLUMN_IN_RESULT = "ROOM_AMBIGUOUS_COLUMN_IN_RESULT";
+    field public static final String CANNOT_CREATE_VERIFICATION_DATABASE = "ROOM_CANNOT_CREATE_VERIFICATION_DATABASE";
+    field public static final String CURSOR_MISMATCH = "ROOM_CURSOR_MISMATCH";
+    field public static final androidx.room.RoomWarnings.Companion Companion;
+    field public static final String DEFAULT_CONSTRUCTOR = "ROOM_DEFAULT_CONSTRUCTOR";
+    field public static final String DOES_NOT_IMPLEMENT_EQUALS_HASHCODE = "ROOM_TYPE_DOES_NOT_IMPLEMENT_EQUALS_HASHCODE";
+    field public static final String INDEX_FROM_EMBEDDED_ENTITY_IS_DROPPED = "ROOM_EMBEDDED_ENTITY_INDEX_IS_DROPPED";
+    field public static final String INDEX_FROM_EMBEDDED_FIELD_IS_DROPPED = "ROOM_EMBEDDED_INDEX_IS_DROPPED";
+    field public static final String INDEX_FROM_PARENT_FIELD_IS_DROPPED = "ROOM_PARENT_FIELD_INDEX_IS_DROPPED";
+    field public static final String INDEX_FROM_PARENT_IS_DROPPED = "ROOM_PARENT_INDEX_IS_DROPPED";
+    field public static final String MISMATCHED_GETTER = "ROOM_MISMATCHED_GETTER_TYPE";
+    field public static final String MISMATCHED_SETTER = "ROOM_MISMATCHED_SETTER_TYPE";
+    field public static final String MISSING_INDEX_ON_FOREIGN_KEY_CHILD = "ROOM_MISSING_FOREIGN_KEY_CHILD_INDEX";
+    field public static final String MISSING_INDEX_ON_JUNCTION = "MISSING_INDEX_ON_JUNCTION";
+    field public static final String MISSING_JAVA_TMP_DIR = "ROOM_MISSING_JAVA_TMP_DIR";
+    field public static final String MISSING_SCHEMA_LOCATION = "ROOM_MISSING_SCHEMA_LOCATION";
+    field public static final String PRIMARY_KEY_FROM_EMBEDDED_IS_DROPPED = "ROOM_EMBEDDED_PRIMARY_KEY_IS_DROPPED";
+    field public static final String RELATION_QUERY_WITHOUT_TRANSACTION = "ROOM_RELATION_QUERY_WITHOUT_TRANSACTION";
+    field public static final String RELATION_TYPE_MISMATCH = "ROOM_RELATION_TYPE_MISMATCH";
+  }
+
+  public static final class RoomWarnings.Companion {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.CLASS}) public @interface SkipQueryVerification {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.FUNCTION) public @interface Transaction {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.FUNCTION) public @interface TypeConverter {
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.FUNCTION, kotlin.annotation.AnnotationTarget.VALUE_PARAMETER, kotlin.annotation.AnnotationTarget.FIELD, kotlin.annotation.AnnotationTarget.CLASS}) public @interface TypeConverters {
+    method public abstract androidx.room.BuiltInTypeConverters builtInTypeConverters() default androidx.room.BuiltInTypeConverters();
+    method public abstract kotlin.reflect.KClass<?>[] value();
+    property public abstract androidx.room.BuiltInTypeConverters builtInTypeConverters;
+    property public abstract kotlin.reflect.KClass<?>[] value;
+  }
+
+  @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.FUNCTION) public @interface Update {
+    method public abstract kotlin.reflect.KClass<?> entity() default java.lang.Object;
+    method @androidx.room.OnConflictStrategy public abstract int onConflict() default androidx.room.OnConflictStrategy.ABORT;
+    property public abstract kotlin.reflect.KClass<?> entity;
+    property @androidx.room.OnConflictStrategy public abstract int onConflict;
+  }
+
+  @RequiresApi(16) @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.BINARY) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.FUNCTION) public @interface Upsert {
+    method public abstract kotlin.reflect.KClass<?> entity() default java.lang.Object;
+    property public abstract kotlin.reflect.KClass<?> entity;
+  }
+
+}
+
diff --git a/room/room-compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/CompilationResultSubject.kt b/room/room-compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/CompilationResultSubject.kt
index 63c2de1..83ccfd4 100644
--- a/room/room-compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/CompilationResultSubject.kt
+++ b/room/room-compiler-processing-testing/src/main/java/androidx/room/compiler/processing/util/CompilationResultSubject.kt
@@ -83,10 +83,15 @@
                 }
                 appendLine()
             }
-            appendLine("Generated files:")
-            generatedSources.forEach {
-                appendLine(it.relativePath)
+            if (generatedSources.isEmpty()) {
+                appendLine("Generated files: NONE")
+            } else {
+                appendLine("Generated files:")
+                generatedSources.forEach {
+                    appendLine(it.relativePath)
+                }
             }
+            appendLine()
             appendLine("RAW OUTPUT:")
             appendLine(rawOutput())
         }
@@ -210,7 +215,6 @@
      * @see hasNoteContainingMatch
      */
     fun hasWarningContainingMatch(expectedPattern: String): DiagnosticMessagesSubject {
-        shouldSucceed = false
         return hasDiagnosticWithPattern(
             kind = Diagnostic.Kind.WARNING,
             expectedPattern = expectedPattern,
@@ -257,7 +261,6 @@
      * @see hasWarningContainingMatch
      */
     fun hasNoteContainingMatch(expectedPattern: String): DiagnosticMessagesSubject {
-        shouldSucceed = false
         return hasDiagnosticWithPattern(
             kind = Diagnostic.Kind.NOTE,
             expectedPattern = expectedPattern,
@@ -414,7 +417,7 @@
         if (processingException != null) {
             // processor has an error which we want to throw but we also want the subject, hence
             // we wrap it
-            throw createProcessorAssertionError(
+            throw CompilationAssertionError(
                 compilationResult = compilationResult,
                 realError = processingException
             )
@@ -466,13 +469,15 @@
     }
 
     /**
-     * Helper method to create an exception that does not include the stack trace from the test
-     * infra, instead, it just reports the stack trace of the actual error with added log.
+     * Helper error that does not include the stack trace from the test infra, instead, it just
+     * reports the stack trace of the actual error with added log.
      */
-    private fun createProcessorAssertionError(
-        compilationResult: CompilationResult,
-        realError: Throwable
-    ) = object : AssertionError("processor did throw an error\n$compilationResult", realError) {
+    private class CompilationAssertionError(
+        val compilationResult: CompilationResult,
+        val realError: Throwable
+    ) : AssertionError(
+        "Processor did throw an error.\n$compilationResult", realError
+    ) {
         override fun fillInStackTrace(): Throwable {
             return realError
         }
@@ -509,7 +514,7 @@
     diagnostics = diagnostics
 ) {
     override fun rawOutput(): String {
-        return delegate.diagnostics().joinToString {
+        return delegate.diagnostics().joinToString(separator = System.lineSeparator()) {
             it.toString()
         }
     }
@@ -532,7 +537,7 @@
     override fun rawOutput(): String {
         return delegate.diagnostics.flatMap {
             it.value
-        }.joinToString {
+        }.joinToString(separator = System.lineSeparator()) {
             it.toString()
         }
     }
diff --git a/room/room-compiler-processing-testing/src/test/java/androidx/room/compiler/processing/util/DiagnosticsTest.kt b/room/room-compiler-processing-testing/src/test/java/androidx/room/compiler/processing/util/DiagnosticsTest.kt
index 30e21f1..7ded92a 100644
--- a/room/room-compiler-processing-testing/src/test/java/androidx/room/compiler/processing/util/DiagnosticsTest.kt
+++ b/room/room-compiler-processing-testing/src/test/java/androidx/room/compiler/processing/util/DiagnosticsTest.kt
@@ -39,17 +39,45 @@
             }
             invocation.assertCompilationResult {
                 hasNote("note 1")
-                hasWarning("warn 1")
-                hasError("error 1")
+                assertThat(shouldSucceed).isTrue()
                 hasNoteContaining("ote")
-                hasWarningContaining("arn")
-                hasErrorContaining("rror")
+                assertThat(shouldSucceed).isTrue()
                 hasNoteContainingMatch("ote")
-                hasWarningContainingMatch("arn")
-                hasErrorContainingMatch("rror")
                 hasNoteContainingMatch("^note \\d$")
+                assertThat(shouldSucceed).isTrue()
+
+                hasWarning("warn 1")
+                assertThat(shouldSucceed).isTrue()
+                hasWarningContaining("arn")
+                assertThat(shouldSucceed).isTrue()
+                hasWarningContainingMatch("arn")
                 hasWarningContainingMatch("^warn \\d$")
+                assertThat(shouldSucceed).isTrue()
+
+                hasError("error 1")
+                assertThat(shouldSucceed).isFalse()
+                hasErrorContaining("rror")
+                assertThat(shouldSucceed).isFalse()
+                hasErrorContainingMatch("rror")
                 hasErrorContainingMatch("^error \\d$")
+                assertThat(shouldSucceed).isFalse()
+
+                hasNote("note 1")
+                assertThat(shouldSucceed).isFalse()
+                hasNoteContaining("ote")
+                assertThat(shouldSucceed).isFalse()
+                hasNoteContainingMatch("ote")
+                hasNoteContainingMatch("^note \\d$")
+                assertThat(shouldSucceed).isFalse()
+
+                hasWarning("warn 1")
+                assertThat(shouldSucceed).isFalse()
+                hasWarningContaining("arn")
+                assertThat(shouldSucceed).isFalse()
+                hasWarningContainingMatch("arn")
+                hasWarningContainingMatch("^warn \\d$")
+                assertThat(shouldSucceed).isFalse()
+
                 // these should fail:
                 assertThat(
                     runCatching { hasNote("note") }.isFailure
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/PoetExt.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/PoetExt.kt
index 77be512..a425abc 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/PoetExt.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/PoetExt.kt
@@ -17,9 +17,18 @@
 package androidx.room.compiler.codegen
 
 import androidx.room.compiler.processing.XNullability
-import com.squareup.kotlinpoet.javapoet.JTypeName
-import com.squareup.kotlinpoet.javapoet.KTypeName
-import com.squareup.kotlinpoet.javapoet.toKTypeName
+import com.squareup.kotlinpoet.javapoet.JClassName
+import com.squareup.kotlinpoet.javapoet.toKClassName
+
+typealias JCodeBlock = com.squareup.javapoet.CodeBlock
+typealias JCodeBlockBuilder = com.squareup.javapoet.CodeBlock.Builder
+typealias JAnnotationSpecBuilder = com.squareup.javapoet.AnnotationSpec.Builder
+typealias JTypeSpecBuilder = com.squareup.javapoet.TypeSpec.Builder
+typealias KCodeBlock = com.squareup.kotlinpoet.CodeBlock
+typealias KCodeBlockBuilder = com.squareup.kotlinpoet.CodeBlock.Builder
+typealias KAnnotationSpecBuilder = com.squareup.kotlinpoet.AnnotationSpec.Builder
+typealias KTypeSpecBuilder = com.squareup.kotlinpoet.TypeSpec.Builder
+typealias JArrayTypeName = com.squareup.javapoet.ArrayTypeName
 
 // TODO(b/127483380): Recycle to room-compiler?
 val L = "\$L"
@@ -28,9 +37,5 @@
 val S = "\$S"
 val W = "\$W"
 
-internal fun JTypeName.toKTypeName(nullability: XNullability): KTypeName = this.toKTypeName().let {
-    when (nullability) {
-        XNullability.NULLABLE, XNullability.UNKNOWN -> it.copy(nullable = true)
-        XNullability.NONNULL -> it.copy(nullable = false)
-    }
-}
\ No newline at end of file
+// TODO(b/247247366): Temporary migration API, delete me plz!
+fun JClassName.toXClassName() = XClassName(this, this.toKClassName(), XNullability.NONNULL)
\ No newline at end of file
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/XAnnotationSpec.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/XAnnotationSpec.kt
index e6617fb..cafc0f0 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/XAnnotationSpec.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/XAnnotationSpec.kt
@@ -18,8 +18,6 @@
 
 import androidx.room.compiler.codegen.java.JavaAnnotationSpec
 import androidx.room.compiler.codegen.kotlin.KotlinAnnotationSpec
-import com.squareup.kotlinpoet.javapoet.JClassName
-import com.squareup.kotlinpoet.javapoet.toKClassName
 
 interface XAnnotationSpec : TargetLanguage {
 
@@ -41,13 +39,13 @@
     }
 
     companion object {
-        fun builder(language: CodeLanguage, className: JClassName): Builder {
+        fun builder(language: CodeLanguage, className: XClassName): Builder {
             return when (language) {
                 CodeLanguage.JAVA -> JavaAnnotationSpec.Builder(
-                    com.squareup.javapoet.AnnotationSpec.builder(className)
+                    com.squareup.javapoet.AnnotationSpec.builder(className.java)
                 )
                 CodeLanguage.KOTLIN -> KotlinAnnotationSpec.Builder(
-                    com.squareup.kotlinpoet.AnnotationSpec.builder(className.toKClassName())
+                    com.squareup.kotlinpoet.AnnotationSpec.builder(className.kotlin)
                 )
             }
         }
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/XCodeBlock.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/XCodeBlock.kt
index 1e7da00..4b16c2b6 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/XCodeBlock.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/XCodeBlock.kt
@@ -18,7 +18,6 @@
 
 import androidx.room.compiler.codegen.java.JavaCodeBlock
 import androidx.room.compiler.codegen.kotlin.KotlinCodeBlock
-import com.squareup.kotlinpoet.javapoet.JTypeName
 
 interface XCodeBlock : TargetLanguage {
 
@@ -32,7 +31,7 @@
 
         fun addLocalVariable(
             name: String,
-            type: JTypeName,
+            type: XTypeName,
             isMutable: Boolean = false,
             assignExpr: XCodeBlock
         ): Builder
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/XFunSpec.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/XFunSpec.kt
index ff6be2c..898c8d1 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/XFunSpec.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/XFunSpec.kt
@@ -20,20 +20,17 @@
 import androidx.room.compiler.codegen.java.toJavaVisibilityModifier
 import androidx.room.compiler.codegen.kotlin.KotlinFunSpec
 import androidx.room.compiler.codegen.kotlin.toKotlinVisibilityModifier
-import androidx.room.compiler.processing.XNullability
 import com.squareup.javapoet.MethodSpec
 import com.squareup.kotlinpoet.FunSpec
 import com.squareup.kotlinpoet.KModifier
-import com.squareup.kotlinpoet.javapoet.JTypeName
 
 interface XFunSpec : TargetLanguage {
 
     interface Builder : TargetLanguage {
         // TODO(b/247247442): Maybe make a XParameterSpec ?
         fun addParameter(
-            typeName: JTypeName,
+            typeName: XTypeName,
             name: String,
-            nullability: XNullability,
             annotations: List<XAnnotationSpec> = emptyList()
         ): Builder
 
@@ -43,10 +40,7 @@
 
         fun callSuperConstructor(vararg args: XCodeBlock): Builder
 
-        fun returns(
-            typeName: JTypeName,
-            nullability: XNullability,
-        ): Builder
+        fun returns(typeName: XTypeName): Builder
 
         fun build(): XFunSpec
 
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/XTypeName.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/XTypeName.kt
new file mode 100644
index 0000000..5eae6bfc
--- /dev/null
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/XTypeName.kt
@@ -0,0 +1,212 @@
+/*
+ * Copyright 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 androidx.room.compiler.codegen
+
+import androidx.room.compiler.processing.XNullability
+import com.squareup.kotlinpoet.asClassName
+import com.squareup.kotlinpoet.asTypeName
+import com.squareup.kotlinpoet.javapoet.JClassName
+import com.squareup.kotlinpoet.javapoet.JTypeName
+import com.squareup.kotlinpoet.javapoet.KClassName
+import com.squareup.kotlinpoet.javapoet.KTypeName
+import kotlin.reflect.KClass
+
+/**
+ * Represents a type name in Java and Kotlin's type system.
+ *
+ * It simply contains a [com.squareup.javapoet.TypeName] and a [com.squareup.kotlinpoet.TypeName].
+ * If the name comes from xprocessing APIs then the KotlinPoet name will default to 'Unavailable'
+ * if the processing backend is not KSP.
+ *
+ * @see [androidx.room.compiler.processing.XType.asTypeName]
+ */
+open class XTypeName protected constructor(
+    internal open val java: JTypeName,
+    internal open val kotlin: KTypeName,
+    internal val nullability: XNullability
+) {
+
+    override fun equals(other: Any?): Boolean {
+        if (this === other) return true
+        if (other !is XTypeName) return false
+        if (java != other.java) return false
+        if (kotlin != UNAVAILABLE_KTYPE_NAME && other.kotlin != UNAVAILABLE_KTYPE_NAME) {
+            if (kotlin != other.kotlin) return false
+        }
+        return true
+    }
+
+    override fun hashCode(): Int {
+        return java.hashCode()
+    }
+
+    override fun toString() = buildString {
+        append("XTypeName[")
+        append(java)
+        append(" / ")
+        if (kotlin != UNAVAILABLE_KTYPE_NAME) {
+            append(kotlin)
+        } else {
+            append("UNAVAILABLE")
+        }
+        append("]")
+    }
+
+    companion object {
+        val PRIMITIVE_BOOLEAN = Boolean::class.asPrimitiveTypeName()
+        val PRIMITIVE_BYTE = Byte::class.asPrimitiveTypeName()
+        val PRIMITIVE_SHORT = Short::class.asPrimitiveTypeName()
+        val PRIMITIVE_INT = Int::class.asPrimitiveTypeName()
+        val PRIMITIVE_LONG = Long::class.asPrimitiveTypeName()
+        val PRIMITIVE_CHAR = Char::class.asPrimitiveTypeName()
+        val PRIMITIVE_FLOAT = Float::class.asPrimitiveTypeName()
+        val PRIMITIVE_DOUBLE = Double::class.asPrimitiveTypeName()
+
+        /**
+         * The default [KTypeName] returned by xprocessing APIs when the backend is not KSP.
+         */
+        internal val UNAVAILABLE_KTYPE_NAME =
+            KClassName("androidx.room.compiler.codegen", "Unavailable")
+
+        operator fun invoke(
+            java: JTypeName,
+            kotlin: KTypeName,
+            nullability: XNullability = XNullability.NONNULL
+        ): XTypeName {
+            return XTypeName(java, kotlin, nullability)
+        }
+    }
+}
+
+/**
+ * Represents a fully-qualified class name.
+ *
+ * It simply contains a [com.squareup.javapoet.ClassName] and a [com.squareup.kotlinpoet.ClassName].
+ *
+ * @see [androidx.room.compiler.processing.XTypeElement.asClassName]
+ */
+class XClassName internal constructor(
+    override val java: JClassName,
+    override val kotlin: KClassName,
+    nullability: XNullability
+) : XTypeName(java, kotlin, nullability) {
+
+    // TODO(b/248000692): Using the JClassName as source of truth. This is wrong since we need to
+    //  handle Kotlin interop types for KotlinPoet, i.e. java.lang.String to kotlin.String.
+    //  But a decision has to be made...
+    val packageName: String = java.packageName()
+    val simpleNames: List<String> = java.simpleNames()
+    val canonicalName: String = java.canonicalName()
+
+    fun copy(nullable: Boolean): XClassName {
+        return XClassName(
+            java = java,
+            kotlin = kotlin.copy(nullable = nullable) as KClassName,
+            nullability = if (nullable) XNullability.NULLABLE else XNullability.NONNULL
+        )
+    }
+
+    companion object {
+        /**
+         * Creates an class name from the given parts.
+         */
+        // TODO(b/248633751): Handle interop types.
+        fun get(
+            packageName: String,
+            vararg names: String
+        ): XClassName {
+            return XClassName(
+                java = JClassName.get(packageName, names.first(), *names.drop(1).toTypedArray()),
+                kotlin = KClassName(packageName, *names),
+                nullability = XNullability.NONNULL
+            )
+        }
+    }
+}
+
+/**
+ * Creates a [XClassName] from the receiver [KClass]
+ *
+ * When the receiver [KClass] is a Kotlin interop primitive, such as [kotlin.Int] then the returned
+ * [XClassName] contains the boxed JavaPoet class name.
+ *
+ * When the receiver [KClass] is a Kotlin interop collection, such as [kotlin.collections.List]
+ * then the returned [XClassName] the corresponding JavaPoet class name. See:
+ * https://kotlinlang.org/docs/reference/java-interop.html#mapped-types.
+ *
+ * When the receiver [KClass] is a Kotlin mutable collection, such as
+ * [kotlin.collections.MutableList] then the non-mutable [XClassName] is returned due to the
+ * mutable interfaces only existing at compile-time, see:
+ * https://youtrack.jetbrains.com/issue/KT-11754.
+ */
+fun KClass<*>.asClassName(): XClassName {
+    val jClassName = if (this.java.isPrimitive) {
+        getBoxedJClassName(this.java)
+    } else {
+        JClassName.get(this.java)
+    }
+    val kClassName = this.asClassName()
+    return XClassName(
+        java = jClassName,
+        kotlin = kClassName,
+        nullability = XNullability.NONNULL
+    )
+}
+
+private fun getBoxedJClassName(klass: Class<*>): JClassName = when (klass) {
+    java.lang.Void.TYPE -> JTypeName.VOID.box()
+    java.lang.Boolean.TYPE -> JTypeName.BOOLEAN.box()
+    java.lang.Byte.TYPE -> JTypeName.BYTE.box()
+    java.lang.Short.TYPE -> JTypeName.SHORT.box()
+    java.lang.Integer.TYPE -> JTypeName.INT.box()
+    java.lang.Long.TYPE -> JTypeName.LONG.box()
+    java.lang.Character.TYPE -> JTypeName.CHAR.box()
+    java.lang.Float.TYPE -> JTypeName.FLOAT.box()
+    java.lang.Double.TYPE -> JTypeName.DOUBLE.box()
+    else -> error("Can't get JTypeName from java.lang.Class: $klass")
+} as JClassName
+
+/**
+ * Creates a [XTypeName] whose JavaPoet name is a primitive name and KotlinPoet is the interop type.
+ *
+ * This function is useful since [asClassName] only supports creating class names and specifically
+ * only the boxed version of primitives.
+ */
+internal fun KClass<*>.asPrimitiveTypeName(): XTypeName {
+    require(this.java.isPrimitive) {
+        "$this does not represent a primitive."
+    }
+    val jTypeName = getPrimitiveJTypeName(this.java)
+    val kTypeName = this.asTypeName()
+    return XTypeName(jTypeName, kTypeName)
+}
+
+private fun getPrimitiveJTypeName(klass: Class<*>): JTypeName = when (klass) {
+    java.lang.Void.TYPE -> JTypeName.VOID
+    java.lang.Boolean.TYPE -> JTypeName.BOOLEAN
+    java.lang.Byte.TYPE -> JTypeName.BYTE
+    java.lang.Short.TYPE -> JTypeName.SHORT
+    java.lang.Integer.TYPE -> JTypeName.INT
+    java.lang.Long.TYPE -> JTypeName.LONG
+    java.lang.Character.TYPE -> JTypeName.CHAR
+    java.lang.Float.TYPE -> JTypeName.FLOAT
+    java.lang.Double.TYPE -> JTypeName.DOUBLE
+    else -> error("Can't get JTypeName from java.lang.Class: $klass")
+}
+
+fun XTypeName.toJavaPoet(): JTypeName = this.java
+fun XClassName.toJavaPoet(): JClassName = this.java
\ No newline at end of file
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/XTypeSpec.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/XTypeSpec.kt
index e1799c5..506d1c6 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/XTypeSpec.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/XTypeSpec.kt
@@ -19,25 +19,20 @@
 import androidx.room.compiler.codegen.java.JavaTypeSpec
 import androidx.room.compiler.codegen.kotlin.KotlinTypeSpec
 import androidx.room.compiler.processing.XElement
-import androidx.room.compiler.processing.XNullability
 import androidx.room.compiler.processing.addOriginatingElement
-import com.squareup.kotlinpoet.javapoet.JClassName
-import com.squareup.kotlinpoet.javapoet.JTypeName
-import com.squareup.kotlinpoet.javapoet.toKClassName
 
 interface XTypeSpec : TargetLanguage {
 
-    val className: JClassName
+    val className: XClassName
 
     interface Builder : TargetLanguage {
-        fun superclass(typeName: JTypeName): Builder
+        fun superclass(typeName: XTypeName): Builder
         fun addAnnotation(annotation: XAnnotationSpec)
 
         // TODO(b/247241418): Maybe make a XPropertySpec ?
         fun addProperty(
-            typeName: JTypeName,
+            typeName: XTypeName,
             name: String,
-            nullability: XNullability,
             visibility: VisibilityModifier,
             isMutable: Boolean = false,
             initExpr: XCodeBlock? = null,
@@ -67,15 +62,15 @@
     }
 
     companion object {
-        fun classBuilder(language: CodeLanguage, className: JClassName): Builder {
+        fun classBuilder(language: CodeLanguage, className: XClassName): Builder {
             return when (language) {
                 CodeLanguage.JAVA -> JavaTypeSpec.Builder(
                     className = className,
-                    actual = com.squareup.javapoet.TypeSpec.classBuilder(className)
+                    actual = com.squareup.javapoet.TypeSpec.classBuilder(className.java)
                 )
                 CodeLanguage.KOTLIN -> KotlinTypeSpec.Builder(
                     className = className,
-                    actual = com.squareup.kotlinpoet.TypeSpec.classBuilder(className.toKClassName())
+                    actual = com.squareup.kotlinpoet.TypeSpec.classBuilder(className.kotlin)
                 )
             }
         }
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/ClassNames.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/java/ClassNames.kt
similarity index 94%
rename from room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/ClassNames.kt
rename to room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/java/ClassNames.kt
index 465ea86..b4637ca 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/ClassNames.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/java/ClassNames.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.room.compiler.codegen
+package androidx.room.compiler.codegen.java
 
 import com.squareup.javapoet.ClassName
 
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/java/JavaAnnotationSpec.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/java/JavaAnnotationSpec.kt
index 06e915a..2a3e25f 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/java/JavaAnnotationSpec.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/java/JavaAnnotationSpec.kt
@@ -16,15 +16,17 @@
 
 package androidx.room.compiler.codegen.java
 
+import androidx.room.compiler.codegen.JAnnotationSpecBuilder
 import androidx.room.compiler.codegen.XAnnotationSpec
 import androidx.room.compiler.codegen.XCodeBlock
+import com.squareup.kotlinpoet.javapoet.JAnnotationSpec
 
 internal class JavaAnnotationSpec(
-    internal val actual: com.squareup.javapoet.AnnotationSpec
+    internal val actual: JAnnotationSpec
 ) : JavaLang(), XAnnotationSpec {
 
     internal class Builder(
-        internal val actual: com.squareup.javapoet.AnnotationSpec.Builder
+        internal val actual: JAnnotationSpecBuilder
     ) : JavaLang(), XAnnotationSpec.Builder {
         override fun addMember(name: String, code: XCodeBlock) = apply {
             require(code is JavaCodeBlock)
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/java/JavaCodeBlock.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/java/JavaCodeBlock.kt
index 6bc983b..a5e9cff 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/java/JavaCodeBlock.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/java/JavaCodeBlock.kt
@@ -17,18 +17,19 @@
 package androidx.room.compiler.codegen.java
 
 import androidx.room.compiler.codegen.CodeLanguage
+import androidx.room.compiler.codegen.JCodeBlock
 import androidx.room.compiler.codegen.TargetLanguage
 import androidx.room.compiler.codegen.XCodeBlock
 import androidx.room.compiler.codegen.XFunSpec
+import androidx.room.compiler.codegen.XTypeName
 import androidx.room.compiler.codegen.XTypeSpec
-import com.squareup.kotlinpoet.javapoet.JTypeName
 
 internal class JavaCodeBlock(
-    internal val actual: com.squareup.javapoet.CodeBlock
+    internal val actual: JCodeBlock
 ) : JavaLang(), XCodeBlock {
 
     internal class Builder : JavaLang(), XCodeBlock.Builder {
-        internal val actual = com.squareup.javapoet.CodeBlock.builder()
+        internal val actual = JCodeBlock.builder()
 
         override fun add(code: XCodeBlock) = apply {
             require(code is JavaCodeBlock)
@@ -49,7 +50,7 @@
 
         override fun addLocalVariable(
             name: String,
-            type: JTypeName,
+            type: XTypeName,
             isMutable: Boolean,
             assignExpr: XCodeBlock
         ) = apply {
@@ -78,6 +79,7 @@
                     check(arg.language == CodeLanguage.JAVA) { "$arg is not JavaCode" }
                 }
                 when (arg) {
+                    is XTypeName -> arg.java
                     is XTypeSpec -> (arg as JavaTypeSpec).actual
                     is XFunSpec -> (arg as JavaFunSpec).actual
                     is XCodeBlock -> (arg as JavaCodeBlock).actual
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/java/JavaFunSpec.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/java/JavaFunSpec.kt
index ae0bc2d..a8113df 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/java/JavaFunSpec.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/java/JavaFunSpec.kt
@@ -17,12 +17,11 @@
 package androidx.room.compiler.codegen.java
 
 import androidx.room.compiler.codegen.L
-import androidx.room.compiler.codegen.NONNULL_ANNOTATION
-import androidx.room.compiler.codegen.NULLABLE_ANNOTATION
 import androidx.room.compiler.codegen.VisibilityModifier
 import androidx.room.compiler.codegen.XAnnotationSpec
 import androidx.room.compiler.codegen.XCodeBlock
 import androidx.room.compiler.codegen.XFunSpec
+import androidx.room.compiler.codegen.XTypeName
 import androidx.room.compiler.processing.KnownTypeNames.KOTLIN_UNIT
 import androidx.room.compiler.processing.XNullability
 import com.squareup.javapoet.CodeBlock
@@ -36,7 +35,7 @@
 ) : JavaLang(), XFunSpec {
 
     internal class Builder(
-        internal val actual: com.squareup.javapoet.MethodSpec.Builder
+        internal val actual: MethodSpec.Builder
     ) : JavaLang(), XFunSpec.Builder {
 
         override fun addCode(code: XCodeBlock) = apply {
@@ -45,17 +44,16 @@
         }
 
         override fun addParameter(
-            typeName: JTypeName,
+            typeName: XTypeName,
             name: String,
-            nullability: XNullability,
             annotations: List<XAnnotationSpec>
         ) = apply {
             actual.addParameter(
-                ParameterSpec.builder(typeName, name, Modifier.FINAL)
+                ParameterSpec.builder(typeName.java, name, Modifier.FINAL)
                     .apply {
-                        if (nullability == XNullability.NULLABLE) {
+                        if (typeName.nullability == XNullability.NULLABLE) {
                             addAnnotation(NULLABLE_ANNOTATION)
-                        } else if (nullability == XNullability.NONNULL) {
+                        } else if (typeName.nullability == XNullability.NONNULL) {
                             addAnnotation(NONNULL_ANNOTATION)
                         }
                     }.build()
@@ -76,19 +74,19 @@
             )
         }
 
-        override fun returns(typeName: JTypeName, nullability: XNullability) = apply {
-            if (typeName == com.squareup.javapoet.TypeName.VOID || typeName == KOTLIN_UNIT) {
+        override fun returns(typeName: XTypeName) = apply {
+            if (typeName.java == JTypeName.VOID || typeName.java == KOTLIN_UNIT) {
                 return@apply
             }
             // TODO(b/247242374) Add nullability annotations for non-private methods
             if (!actual.modifiers.contains(Modifier.PRIVATE)) {
-                if (nullability == XNullability.NULLABLE) {
+                if (typeName.nullability == XNullability.NULLABLE) {
                     actual.addAnnotation(NULLABLE_ANNOTATION)
-                } else if (nullability == XNullability.NONNULL) {
+                } else if (typeName.nullability == XNullability.NONNULL) {
                     actual.addAnnotation(NONNULL_ANNOTATION)
                 }
             }
-            actual.returns(typeName)
+            actual.returns(typeName.java)
         }
 
         override fun build() = JavaFunSpec(actual.build())
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/java/JavaTypeSpec.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/java/JavaTypeSpec.kt
index 0dd5016..952ef06 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/java/JavaTypeSpec.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/java/JavaTypeSpec.kt
@@ -16,30 +16,30 @@
 
 package androidx.room.compiler.codegen.java
 
-import androidx.room.compiler.codegen.NONNULL_ANNOTATION
-import androidx.room.compiler.codegen.NULLABLE_ANNOTATION
+import androidx.room.compiler.codegen.JTypeSpecBuilder
 import androidx.room.compiler.codegen.VisibilityModifier
 import androidx.room.compiler.codegen.XAnnotationSpec
+import androidx.room.compiler.codegen.XClassName
 import androidx.room.compiler.codegen.XCodeBlock
 import androidx.room.compiler.codegen.XFunSpec
+import androidx.room.compiler.codegen.XTypeName
 import androidx.room.compiler.codegen.XTypeSpec
 import androidx.room.compiler.processing.XNullability
 import com.squareup.javapoet.FieldSpec
-import com.squareup.kotlinpoet.javapoet.JClassName
-import com.squareup.kotlinpoet.javapoet.JTypeName
+import com.squareup.kotlinpoet.javapoet.JTypeSpec
 import javax.lang.model.element.Modifier
 
 internal class JavaTypeSpec(
-    override val className: JClassName,
-    internal val actual: com.squareup.javapoet.TypeSpec
+    override val className: XClassName,
+    internal val actual: JTypeSpec
 ) : JavaLang(), XTypeSpec {
 
     internal class Builder(
-        private val className: JClassName,
-        internal val actual: com.squareup.javapoet.TypeSpec.Builder
+        private val className: XClassName,
+        internal val actual: JTypeSpecBuilder
     ) : JavaLang(), XTypeSpec.Builder {
-        override fun superclass(typeName: JTypeName) = apply {
-            actual.superclass(typeName)
+        override fun superclass(typeName: XTypeName) = apply {
+            actual.superclass(typeName.java)
         }
 
         override fun addAnnotation(annotation: XAnnotationSpec) {
@@ -48,22 +48,21 @@
         }
 
         override fun addProperty(
-            typeName: JTypeName,
+            typeName: XTypeName,
             name: String,
-            nullability: XNullability,
             visibility: VisibilityModifier,
             isMutable: Boolean,
             initExpr: XCodeBlock?,
             annotations: List<XAnnotationSpec>
         ) = apply {
             actual.addField(
-                FieldSpec.builder(typeName, name).apply {
+                FieldSpec.builder(typeName.java, name).apply {
                     val visibilityModifier = visibility.toJavaVisibilityModifier()
                     // TODO(b/247242374) Add nullability annotations for non-private fields
                     if (visibilityModifier != Modifier.PRIVATE) {
-                        if (nullability == XNullability.NULLABLE) {
+                        if (typeName.nullability == XNullability.NULLABLE) {
                             addAnnotation(NULLABLE_ANNOTATION)
-                        } else if (nullability == XNullability.NONNULL) {
+                        } else if (typeName.nullability == XNullability.NONNULL) {
                             addAnnotation(NONNULL_ANNOTATION)
                         }
                     }
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/kotlin/KotlinAnnotationSpec.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/kotlin/KotlinAnnotationSpec.kt
index cdec2ad2..50222ca 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/kotlin/KotlinAnnotationSpec.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/kotlin/KotlinAnnotationSpec.kt
@@ -16,16 +16,18 @@
 
 package androidx.room.compiler.codegen.kotlin
 
+import androidx.room.compiler.codegen.KAnnotationSpecBuilder
 import androidx.room.compiler.codegen.XAnnotationSpec
 import androidx.room.compiler.codegen.XCodeBlock
 import com.squareup.kotlinpoet.CodeBlock
+import com.squareup.kotlinpoet.javapoet.KAnnotationSpec
 
 internal class KotlinAnnotationSpec(
-    internal val actual: com.squareup.kotlinpoet.AnnotationSpec
+    internal val actual: KAnnotationSpec
 ) : KotlinLang(), XAnnotationSpec {
 
     internal class Builder(
-        internal val actual: com.squareup.kotlinpoet.AnnotationSpec.Builder
+        internal val actual: KAnnotationSpecBuilder
     ) : KotlinLang(), XAnnotationSpec.Builder {
         override fun addMember(name: String, code: XCodeBlock) = apply {
             require(code is KotlinCodeBlock)
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/kotlin/KotlinCodeBlock.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/kotlin/KotlinCodeBlock.kt
index 1ccc851..ede67d2 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/kotlin/KotlinCodeBlock.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/kotlin/KotlinCodeBlock.kt
@@ -17,20 +17,21 @@
 package androidx.room.compiler.codegen.kotlin
 
 import androidx.room.compiler.codegen.CodeLanguage
+import androidx.room.compiler.codegen.KCodeBlock
+import androidx.room.compiler.codegen.KCodeBlockBuilder
 import androidx.room.compiler.codegen.TargetLanguage
 import androidx.room.compiler.codegen.XCodeBlock
 import androidx.room.compiler.codegen.XFunSpec
+import androidx.room.compiler.codegen.XTypeName
 import androidx.room.compiler.codegen.XTypeSpec
-import com.squareup.kotlinpoet.javapoet.JTypeName
-import com.squareup.kotlinpoet.javapoet.toKTypeName
 
 internal class KotlinCodeBlock(
-    internal val actual: com.squareup.kotlinpoet.CodeBlock
+    internal val actual: KCodeBlock
 ) : KotlinLang(), XCodeBlock {
 
     internal class Builder : KotlinLang(), XCodeBlock.Builder {
 
-        internal val actual = com.squareup.kotlinpoet.CodeBlock.Builder()
+        internal val actual = KCodeBlockBuilder()
 
         override fun add(code: XCodeBlock) = apply {
             require(code is KotlinCodeBlock)
@@ -51,7 +52,7 @@
 
         override fun addLocalVariable(
             name: String,
-            type: JTypeName,
+            type: XTypeName,
             isMutable: Boolean,
             assignExpr: XCodeBlock
         ) = apply {
@@ -59,7 +60,7 @@
             val varOrVal = if (isMutable) "var" else "val"
             actual.addStatement(
                 "$varOrVal %L: %T = %L",
-                type.toKTypeName(),
+                type.kotlin,
                 name,
                 assignExpr.actual
             )
@@ -74,13 +75,11 @@
         private fun processArgs(args: Array<out Any?>): Array<Any?> {
             return Array(args.size) { index ->
                 val arg = args[index]
-                if (arg is JTypeName) {
-                    return@Array arg.toKTypeName()
-                }
                 if (arg is TargetLanguage) {
                     check(arg.language == CodeLanguage.KOTLIN) { "$arg is not KotlinCode" }
                 }
                 when (arg) {
+                    is XTypeName -> arg.kotlin
                     is XTypeSpec -> (arg as KotlinTypeSpec).actual
                     is XFunSpec -> (arg as KotlinFunSpec).actual
                     is XCodeBlock -> (arg as KotlinCodeBlock).actual
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/kotlin/KotlinFunSpec.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/kotlin/KotlinFunSpec.kt
index 0faf0ab..fdcb73f 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/kotlin/KotlinFunSpec.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/kotlin/KotlinFunSpec.kt
@@ -20,20 +20,18 @@
 import androidx.room.compiler.codegen.XAnnotationSpec
 import androidx.room.compiler.codegen.XCodeBlock
 import androidx.room.compiler.codegen.XFunSpec
-import androidx.room.compiler.codegen.toKTypeName
-import androidx.room.compiler.processing.KnownTypeNames.KOTLIN_UNIT
-import androidx.room.compiler.processing.XNullability
+import androidx.room.compiler.codegen.XTypeName
 import com.squareup.kotlinpoet.FunSpec
 import com.squareup.kotlinpoet.KModifier
 import com.squareup.kotlinpoet.ParameterSpec
-import com.squareup.kotlinpoet.javapoet.JTypeName
+import com.squareup.kotlinpoet.UNIT
 
 internal class KotlinFunSpec(
     internal val actual: FunSpec
 ) : KotlinLang(), XFunSpec {
 
     internal class Builder(
-        internal val actual: com.squareup.kotlinpoet.FunSpec.Builder
+        internal val actual: FunSpec.Builder
     ) : KotlinLang(), XFunSpec.Builder {
 
         override fun addCode(code: XCodeBlock) = apply {
@@ -42,13 +40,12 @@
         }
 
         override fun addParameter(
-            typeName: JTypeName,
+            typeName: XTypeName,
             name: String,
-            nullability: XNullability,
             annotations: List<XAnnotationSpec>
         ) = apply {
             actual.addParameter(
-                ParameterSpec.builder(name, typeName.toKTypeName(nullability)).apply {
+                ParameterSpec.builder(name, typeName.kotlin).apply {
                     // TODO(b/247247439): Add other annotations
                 }.build()
             )
@@ -63,11 +60,11 @@
             )
         }
 
-        override fun returns(typeName: JTypeName, nullability: XNullability) = apply {
-            if (typeName == com.squareup.javapoet.TypeName.VOID || typeName == KOTLIN_UNIT) {
+        override fun returns(typeName: XTypeName) = apply {
+            if (typeName.kotlin == UNIT) {
                 return@apply
             }
-            actual.returns(typeName.toKTypeName(nullability))
+            actual.returns(typeName.kotlin)
         }
 
         override fun build() = KotlinFunSpec(actual.build())
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/kotlin/KotlinTypeSpec.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/kotlin/KotlinTypeSpec.kt
index 4223657..da898fc 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/kotlin/KotlinTypeSpec.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/codegen/kotlin/KotlinTypeSpec.kt
@@ -16,29 +16,28 @@
 
 package androidx.room.compiler.codegen.kotlin
 
+import androidx.room.compiler.codegen.KTypeSpecBuilder
 import androidx.room.compiler.codegen.VisibilityModifier
 import androidx.room.compiler.codegen.XAnnotationSpec
+import androidx.room.compiler.codegen.XClassName
 import androidx.room.compiler.codegen.XCodeBlock
 import androidx.room.compiler.codegen.XFunSpec
+import androidx.room.compiler.codegen.XTypeName
 import androidx.room.compiler.codegen.XTypeSpec
-import androidx.room.compiler.codegen.toKTypeName
-import androidx.room.compiler.processing.XNullability
 import com.squareup.kotlinpoet.PropertySpec
-import com.squareup.kotlinpoet.javapoet.JClassName
-import com.squareup.kotlinpoet.javapoet.JTypeName
-import com.squareup.kotlinpoet.javapoet.toKTypeName
+import com.squareup.kotlinpoet.javapoet.KTypeSpec
 
 internal class KotlinTypeSpec(
-    override val className: JClassName,
-    internal val actual: com.squareup.kotlinpoet.TypeSpec
+    override val className: XClassName,
+    internal val actual: KTypeSpec
 ) : KotlinLang(), XTypeSpec {
 
     internal class Builder(
-        private val className: JClassName,
-        internal val actual: com.squareup.kotlinpoet.TypeSpec.Builder
+        private val className: XClassName,
+        internal val actual: KTypeSpecBuilder
     ) : KotlinLang(), XTypeSpec.Builder {
-        override fun superclass(typeName: JTypeName) = apply {
-            actual.superclass(typeName.toKTypeName())
+        override fun superclass(typeName: XTypeName) = apply {
+            actual.superclass(typeName.kotlin)
         }
 
         override fun addAnnotation(annotation: XAnnotationSpec) {
@@ -47,16 +46,15 @@
         }
 
         override fun addProperty(
-            typeName: JTypeName,
+            typeName: XTypeName,
             name: String,
-            nullability: XNullability,
             visibility: VisibilityModifier,
             isMutable: Boolean,
             initExpr: XCodeBlock?,
             annotations: List<XAnnotationSpec>
         ) = apply {
             actual.addProperty(
-                PropertySpec.builder(name, typeName.toKTypeName(nullability)).apply {
+                PropertySpec.builder(name, typeName.kotlin).apply {
                     mutable(isMutable)
                     addModifiers(visibility.toKotlinVisibilityModifier())
                     initExpr?.let {
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/JavaPoetExt.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/JavaPoetExt.kt
index 95b43d7..6d87e42 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/JavaPoetExt.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/JavaPoetExt.kt
@@ -15,14 +15,14 @@
  */
 package androidx.room.compiler.processing
 
-import java.lang.Character.isISOControl
 import com.squareup.javapoet.AnnotationSpec
-import com.squareup.javapoet.ClassName
 import com.squareup.javapoet.MethodSpec
 import com.squareup.javapoet.ParameterSpec
 import com.squareup.javapoet.ParameterizedTypeName
 import com.squareup.javapoet.TypeName
 import com.squareup.javapoet.TypeSpec
+import com.squareup.kotlinpoet.javapoet.JClassName
+import java.lang.Character.isISOControl
 import javax.lang.model.SourceVersion
 import javax.lang.model.element.Modifier
 import javax.lang.model.type.TypeKind
@@ -37,7 +37,8 @@
  *
  * We should still strive to avoid these cases, maybe turn it to an error in tests.
  */
-private val NONE_TYPE_NAME = ClassName.get("androidx.room.compiler.processing.error", "NotAType")
+internal val JAVA_NONE_TYPE_NAME: JClassName =
+    JClassName.get("androidx.room.compiler.processing.error", "NotAType")
 
 fun XAnnotation.toAnnotationSpec(): AnnotationSpec {
   val builder = AnnotationSpec.builder(className)
@@ -50,18 +51,18 @@
     requireNotNull(value) { "value == null, constant non-null value expected for $name" }
     require(SourceVersion.isName(name)) { "not a valid name: $name" }
     when {
-      hasListValue() -> asAnnotationValueList().forEach { addAnnotationValue(it) }
-      hasAnnotationValue() -> addMember(name, "\$L", asAnnotation().toAnnotationSpec())
-      hasEnumValue() -> addMember(
-        name, "\$T.\$L", asEnum().enclosingElement.className, asEnum().name
-      )
-      hasTypeValue() -> addMember(name, "\$T.class", asType().typeName)
-      hasStringValue() -> addMember(name, "\$S", asString())
-      hasFloatValue() -> addMember(name, "\$Lf", asFloat())
-      hasCharValue() -> addMember(
-        name, "'\$L'", characterLiteralWithoutSingleQuotes(asChar())
-      )
-      else -> addMember(name, "\$L", value)
+        hasListValue() -> asAnnotationValueList().forEach { addAnnotationValue(it) }
+        hasAnnotationValue() -> addMember(name, "\$L", asAnnotation().toAnnotationSpec())
+        hasEnumValue() -> addMember(
+            name, "\$T.\$L", asEnum().enclosingElement.asClassName().java, asEnum().name
+        )
+        hasTypeValue() -> addMember(name, "\$T.class", asType().asTypeName().java)
+        hasStringValue() -> addMember(name, "\$S", asString())
+        hasFloatValue() -> addMember(name, "\$Lf", asFloat())
+        hasCharValue() -> addMember(
+            name, "'\$L'", characterLiteralWithoutSingleQuotes(asChar())
+        )
+        else -> addMember(name, "\$L", value)
     }
   }
 }
@@ -82,7 +83,7 @@
 }
 
 internal fun TypeMirror.safeTypeName(): TypeName = if (kind == TypeKind.NONE) {
-    NONE_TYPE_NAME
+    JAVA_NONE_TYPE_NAME
 } else {
     TypeName.get(this)
 }
@@ -178,7 +179,7 @@
             resolvedType.parameterTypes.forEachIndexed { index, paramType ->
                 addParameter(
                     ParameterSpec.builder(
-                        paramType.typeName,
+                        paramType.asTypeName().java,
                         executableElement.parameters[index].name,
                         *paramModifiers
                     ).build()
@@ -192,9 +193,9 @@
             addAnnotation(Override::class.java)
             varargs(executableElement.isVarArgs())
             executableElement.thrownTypes.forEach {
-                addException(it.typeName)
+                addException(it.asTypeName().java)
             }
-            returns(resolvedType.returnType.typeName)
+            returns(resolvedType.returnType.asTypeName().java)
         }
     }
 }
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/KotlinPoetExt.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/KotlinPoetExt.kt
index 02affec..407495d 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/KotlinPoetExt.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/KotlinPoetExt.kt
@@ -17,6 +17,12 @@
 package androidx.room.compiler.processing
 
 import com.squareup.kotlinpoet.OriginatingElementsHolder
+import com.squareup.kotlinpoet.ParameterizedTypeName
+import com.squareup.kotlinpoet.TypeName
+import com.squareup.kotlinpoet.javapoet.KClassName
+
+internal val KOTLIN_NONE_TYPE_NAME: KClassName =
+    KClassName("androidx.room.compiler.processing.error", "NotAType")
 
 /**
  * Adds the given element as an originating element for compilation.
@@ -27,4 +33,12 @@
 ): T {
     element.originatingElementForPoet()?.let(this::addOriginatingElement)
     return this
+}
+
+internal fun TypeName.rawTypeName(): TypeName {
+    return if (this is ParameterizedTypeName) {
+        this.rawType
+    } else {
+        this
+    }
 }
\ No newline at end of file
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XAnnotation.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XAnnotation.kt
index b9325e6..d40c108 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XAnnotation.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XAnnotation.kt
@@ -66,7 +66,7 @@
      * [name].
      */
     val className: ClassName
-        get() = typeElement.className
+        get() = typeElement.asClassName().java
 
     /** All values declared in the annotation class. */
     val annotationValues: List<XAnnotationValue>
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XConstructorElement.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XConstructorElement.kt
index 3053849..07d4bd2 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XConstructorElement.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XConstructorElement.kt
@@ -32,7 +32,7 @@
             append("(")
             append(
                 parameters.joinToString(", ") {
-                    it.type.typeName.toString()
+                    it.type.asTypeName().java.toString()
                 }
             )
             append(")")
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XFiler.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XFiler.kt
index d5cc7f0..227ba42 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XFiler.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XFiler.kt
@@ -53,17 +53,17 @@
 }
 
 fun XTypeSpec.writeTo(generator: XFiler, mode: XFiler.Mode = XFiler.Mode.Isolating) {
-    require(this.className.simpleNames().size == 1) { "XTypeSpec must be a top-level class." }
+    require(this.className.simpleNames.size == 1) { "XTypeSpec must be a top-level class." }
     when (this.language) {
         CodeLanguage.JAVA -> {
             check(this is JavaTypeSpec)
-            JavaFile.builder(this.className.packageName(), this.actual)
+            JavaFile.builder(this.className.packageName, this.actual)
                 .build()
                 .writeTo(generator, mode)
         }
         CodeLanguage.KOTLIN -> {
             check(this is KotlinTypeSpec)
-            FileSpec.builder(this.className.packageName(), this.className.simpleName())
+            FileSpec.builder(this.className.packageName, this.className.simpleNames.single())
                 .addType(this.actual)
                 .build()
                 .writeTo(generator, mode)
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XMemberContainer.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XMemberContainer.kt
index 01bcc24..1e51046 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XMemberContainer.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XMemberContainer.kt
@@ -16,6 +16,7 @@
 
 package androidx.room.compiler.processing
 
+import androidx.room.compiler.codegen.XClassName
 import com.squareup.javapoet.ClassName
 
 /**
@@ -31,11 +32,27 @@
 
     /**
      * The JVM ClassName for this container.
-     * For top level members of a Kotlin file, you can use this [className] for code generation.
+     *
+     * For top level members of a Kotlin file, you can use this [ClassName] for code generation.
      */
+    // TODO(b/247248619): Deprecate when more progress is made, otherwise -werror fails the build.
+    // @Deprecated(
+    //     message = "Use asClassName().toJavaPoet() to be clear the name is for JavaPoet.",
+    //     replaceWith = ReplaceWith(
+    //         expression = "asClassName().toJavaPoet()",
+    //         imports = ["androidx.room.compiler.codegen.toJavaPoet"]
+    //     )
+    // )
     val className: ClassName
 
     /**
+     * The JVM ClassName for this container.
+     *
+     * For top level members of a Kotlin file, you can use this [XClassName] for code generation.
+     */
+    fun asClassName(): XClassName
+
+    /**
      * The [XType] for the container if this is an [XTypeElement] otherwise `null` if a type
      * representing this container does not exist (e.g. a top level Kotlin source file)
      */
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XMethodElement.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XMethodElement.kt
index 96fcfc5..13fb370 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XMethodElement.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XMethodElement.kt
@@ -61,7 +61,7 @@
                 parameters.dropLast(
                     if (isSuspendFunction()) 1 else 0
                 ).joinToString(", ") {
-                    it.type.typeName.toString()
+                    it.type.asTypeName().java.toString()
                 }
             )
             append(")")
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XRawType.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XRawType.kt
index 7d87fda..38f719c 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XRawType.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XRawType.kt
@@ -16,6 +16,7 @@
 
 package androidx.room.compiler.processing
 
+import androidx.room.compiler.codegen.XTypeName
 import com.squareup.javapoet.TypeName
 
 /**
@@ -32,11 +33,23 @@
  * Instances of XRawType implement equality.
  */
 interface XRawType {
+    // TODO(b/247248619): Deprecate when more progress is made, otherwise -werror fails the build.
+    // @Deprecated(
+    //     message = "Use asTypeName().toJavaPoet() to be clear the name is for JavaPoet.",
+    //     replaceWith = ReplaceWith(
+    //         expression = "asTypeName().toJavaPoet()",
+    //         imports = ["androidx.room.compiler.codegen.toJavaPoet"]
+    //     )
+    // )
     val typeName: TypeName
+
+    fun asTypeName(): XTypeName
+
     /**
      * Returns `true` if this raw type can be assigned from [other].
      */
     fun isAssignableFrom(other: XRawType): Boolean
+
     /**
      * Returns `true` if this raw type can be assigned from [other].
      */
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XType.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XType.kt
index 31f9522..cedb6fb6 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XType.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XType.kt
@@ -16,6 +16,7 @@
 
 package androidx.room.compiler.processing
 
+import androidx.room.compiler.codegen.XTypeName
 import com.squareup.javapoet.ClassName
 import com.squareup.javapoet.TypeName
 import kotlin.contracts.contract
@@ -31,9 +32,22 @@
     /**
      * The Javapoet [TypeName] representation of the type
      */
+    // TODO(b/247248619): Deprecate when more progress is made, otherwise -werror fails the build.
+    // @Deprecated(
+    //     message = "Use asTypeName().toJavaPoet() to be clear the name is for JavaPoet.",
+    //     replaceWith = ReplaceWith(
+    //         expression = "asTypeName().toJavaPoet()",
+    //         imports = ["androidx.room.compiler.codegen.toJavaPoet"]
+    //     )
+    // )
     val typeName: TypeName
 
     /**
+     * Gets the [XTypeName] representing the type.
+     */
+    fun asTypeName(): XTypeName
+
+    /**
      * Returns the rawType of this type. (e.g. `List<String>` to `List`.
      */
     val rawType: XRawType
@@ -159,6 +173,7 @@
 /**
  * Returns true if this is a [List] or [Set].
  */
+// TODO(b/248280754): Move to room-compiler, overloaded function name
 fun XType.isCollection(): Boolean {
     return isTypeOf(List::class) || isTypeOf(Set::class)
 }
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XTypeElement.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XTypeElement.kt
index aa9d882..80525af 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XTypeElement.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/XTypeElement.kt
@@ -16,6 +16,7 @@
 
 package androidx.room.compiler.processing
 
+import androidx.room.compiler.codegen.XClassName
 import com.squareup.javapoet.ClassName
 
 interface XTypeElement : XHasModifiers, XParameterizable, XElement, XMemberContainer {
@@ -64,9 +65,22 @@
     /**
      * Javapoet [ClassName] of the type.
      */
+    // TODO(b/247248619): Deprecate when more progress is made, otherwise -werror fails the build.
+    // @Deprecated(
+    //     message = "Use asClassName().toJavaPoet() to be clear the name is for JavaPoet.",
+    //     replaceWith = ReplaceWith(
+    //         expression = "asClassName().toJavaPoet()",
+    //         imports = ["androidx.room.compiler.codegen.toJavaPoet"]
+    //     )
+    // )
     override val className: ClassName
 
     /**
+     * Gets the [XClassName] of the type element.
+     */
+    override fun asClassName(): XClassName
+
+    /**
      * The [XTypeElement] that contains this [XTypeElement] if it is an inner class/interface.
      */
     val enclosingTypeElement: XTypeElement?
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacArrayType.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacArrayType.kt
index 66c25ae..b9c3ce7 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacArrayType.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacArrayType.kt
@@ -16,6 +16,8 @@
 
 package androidx.room.compiler.processing.javac
 
+import androidx.room.compiler.codegen.JArrayTypeName
+import androidx.room.compiler.codegen.XTypeName
 import androidx.room.compiler.processing.XArrayType
 import androidx.room.compiler.processing.XNullability
 import androidx.room.compiler.processing.XType
@@ -72,6 +74,16 @@
         arrayOf(typeMirror)
     }
 
+    private val xTypeName: XTypeName by lazy {
+        XTypeName(
+            java = JArrayTypeName.get(typeMirror),
+            kotlin = XTypeName.UNAVAILABLE_KTYPE_NAME,
+            nullability = knownComponentNullability ?: XNullability.UNKNOWN,
+        )
+    }
+
+    override fun asTypeName() = xTypeName
+
     override val typeArguments: List<XType>
         get() = emptyList()
 
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacRawType.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacRawType.kt
index 4d0baa5..73f52b4 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacRawType.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacRawType.kt
@@ -16,9 +16,9 @@
 
 package androidx.room.compiler.processing.javac
 
+import androidx.room.compiler.codegen.XTypeName
 import androidx.room.compiler.processing.XRawType
 import androidx.room.compiler.processing.safeTypeName
-import com.squareup.javapoet.TypeName
 
 internal class JavacRawType(
     env: JavacProcessingEnv,
@@ -27,21 +27,33 @@
     private val erased = env.typeUtils.erasure(original.typeMirror)
     private val typeUtils = env.delegate.typeUtils
 
-    override val typeName: TypeName = erased.safeTypeName()
+    override val typeName by lazy {
+        xTypeName.java
+    }
+
+    private val xTypeName: XTypeName by lazy {
+        XTypeName(
+            erased.safeTypeName(),
+            XTypeName.UNAVAILABLE_KTYPE_NAME,
+            original.nullability
+        )
+    }
+
+    override fun asTypeName() = xTypeName
 
     override fun isAssignableFrom(other: XRawType): Boolean {
         return other is JavacRawType && typeUtils.isAssignable(other.erased, erased)
     }
 
     override fun equals(other: Any?): Boolean {
-        return this === other || typeName == (other as? XRawType)?.typeName
+        return this === other || xTypeName == (other as? XRawType)?.asTypeName()
     }
 
     override fun hashCode(): Int {
-        return typeName.hashCode()
+        return xTypeName.hashCode()
     }
 
     override fun toString(): String {
-        return erased.toString()
+        return xTypeName.java.toString()
     }
 }
\ No newline at end of file
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacType.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacType.kt
index 3526dc96..69109d53 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacType.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacType.kt
@@ -16,16 +16,16 @@
 
 package androidx.room.compiler.processing.javac
 
+import androidx.room.compiler.codegen.XTypeName
 import androidx.room.compiler.processing.XEquality
 import androidx.room.compiler.processing.XNullability
 import androidx.room.compiler.processing.XRawType
 import androidx.room.compiler.processing.XType
 import androidx.room.compiler.processing.javac.kotlin.KmType
 import androidx.room.compiler.processing.javac.kotlin.KotlinMetadataElement
-import androidx.room.compiler.processing.ksp.ERROR_TYPE_NAME
+import androidx.room.compiler.processing.ksp.ERROR_JTYPE_NAME
 import androidx.room.compiler.processing.safeTypeName
 import com.google.auto.common.MoreTypes
-import java.lang.IllegalStateException
 import javax.lang.model.type.TypeKind
 import javax.lang.model.type.TypeMirror
 import kotlin.reflect.KClass
@@ -68,13 +68,23 @@
     override fun isError(): Boolean {
         return typeMirror.kind == TypeKind.ERROR ||
             // https://kotlinlang.org/docs/reference/kapt.html#non-existent-type-correction
-            (kotlinType != null && typeName == ERROR_TYPE_NAME)
+            (kotlinType != null && asTypeName().java == ERROR_JTYPE_NAME)
     }
 
     override val typeName by lazy {
-        typeMirror.safeTypeName()
+        xTypeName.java
     }
 
+    private val xTypeName: XTypeName by lazy {
+        XTypeName(
+            typeMirror.safeTypeName(),
+            XTypeName.UNAVAILABLE_KTYPE_NAME,
+            nullability
+        )
+    }
+
+    override fun asTypeName() = xTypeName
+
     override fun equals(other: Any?): Boolean {
         return XEquality.equals(this, other)
     }
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacTypeElement.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacTypeElement.kt
index 0eb5474..403d6fb 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacTypeElement.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/javac/JavacTypeElement.kt
@@ -16,12 +16,15 @@
 
 package androidx.room.compiler.processing.javac
 
+import androidx.room.compiler.codegen.XClassName
+import androidx.room.compiler.codegen.XTypeName
 import androidx.room.compiler.processing.XEnumEntry
 import androidx.room.compiler.processing.XEnumTypeElement
 import androidx.room.compiler.processing.XFieldElement
 import androidx.room.compiler.processing.XHasModifiers
-import androidx.room.compiler.processing.XMethodElement
 import androidx.room.compiler.processing.XMemberContainer
+import androidx.room.compiler.processing.XMethodElement
+import androidx.room.compiler.processing.XNullability
 import androidx.room.compiler.processing.XType
 import androidx.room.compiler.processing.XTypeElement
 import androidx.room.compiler.processing.XTypeParameterElement
@@ -34,6 +37,7 @@
 import com.google.auto.common.MoreTypes
 import com.squareup.javapoet.ClassName
 import com.squareup.javapoet.TypeName
+import com.squareup.kotlinpoet.javapoet.JClassName
 import javax.lang.model.element.ElementKind
 import javax.lang.model.element.TypeElement
 import javax.lang.model.type.TypeKind
@@ -60,9 +64,18 @@
     }
 
     override val className: ClassName by lazy {
-        ClassName.get(element)
+        xClassName.java
     }
 
+    private val xClassName: XClassName by lazy {
+        XClassName(
+            JClassName.get(element),
+            XTypeName.UNAVAILABLE_KTYPE_NAME,
+            XNullability.NONNULL
+        )
+    }
+    override fun asClassName() = xClassName
+
     override val enclosingElement: XMemberContainer? by lazy {
         enclosingTypeElement
     }
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/DefaultKspType.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/DefaultKspType.kt
index ac380bf..c6f3ec1 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/DefaultKspType.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/DefaultKspType.kt
@@ -19,17 +19,23 @@
 import androidx.room.compiler.processing.XNullability
 import androidx.room.compiler.processing.tryBox
 import com.google.devtools.ksp.symbol.KSType
-import com.squareup.javapoet.TypeName
+import com.squareup.kotlinpoet.javapoet.JTypeName
+import com.squareup.kotlinpoet.javapoet.KTypeName
 
 internal class DefaultKspType(
     env: KspProcessingEnv,
     ksType: KSType,
     jvmTypeResolver: KspJvmTypeResolver?
 ) : KspType(env, ksType, jvmTypeResolver) {
-    override fun resolveTypeName(): TypeName {
+
+    override fun resolveJTypeName(): JTypeName {
         // always box these. For primitives, typeName might return the primitive type but if we
         // wanted it to be a primitive, we would've resolved it to [KspPrimitiveType].
-        return ksType.typeName(env.resolver).tryBox()
+        return ksType.asJTypeName(env.resolver).tryBox()
+    }
+
+    override fun resolveKTypeName(): KTypeName {
+        return ksType.asKTypeName(env.resolver)
     }
 
     override fun boxed(): DefaultKspType {
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KSTypeExt.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KSTypeExt.kt
index b773e09..aa157d0 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KSTypeExt.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KSTypeExt.kt
@@ -17,222 +17,14 @@
 package androidx.room.compiler.processing.ksp
 
 import androidx.room.compiler.processing.XNullability
-import androidx.room.compiler.processing.javac.kotlin.typeNameFromJvmSignature
-import androidx.room.compiler.processing.tryBox
-import androidx.room.compiler.processing.util.ISSUE_TRACKER_LINK
-import com.google.devtools.ksp.KspExperimental
-import com.google.devtools.ksp.processing.Resolver
 import com.google.devtools.ksp.symbol.KSAnnotated
 import com.google.devtools.ksp.symbol.KSDeclaration
-import com.google.devtools.ksp.symbol.KSName
 import com.google.devtools.ksp.symbol.KSNode
 import com.google.devtools.ksp.symbol.KSType
-import com.google.devtools.ksp.symbol.KSTypeAlias
 import com.google.devtools.ksp.symbol.KSTypeArgument
 import com.google.devtools.ksp.symbol.KSTypeParameter
 import com.google.devtools.ksp.symbol.KSTypeReference
 import com.google.devtools.ksp.symbol.Modifier
-import com.google.devtools.ksp.symbol.Variance
-import com.squareup.javapoet.ArrayTypeName
-import com.squareup.javapoet.ClassName
-import com.squareup.javapoet.ParameterizedTypeName
-import com.squareup.javapoet.TypeName
-import com.squareup.javapoet.TypeVariableName
-import com.squareup.javapoet.WildcardTypeName
-import kotlin.coroutines.Continuation
-
-// Catch-all type name when we cannot resolve to anything. This is what KAPT uses as error type
-// and we use the same type in KSP for consistency.
-// https://kotlinlang.org/docs/reference/kapt.html#non-existent-type-correction
-internal val ERROR_TYPE_NAME = ClassName.get("error", "NonExistentClass")
-
-/**
- * To handle self referencing types and avoid infinite recursion, we keep a lookup map for
- * TypeVariables.
- */
-private typealias TypeArgumentTypeLookup = LinkedHashMap<KSName, TypeName>
-
-/**
- * Turns a KSTypeReference into a TypeName in java's type system.
- */
-internal fun KSTypeReference?.typeName(resolver: Resolver): TypeName =
-    typeName(
-        resolver = resolver,
-        typeArgumentTypeLookup = TypeArgumentTypeLookup()
-    )
-
-private fun KSTypeReference?.typeName(
-    resolver: Resolver,
-    typeArgumentTypeLookup: TypeArgumentTypeLookup
-): TypeName {
-    return if (this == null) {
-        ERROR_TYPE_NAME
-    } else {
-        resolve().typeName(resolver, typeArgumentTypeLookup)
-    }
-}
-
-/**
- * Turns a KSDeclaration into a TypeName in java's type system.
- */
-internal fun KSDeclaration.typeName(resolver: Resolver): TypeName =
-    typeName(
-        resolver = resolver,
-        typeArgumentTypeLookup = TypeArgumentTypeLookup()
-    )
-
-@OptIn(KspExperimental::class)
-private fun KSDeclaration.typeName(
-    resolver: Resolver,
-    typeArgumentTypeLookup: TypeArgumentTypeLookup
-): TypeName {
-    if (this is KSTypeAlias) {
-        return this.type.typeName(resolver, typeArgumentTypeLookup)
-    }
-    if (this is KSTypeParameter) {
-        return this.typeName(resolver, typeArgumentTypeLookup)
-    }
-    // if there is no qualified name, it is a resolution error so just return shared instance
-    // KSP may improve that later and if not, we can improve it in Room
-    // TODO: https://issuetracker.google.com/issues/168639183
-    val qualified = qualifiedName?.asString() ?: return ERROR_TYPE_NAME
-    val jvmSignature = resolver.mapToJvmSignature(this)
-    if (jvmSignature != null && jvmSignature.isNotBlank()) {
-        return jvmSignature.typeNameFromJvmSignature()
-    }
-
-    // fallback to custom generation, it is very likely that this is an unresolved type
-    // get the package name first, it might throw for invalid types, hence we use
-    // safeGetPackageName
-    val pkg = getNormalizedPackageName()
-    // using qualified name and pkg, figure out the short names.
-    val shortNames = if (pkg == "") {
-        qualified
-    } else {
-        qualified.substring(pkg.length + 1)
-    }.split('.')
-    return ClassName.get(pkg, shortNames.first(), *(shortNames.drop(1).toTypedArray()))
-}
-
-/**
- * Turns a KSTypeArgument into a TypeName in java's type system.
- */
-internal fun KSTypeArgument.typeName(
-    resolver: Resolver
-): TypeName = typeName(
-    resolver = resolver,
-    typeArgumentTypeLookup = TypeArgumentTypeLookup()
-)
-
-private fun KSTypeParameter.typeName(
-    resolver: Resolver,
-    typeArgumentTypeLookup: TypeArgumentTypeLookup
-): TypeName {
-    // see https://github.com/square/javapoet/issues/842
-    typeArgumentTypeLookup[name]?.let {
-        return it
-    }
-    val mutableBounds = mutableListOf<TypeName>()
-    val typeName = createModifiableTypeVariableName(name = name.asString(), bounds = mutableBounds)
-    typeArgumentTypeLookup[name] = typeName
-    val resolvedBounds = bounds.map {
-        it.typeName(resolver, typeArgumentTypeLookup).tryBox()
-    }.toList()
-    if (resolvedBounds.isNotEmpty()) {
-        mutableBounds.addAll(resolvedBounds)
-        mutableBounds.remove(TypeName.OBJECT)
-    }
-    typeArgumentTypeLookup.remove(name)
-    return typeName
-}
-
-private fun KSTypeArgument.typeName(
-    resolver: Resolver,
-    typeArgumentTypeLookup: TypeArgumentTypeLookup
-): TypeName {
-    fun resolveTypeName() = type.typeName(resolver, typeArgumentTypeLookup).tryBox()
-    return when (variance) {
-        Variance.CONTRAVARIANT -> WildcardTypeName.supertypeOf(resolveTypeName())
-        Variance.COVARIANT -> WildcardTypeName.subtypeOf(resolveTypeName())
-        Variance.STAR -> {
-            WildcardTypeName.subtypeOf(TypeName.OBJECT)
-        }
-        else -> {
-            if (hasJvmWildcardAnnotation()) {
-                WildcardTypeName.subtypeOf(resolveTypeName())
-            } else {
-                resolveTypeName()
-            }
-        }
-    }
-}
-
-/**
- * Turns a KSType into a TypeName in java's type system.
- */
-internal fun KSType.typeName(resolver: Resolver): TypeName =
-    typeName(
-        resolver = resolver,
-        typeArgumentTypeLookup = TypeArgumentTypeLookup()
-    )
-
-private fun KSType.typeName(
-    resolver: Resolver,
-    typeArgumentTypeLookup: TypeArgumentTypeLookup
-): TypeName {
-    return if (this.arguments.isNotEmpty() && !isRaw()) {
-        val args: Array<TypeName> = this.arguments
-            .map { typeArg ->
-                typeArg.typeName(
-                    resolver = resolver,
-                    typeArgumentTypeLookup = typeArgumentTypeLookup
-                )
-            }
-            .map { it.tryBox() }
-            .let { args ->
-                if (this.isSuspendFunctionType) args.convertToSuspendSignature()
-                else args
-            }
-            .toTypedArray()
-
-        when (
-            val typeName = declaration
-                .typeName(resolver, typeArgumentTypeLookup).tryBox()
-        ) {
-            is ArrayTypeName -> ArrayTypeName.of(args.single())
-            is ClassName -> ParameterizedTypeName.get(
-                typeName,
-                *args
-            )
-            else -> error("Unexpected type name for KSType: $typeName")
-        }
-    } else {
-        this.declaration.typeName(resolver, typeArgumentTypeLookup)
-    }
-}
-
-/**
- * Transforms [this] list of arguments to a suspend signature. For a [suspend] functional type, we
- * need to transform it to be a FunctionX with a [Continuation] with the correct return type. A
- * transformed SuspendFunction looks like this:
- *
- * FunctionX<[? super $params], ? super Continuation<? super $ReturnType>, ?>
- */
-private fun List<TypeName>.convertToSuspendSignature(): List<TypeName> {
-    val args = this
-
-    // The last arg is the return type, so take everything except the last arg
-    val actualArgs = args.subList(0, args.size - 1)
-    val continuationReturnType = WildcardTypeName.supertypeOf(args.last())
-    val continuationType = ParameterizedTypeName.get(
-        ClassName.get(Continuation::class.java),
-        continuationReturnType
-    )
-    return actualArgs + listOf(
-        WildcardTypeName.supertypeOf(continuationType),
-        WildcardTypeName.subtypeOf(TypeName.OBJECT)
-    )
-}
 
 /**
  * Root package comes as <root> instead of "" so we work around it here.
@@ -265,70 +57,26 @@
     else -> throw IllegalArgumentException("Cannot set KSType nullability to platform")
 }
 
-/**
- * The private constructor of [TypeVariableName] which receives a list.
- * We use this in [createModifiableTypeVariableName] to create a [TypeVariableName] whose bounds
- * can be modified afterwards.
- */
-private val typeVarNameConstructor by lazy {
-    try {
-        TypeVariableName::class.java.getDeclaredConstructor(
-            String::class.java,
-            List::class.java
-        ).also {
-            it.trySetAccessible()
-        }
-    } catch (ex: NoSuchMethodException) {
-        throw IllegalStateException(
-            """
-            Room couldn't find the constructor it is looking for in JavaPoet.
-            Please file a bug at $ISSUE_TRACKER_LINK.
-            """.trimIndent(),
-            ex
-        )
-    }
-}
-
-/**
- * Creates a TypeVariableName where we can change the bounds after constructor.
- * This is used to workaround a case for self referencing type declarations.
- * see b/187572913 for more details
- */
-private fun createModifiableTypeVariableName(
-    name: String,
-    bounds: List<TypeName>
-): TypeVariableName = typeVarNameConstructor.newInstance(
-    name,
-    bounds
-) as TypeVariableName
-
 private fun KSAnnotated.hasAnnotation(
-    qName: String
-) = annotations.any {
-    it.annotationType.resolve().declaration.qualifiedName?.asString() == qName
-}
+     qName: String
+ ) = annotations.any {
+     it.annotationType.resolve().declaration.qualifiedName?.asString() == qName
+ }
 
-internal fun KSAnnotated.hasJvmWildcardAnnotation() = hasAnnotation(
-    JvmWildcard::class.java.canonicalName
-)
+ internal fun KSAnnotated.hasJvmWildcardAnnotation() = hasAnnotation(
+     JvmWildcard::class.java.canonicalName!!
+ )
 
-internal fun KSAnnotated.hasSuppressJvmWildcardAnnotation() = hasAnnotation(
-    JvmSuppressWildcards::class.java.canonicalName
-)
+ internal fun KSAnnotated.hasSuppressJvmWildcardAnnotation() = hasAnnotation(
+     JvmSuppressWildcards::class.java.canonicalName!!
+ )
 
-internal fun KSNode.hasSuppressWildcardsAnnotationInHierarchy(): Boolean {
-    (this as? KSAnnotated)?.let {
-        if (hasSuppressJvmWildcardAnnotation()) {
-            return true
-        }
-    }
-    val parent = parent ?: return false
-    return parent.hasSuppressWildcardsAnnotationInHierarchy()
-}
-
-internal fun KSType.isRaw(): Boolean {
-    // yes this is gross but KSP itself seems to be doing it as well
-    // https://github.com/google/ksp/blob/main/compiler-plugin/
-    // src/main/kotlin/com/google/devtools/ksp/symbol/impl/kotlin/KSTypeImpl.kt#L85
-    return toString().startsWith("raw ")
-}
\ No newline at end of file
+ internal fun KSNode.hasSuppressWildcardsAnnotationInHierarchy(): Boolean {
+     (this as? KSAnnotated)?.let {
+         if (hasSuppressJvmWildcardAnnotation()) {
+             return true
+         }
+     }
+     val parent = parent ?: return false
+     return parent.hasSuppressWildcardsAnnotationInHierarchy()
+ }
\ No newline at end of file
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KSTypeJavaPoetExt.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KSTypeJavaPoetExt.kt
new file mode 100644
index 0000000..6150713
--- /dev/null
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KSTypeJavaPoetExt.kt
@@ -0,0 +1,269 @@
+/*
+ * Copyright 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 androidx.room.compiler.processing.ksp
+
+import androidx.room.compiler.codegen.JArrayTypeName
+import androidx.room.compiler.processing.javac.kotlin.typeNameFromJvmSignature
+import androidx.room.compiler.processing.tryBox
+import androidx.room.compiler.processing.util.ISSUE_TRACKER_LINK
+import com.google.devtools.ksp.KspExperimental
+import com.google.devtools.ksp.processing.Resolver
+import com.google.devtools.ksp.symbol.KSDeclaration
+import com.google.devtools.ksp.symbol.KSName
+import com.google.devtools.ksp.symbol.KSType
+import com.google.devtools.ksp.symbol.KSTypeAlias
+import com.google.devtools.ksp.symbol.KSTypeArgument
+import com.google.devtools.ksp.symbol.KSTypeParameter
+import com.google.devtools.ksp.symbol.KSTypeReference
+import com.google.devtools.ksp.symbol.Variance
+import com.squareup.kotlinpoet.javapoet.JClassName
+import com.squareup.kotlinpoet.javapoet.JParameterizedTypeName
+import com.squareup.kotlinpoet.javapoet.JTypeName
+import com.squareup.kotlinpoet.javapoet.JTypeVariableName
+import com.squareup.kotlinpoet.javapoet.JWildcardTypeName
+import kotlin.coroutines.Continuation
+
+// Catch-all type name when we cannot resolve to anything. This is what KAPT uses as error type
+// and we use the same type in KSP for consistency.
+// https://kotlinlang.org/docs/reference/kapt.html#non-existent-type-correction
+internal val ERROR_JTYPE_NAME = JClassName.get("error", "NonExistentClass")
+
+/**
+ * To handle self referencing types and avoid infinite recursion, we keep a lookup map for
+ * TypeVariables.
+ */
+private typealias JTypeArgumentTypeLookup = LinkedHashMap<KSName, JTypeName>
+
+/**
+ * Turns a KSTypeReference into a TypeName in java's type system.
+ */
+internal fun KSTypeReference?.asJTypeName(resolver: Resolver): JTypeName =
+    asJTypeName(
+        resolver = resolver,
+        typeArgumentTypeLookup = JTypeArgumentTypeLookup()
+    )
+
+private fun KSTypeReference?.asJTypeName(
+    resolver: Resolver,
+    typeArgumentTypeLookup: JTypeArgumentTypeLookup
+): JTypeName {
+    return if (this == null) {
+        ERROR_JTYPE_NAME
+    } else {
+        resolve().asJTypeName(resolver, typeArgumentTypeLookup)
+    }
+}
+
+/**
+ * Turns a KSDeclaration into a TypeName in java's type system.
+ */
+internal fun KSDeclaration.asJTypeName(resolver: Resolver): JTypeName =
+    asJTypeName(
+        resolver = resolver,
+        typeArgumentTypeLookup = JTypeArgumentTypeLookup()
+    )
+
+@OptIn(KspExperimental::class)
+private fun KSDeclaration.asJTypeName(
+    resolver: Resolver,
+    typeArgumentTypeLookup: JTypeArgumentTypeLookup
+): JTypeName {
+    if (this is KSTypeAlias) {
+        return this.type.asJTypeName(resolver, typeArgumentTypeLookup)
+    }
+    if (this is KSTypeParameter) {
+        return this.asJTypeName(resolver, typeArgumentTypeLookup)
+    }
+    // if there is no qualified name, it is a resolution error so just return shared instance
+    // KSP may improve that later and if not, we can improve it in Room
+    // TODO: https://issuetracker.google.com/issues/168639183
+    val qualified = qualifiedName?.asString() ?: return ERROR_JTYPE_NAME
+    val jvmSignature = resolver.mapToJvmSignature(this)
+    if (jvmSignature != null && jvmSignature.isNotBlank()) {
+        return jvmSignature.typeNameFromJvmSignature()
+    }
+
+    // fallback to custom generation, it is very likely that this is an unresolved type
+    // get the package name first, it might throw for invalid types, hence we use
+    // safeGetPackageName
+    val pkg = getNormalizedPackageName()
+    // using qualified name and pkg, figure out the short names.
+    val shortNames = if (pkg == "") {
+        qualified
+    } else {
+        qualified.substring(pkg.length + 1)
+    }.split('.')
+    return JClassName.get(pkg, shortNames.first(), *(shortNames.drop(1).toTypedArray()))
+}
+
+/**
+ * Turns a KSTypeArgument into a TypeName in java's type system.
+ */
+internal fun KSTypeArgument.asJTypeName(
+    resolver: Resolver
+): JTypeName = asJTypeName(
+    resolver = resolver,
+    typeArgumentTypeLookup = JTypeArgumentTypeLookup()
+)
+
+private fun KSTypeParameter.asJTypeName(
+    resolver: Resolver,
+    typeArgumentTypeLookup: JTypeArgumentTypeLookup
+): JTypeName {
+    // see https://github.com/square/javapoet/issues/842
+    typeArgumentTypeLookup[name]?.let {
+        return it
+    }
+    val mutableBounds = mutableListOf<JTypeName>()
+    val typeName = createModifiableTypeVariableName(name = name.asString(), bounds = mutableBounds)
+    typeArgumentTypeLookup[name] = typeName
+    val resolvedBounds = bounds.map {
+        it.asJTypeName(resolver, typeArgumentTypeLookup).tryBox()
+    }.toList()
+    if (resolvedBounds.isNotEmpty()) {
+        mutableBounds.addAll(resolvedBounds)
+        mutableBounds.remove(JTypeName.OBJECT)
+    }
+    typeArgumentTypeLookup.remove(name)
+    return typeName
+}
+
+private fun KSTypeArgument.asJTypeName(
+    resolver: Resolver,
+    typeArgumentTypeLookup: JTypeArgumentTypeLookup
+): JTypeName {
+    fun resolveTypeName() = type.asJTypeName(resolver, typeArgumentTypeLookup).tryBox()
+    return when (variance) {
+        Variance.CONTRAVARIANT -> JWildcardTypeName.supertypeOf(resolveTypeName())
+        Variance.COVARIANT -> JWildcardTypeName.subtypeOf(resolveTypeName())
+        Variance.STAR -> {
+            JWildcardTypeName.subtypeOf(JTypeName.OBJECT)
+        }
+        else -> {
+            if (hasJvmWildcardAnnotation()) {
+                JWildcardTypeName.subtypeOf(resolveTypeName())
+            } else {
+                resolveTypeName()
+            }
+        }
+    }
+}
+
+/**
+ * Turns a KSType into a TypeName in java's type system.
+ */
+internal fun KSType.asJTypeName(resolver: Resolver): JTypeName =
+    asJTypeName(
+        resolver = resolver,
+        typeArgumentTypeLookup = JTypeArgumentTypeLookup()
+    )
+
+@OptIn(KspExperimental::class)
+private fun KSType.asJTypeName(
+    resolver: Resolver,
+    typeArgumentTypeLookup: JTypeArgumentTypeLookup
+): JTypeName {
+    return if (this.arguments.isNotEmpty() && !resolver.isJavaRawType(this)) {
+        val args: Array<JTypeName> = this.arguments
+            .map { typeArg ->
+                typeArg.asJTypeName(
+                    resolver = resolver,
+                    typeArgumentTypeLookup = typeArgumentTypeLookup
+                )
+            }
+            .map { it.tryBox() }
+            .let { args ->
+                if (this.isSuspendFunctionType) args.convertToSuspendSignature()
+                else args
+            }
+            .toTypedArray()
+
+        when (
+            val typeName = declaration
+                .asJTypeName(resolver, typeArgumentTypeLookup).tryBox()
+        ) {
+            is JArrayTypeName -> JArrayTypeName.of(args.single())
+            is JClassName -> JParameterizedTypeName.get(
+                typeName,
+                *args
+            )
+            else -> error("Unexpected type name for KSType: $typeName")
+        }
+    } else {
+        this.declaration.asJTypeName(resolver, typeArgumentTypeLookup)
+    }
+}
+
+/**
+ * Transforms [this] list of arguments to a suspend signature. For a [suspend] functional type, we
+ * need to transform it to be a FunctionX with a [Continuation] with the correct return type. A
+ * transformed SuspendFunction looks like this:
+ *
+ * FunctionX<[? super $params], ? super Continuation<? super $ReturnType>, ?>
+ */
+private fun List<JTypeName>.convertToSuspendSignature(): List<JTypeName> {
+    val args = this
+
+    // The last arg is the return type, so take everything except the last arg
+    val actualArgs = args.subList(0, args.size - 1)
+    val continuationReturnType = JWildcardTypeName.supertypeOf(args.last())
+    val continuationType = JParameterizedTypeName.get(
+        JClassName.get(Continuation::class.java),
+        continuationReturnType
+    )
+    return actualArgs + listOf(
+        JWildcardTypeName.supertypeOf(continuationType),
+        JWildcardTypeName.subtypeOf(JTypeName.OBJECT)
+    )
+}
+
+/**
+ * The private constructor of [JTypeVariableName] which receives a list.
+ * We use this in [createModifiableTypeVariableName] to create a [JTypeVariableName] whose bounds
+ * can be modified afterwards.
+ */
+private val typeVarNameConstructor by lazy {
+    try {
+        JTypeVariableName::class.java.getDeclaredConstructor(
+            String::class.java,
+            List::class.java
+        ).also {
+            it.trySetAccessible()
+        }
+    } catch (ex: NoSuchMethodException) {
+        throw IllegalStateException(
+            """
+            Room couldn't find the constructor it is looking for in JavaPoet.
+            Please file a bug at $ISSUE_TRACKER_LINK.
+            """.trimIndent(),
+            ex
+        )
+    }
+}
+
+/**
+ * Creates a TypeVariableName where we can change the bounds after constructor.
+ * This is used to workaround a case for self referencing type declarations.
+ * see b/187572913 for more details
+ */
+private fun createModifiableTypeVariableName(
+    name: String,
+    bounds: List<JTypeName>
+): JTypeVariableName = typeVarNameConstructor.newInstance(
+    name,
+    bounds
+) as JTypeVariableName
\ No newline at end of file
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KSTypeKotlinPoetExt.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KSTypeKotlinPoetExt.kt
new file mode 100644
index 0000000..a862b1b
--- /dev/null
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KSTypeKotlinPoetExt.kt
@@ -0,0 +1,164 @@
+/*
+ * Copyright 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 androidx.room.compiler.processing.ksp
+
+import com.google.devtools.ksp.KspExperimental
+import com.google.devtools.ksp.processing.Resolver
+import com.google.devtools.ksp.symbol.KSDeclaration
+import com.google.devtools.ksp.symbol.KSName
+import com.google.devtools.ksp.symbol.KSType
+import com.google.devtools.ksp.symbol.KSTypeAlias
+import com.google.devtools.ksp.symbol.KSTypeArgument
+import com.google.devtools.ksp.symbol.KSTypeParameter
+import com.google.devtools.ksp.symbol.KSTypeReference
+import com.google.devtools.ksp.symbol.Variance
+import com.squareup.kotlinpoet.ANY
+import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy
+import com.squareup.kotlinpoet.javapoet.KClassName
+import com.squareup.kotlinpoet.javapoet.KTypeName
+import com.squareup.kotlinpoet.javapoet.KTypeVariableName
+import com.squareup.kotlinpoet.javapoet.KWildcardTypeName
+
+internal val ERROR_KTYPE_NAME = KClassName("error", "NonExistentClass")
+
+private typealias KTypeArgumentTypeLookup = LinkedHashMap<KSName, KTypeName>
+
+internal fun KSTypeReference?.asKTypeName(resolver: Resolver): KTypeName =
+    asKTypeName(
+        resolver = resolver,
+        typeArgumentTypeLookup = KTypeArgumentTypeLookup()
+    )
+
+private fun KSTypeReference?.asKTypeName(
+    resolver: Resolver,
+    typeArgumentTypeLookup: KTypeArgumentTypeLookup
+): KTypeName {
+    return if (this == null) {
+        ERROR_KTYPE_NAME
+    } else {
+        resolve().asKTypeName(resolver, typeArgumentTypeLookup)
+    }
+}
+
+internal fun KSDeclaration.asKTypeName(resolver: Resolver): KTypeName =
+    asKTypeName(
+        resolver = resolver,
+        typeArgumentTypeLookup = KTypeArgumentTypeLookup()
+    )
+
+private fun KSDeclaration.asKTypeName(
+    resolver: Resolver,
+    typeArgumentTypeLookup: KTypeArgumentTypeLookup
+): KTypeName {
+    if (this is KSTypeAlias) {
+        return this.type.asKTypeName(resolver, typeArgumentTypeLookup)
+    }
+    if (this is KSTypeParameter) {
+        return this.asKTypeName(resolver, typeArgumentTypeLookup)
+    }
+    val qualified = qualifiedName?.asString() ?: return ERROR_KTYPE_NAME
+    val pkg = getNormalizedPackageName()
+    val shortNames = if (pkg == "") {
+        qualified
+    } else {
+        qualified.substring(pkg.length + 1)
+    }.split('.')
+    return KClassName(pkg, shortNames.first(), *(shortNames.drop(1).toTypedArray()))
+}
+
+private fun KSTypeParameter.asKTypeName(
+    resolver: Resolver,
+    typeArgumentTypeLookup: KTypeArgumentTypeLookup
+): KTypeName {
+    typeArgumentTypeLookup[name]?.let {
+        return it
+    }
+    val mutableBounds = mutableListOf(ANY.copy(nullable = true))
+    val typeName = createModifiableTypeVariableName(name = name.asString(), bounds = mutableBounds)
+    typeArgumentTypeLookup[name] = typeName
+    val resolvedBounds = bounds.map {
+        it.asKTypeName(resolver, typeArgumentTypeLookup)
+    }.toList()
+    if (resolvedBounds.isNotEmpty()) {
+        mutableBounds.addAll(resolvedBounds)
+        mutableBounds.remove(ANY.copy(nullable = true))
+    }
+    typeArgumentTypeLookup.remove(name)
+    return typeName
+}
+
+internal fun KSTypeArgument.asKTypeName(
+    resolver: Resolver
+): KTypeName = asKTypeName(
+    resolver = resolver,
+    typeArgumentTypeLookup = KTypeArgumentTypeLookup()
+)
+
+private fun KSTypeArgument.asKTypeName(
+    resolver: Resolver,
+    typeArgumentTypeLookup: KTypeArgumentTypeLookup
+): KTypeName {
+    fun resolveTypeName() = type.asKTypeName(resolver, typeArgumentTypeLookup)
+    return when (variance) {
+        Variance.CONTRAVARIANT -> KWildcardTypeName.consumerOf(resolveTypeName())
+        Variance.COVARIANT -> KWildcardTypeName.producerOf(resolveTypeName())
+        Variance.STAR -> com.squareup.kotlinpoet.STAR
+        else -> {
+            if (hasJvmWildcardAnnotation()) {
+                KWildcardTypeName.consumerOf(resolveTypeName())
+            } else {
+                resolveTypeName()
+            }
+        }
+    }
+}
+
+internal fun KSType.asKTypeName(resolver: Resolver): KTypeName =
+    asKTypeName(
+        resolver = resolver,
+        typeArgumentTypeLookup = KTypeArgumentTypeLookup()
+    )
+
+@OptIn(KspExperimental::class)
+private fun KSType.asKTypeName(
+    resolver: Resolver,
+    typeArgumentTypeLookup: KTypeArgumentTypeLookup
+): KTypeName {
+    return if (this.arguments.isNotEmpty() && !resolver.isJavaRawType(this)) {
+        val args: List<KTypeName> = this.arguments
+            .map { typeArg ->
+                typeArg.asKTypeName(
+                    resolver = resolver,
+                    typeArgumentTypeLookup = typeArgumentTypeLookup
+                )
+            }
+        val typeName = declaration.asKTypeName(resolver, typeArgumentTypeLookup)
+        check(typeName is KClassName) { "Unexpected type name for KSType: $typeName" }
+        typeName.parameterizedBy(args)
+    } else {
+        this.declaration.asKTypeName(resolver, typeArgumentTypeLookup)
+    }.copy(nullable = isMarkedNullable)
+}
+
+/**
+ * Creates a TypeVariableName where we can change the bounds after constructor.
+ * This is used to workaround a case for self referencing type declarations.
+ */
+private fun createModifiableTypeVariableName(
+    name: String,
+    bounds: List<KTypeName>
+): KTypeVariableName = KTypeVariableNameFactory.newInstance(name, bounds)
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KTypeVariableNameFactory.java b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KTypeVariableNameFactory.java
new file mode 100644
index 0000000..79489d3
--- /dev/null
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KTypeVariableNameFactory.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 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 androidx.room.compiler.processing.ksp;
+
+import com.squareup.kotlinpoet.TypeName;
+import com.squareup.kotlinpoet.TypeVariableName;
+
+import java.util.List;
+
+final class KTypeVariableNameFactory {
+    private KTypeVariableNameFactory() {
+    }
+
+    /**
+     * Calls the internal companion object of KTypeVariableName which receives a list.
+     * We use this in {@link KSTypeJavaPoetExtKt#createModifiableTypeVariableName(String, List)}
+     * to create a {@link com.squareup.kotlinpoet.TypeVariableName} whose bounds can be modified
+     * afterwards.
+     */
+    @SuppressWarnings("KotlinInternalInJava")
+    static TypeVariableName newInstance(String name, List<TypeName> bounds) {
+        return TypeVariableName.Companion.of$kotlinpoet(name, bounds, null);
+    }
+}
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspArrayType.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspArrayType.kt
index 2da4cad..7dc6993 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspArrayType.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspArrayType.kt
@@ -16,13 +16,17 @@
 
 package androidx.room.compiler.processing.ksp
 
+import androidx.room.compiler.codegen.JArrayTypeName
+import androidx.room.compiler.codegen.XTypeName
 import androidx.room.compiler.processing.XArrayType
 import androidx.room.compiler.processing.XNullability
 import androidx.room.compiler.processing.XType
 import com.google.devtools.ksp.symbol.KSType
 import com.google.devtools.ksp.symbol.Variance
-import com.squareup.javapoet.ArrayTypeName
-import com.squareup.javapoet.TypeName
+import com.squareup.kotlinpoet.ARRAY
+import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy
+import com.squareup.kotlinpoet.javapoet.JTypeName
+import com.squareup.kotlinpoet.javapoet.KTypeName
 
 internal sealed class KspArrayType(
     env: KspProcessingEnv,
@@ -35,8 +39,12 @@
 
     abstract override val componentType: KspType
 
-    override fun resolveTypeName(): TypeName {
-        return ArrayTypeName.of(componentType.typeName)
+    override fun resolveJTypeName(): JTypeName {
+        return this.asTypeName().java
+    }
+
+    override fun resolveKTypeName(): KTypeName {
+        return this.asTypeName().kotlin
     }
 
     override fun boxed() = this
@@ -54,6 +62,17 @@
     ) : KspArrayType(
         env, ksType, jvmTypeResolver
     ) {
+        private val xTypeName: XTypeName by lazy {
+            val componentTypeName = componentType.asTypeName()
+            XTypeName(
+                java = JArrayTypeName.of(componentTypeName.java.box()),
+                kotlin = ARRAY.parameterizedBy(componentTypeName.kotlin),
+                nullability = nullability,
+            )
+        }
+
+        override fun asTypeName() = xTypeName
+
         override val componentType: KspType by lazy {
             val arg = ksType.arguments.single()
             // https://kotlinlang.org/docs/reference/basic-types.html#primitive-type-arrays
@@ -92,6 +111,17 @@
     ) : KspArrayType(
         env, ksType, jvmTypeResolver
     ) {
+        private val xTypeName: XTypeName by lazy {
+            val componentTypeName = componentType.asTypeName()
+            XTypeName(
+                java = JArrayTypeName.of(componentTypeName.java.unbox()),
+                kotlin = ksType.asKTypeName(env.resolver),
+                nullability = nullability,
+            )
+        }
+
+        override fun asTypeName() = xTypeName
+
         override fun copyWithNullability(nullability: XNullability): PrimitiveArray {
             return PrimitiveArray(
                 env = env,
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspFileMemberContainer.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspFileMemberContainer.kt
index 36e6f0a..ab94b8c 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspFileMemberContainer.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspFileMemberContainer.kt
@@ -16,14 +16,17 @@
 
 package androidx.room.compiler.processing.ksp
 
+import androidx.room.compiler.codegen.XClassName
 import androidx.room.compiler.processing.XAnnotated
 import androidx.room.compiler.processing.XElement
 import androidx.room.compiler.processing.XMemberContainer
+import androidx.room.compiler.processing.XNullability
 import com.google.devtools.ksp.symbol.AnnotationUseSiteTarget
 import com.google.devtools.ksp.symbol.KSDeclaration
 import com.google.devtools.ksp.symbol.KSFile
 import com.google.devtools.ksp.validate
 import com.squareup.javapoet.ClassName
+import com.squareup.kotlinpoet.javapoet.toKClassName
 
 /**
  * [XMemberContainer] implementation for KSFiles.
@@ -42,7 +45,10 @@
     override val declaration: KSDeclaration?
         get() = null
     override val className: ClassName by lazy {
+        xClassName.java
+    }
 
+    private val xClassName: XClassName by lazy {
         val pkgName = ksFile.packageName.asString().let {
             if (it == "<root>") {
                 ""
@@ -50,11 +56,15 @@
                 it
             }
         }
-        ClassName.get(
+        val java = ClassName.get(
             pkgName, ksFile.findClassName()
         )
+        val kotlin = java.toKClassName()
+        XClassName(java, kotlin, XNullability.NONNULL)
     }
 
+    override fun asClassName() = xClassName
+
     override fun kindName(): String {
         return "file"
     }
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspJvmTypeResolver.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspJvmTypeResolver.kt
index eda347f..ba92d38 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspJvmTypeResolver.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspJvmTypeResolver.kt
@@ -61,7 +61,7 @@
         ).let {
             env.wrap(
                 ksType = it,
-                allowPrimitives = delegate.typeName.isPrimitive
+                allowPrimitives = delegate is KspPrimitiveType
             )
         }
     }
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspMethodType.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspMethodType.kt
index bd3bab4..ec72704 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspMethodType.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspMethodType.kt
@@ -29,7 +29,7 @@
     override val typeVariableNames: List<TypeVariableName> by lazy {
         origin.declaration.typeParameters.map {
             val typeParameterBounds = it.bounds.map {
-                it.typeName(env.resolver)
+                it.asJTypeName(env.resolver)
             }.toList().toTypedArray()
             TypeVariableName.get(
                 it.name.asString(),
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspPrimitiveType.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspPrimitiveType.kt
index ac8c34e..771dba1 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspPrimitiveType.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspPrimitiveType.kt
@@ -19,7 +19,8 @@
 import androidx.room.compiler.processing.XNullability
 import androidx.room.compiler.processing.tryUnbox
 import com.google.devtools.ksp.symbol.KSType
-import com.squareup.javapoet.TypeName
+import com.squareup.kotlinpoet.javapoet.JTypeName
+import com.squareup.kotlinpoet.javapoet.KTypeName
 
 /**
  * This tries to mimic primitive types in Kotlin.
@@ -33,8 +34,12 @@
     ksType: KSType,
     jvmTypeResolver: KspJvmTypeResolver?
 ) : KspType(env, ksType, jvmTypeResolver) {
-    override fun resolveTypeName(): TypeName {
-        return ksType.typeName(env.resolver).tryUnbox()
+    override fun resolveJTypeName(): JTypeName {
+        return ksType.asJTypeName(env.resolver).tryUnbox()
+    }
+
+    override fun resolveKTypeName(): KTypeName {
+        return ksType.asKTypeName(env.resolver)
     }
 
     override fun boxed(): KspType {
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspRawType.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspRawType.kt
index d027fd0..156bf38 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspRawType.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspRawType.kt
@@ -16,9 +16,9 @@
 
 package androidx.room.compiler.processing.ksp
 
+import androidx.room.compiler.codegen.XTypeName
 import androidx.room.compiler.processing.XRawType
 import androidx.room.compiler.processing.rawTypeName
-import com.squareup.javapoet.TypeName
 
 internal class KspRawType constructor(
     private val original: KspType
@@ -27,24 +27,34 @@
         original.ksType.starProjection().makeNotNullable()
     }
 
-    override val typeName: TypeName by lazy {
-        original.typeName.rawTypeName()
+    override val typeName by lazy {
+        xTypeName.java
     }
 
+    private val xTypeName: XTypeName by lazy {
+        XTypeName(
+            original.asTypeName().java.rawTypeName(),
+            original.asTypeName().kotlin.rawTypeName(),
+            original.nullability
+        )
+    }
+
+    override fun asTypeName() = xTypeName
+
     override fun isAssignableFrom(other: XRawType): Boolean {
         check(other is KspRawType)
         return ksType.isAssignableFrom(other.ksType)
     }
 
     override fun equals(other: Any?): Boolean {
-        return this === other || typeName == (other as? XRawType)?.typeName
+        return this === other || xTypeName == (other as? XRawType)?.asTypeName()
     }
 
     override fun hashCode(): Int {
-        return typeName.hashCode()
+        return xTypeName.hashCode()
     }
 
     override fun toString(): String {
-        return typeName.toString()
+        return xTypeName.kotlin.toString()
     }
 }
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspType.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspType.kt
index 8cacecb..3e072561 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspType.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspType.kt
@@ -16,6 +16,7 @@
 
 package androidx.room.compiler.processing.ksp
 
+import androidx.room.compiler.codegen.XTypeName
 import androidx.room.compiler.processing.XEquality
 import androidx.room.compiler.processing.XNullability
 import androidx.room.compiler.processing.XType
@@ -28,6 +29,8 @@
 import com.google.devtools.ksp.symbol.KSTypeReference
 import com.google.devtools.ksp.symbol.Nullability
 import com.squareup.javapoet.TypeName
+import com.squareup.kotlinpoet.javapoet.JTypeName
+import com.squareup.kotlinpoet.javapoet.KTypeName
 import kotlin.reflect.KClass
 
 /**
@@ -51,21 +54,33 @@
     }
 
     final override val typeName: TypeName by lazy {
-        jvmWildcardType?.typeName ?: resolveTypeName()
+        xTypeName.java
     }
 
+    private val xTypeName: XTypeName by lazy {
+        XTypeName(
+            jvmWildcardType?.asTypeName()?.java ?: resolveJTypeName(),
+            jvmWildcardType?.asTypeName()?.kotlin ?: resolveKTypeName(),
+            nullability
+        )
+    }
+
+    override fun asTypeName() = xTypeName
+
     /**
-     * A Kotlin type might have a sligtly different type in JVM due to wildcards.
+     * A Kotlin type might have a slightly different type in JVM due to wildcards.
      * This fields holds onto that value which will be used when creating JVM types.
      */
     private val jvmWildcardType by lazy {
         jvmTypeResolver?.resolveJvmType(env)
     }
 
-    val jvmWildcardTypeOrSelf
+    internal val jvmWildcardTypeOrSelf
         get() = jvmWildcardType ?: this
 
-    protected abstract fun resolveTypeName(): TypeName
+    protected abstract fun resolveJTypeName(): JTypeName
+
+    protected abstract fun resolveKTypeName(): KTypeName
 
     override val nullability by lazy {
         when (ksType.nullability) {
@@ -92,9 +107,9 @@
             return@lazy null
         }
 
-        // If the typeName is primitive, return null for consistency since primitives normally imply
+        // If this is a primitive, return null for consistency since primitives normally imply
         // that there isn't an associated type element.
-        if (typeName.isPrimitive) {
+        if (this is KspPrimitiveType) {
             return@lazy null
         }
 
@@ -161,7 +176,7 @@
         if (nullability == XNullability.UNKNOWN || other.nullability == XNullability.UNKNOWN) {
             // if one the nullabilities is unknown, it is coming from java source code or .class.
             // for those cases, use java platform type equality (via typename)
-            return typeName == other.typeName
+            return asTypeName().java == other.asTypeName().java
         }
         // NOTE: this is inconsistent with java where nullability is ignored.
         // it is intentional but might be reversed if it happens to break use cases.
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspTypeArgumentType.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspTypeArgumentType.kt
index a247fb6..f7471ae 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspTypeArgumentType.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspTypeArgumentType.kt
@@ -21,7 +21,8 @@
 import com.google.devtools.ksp.symbol.KSTypeArgument
 import com.google.devtools.ksp.symbol.KSTypeParameter
 import com.google.devtools.ksp.symbol.KSTypeReference
-import com.squareup.javapoet.TypeName
+import com.squareup.kotlinpoet.javapoet.JTypeName
+import com.squareup.kotlinpoet.javapoet.KTypeName
 
 /**
  * The typeName for type arguments requires the type parameter, hence we have a special type
@@ -48,8 +49,12 @@
         )
     }
 
-    override fun resolveTypeName(): TypeName {
-        return typeArg.typeName(env.resolver)
+    override fun resolveJTypeName(): JTypeName {
+        return typeArg.asJTypeName(env.resolver)
+    }
+
+    override fun resolveKTypeName(): KTypeName {
+        return typeArg.asKTypeName(env.resolver)
     }
 
     override fun boxed(): KspTypeArgumentType {
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspTypeElement.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspTypeElement.kt
index bf0c668..75517f7 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspTypeElement.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspTypeElement.kt
@@ -16,6 +16,7 @@
 
 package androidx.room.compiler.processing.ksp
 
+import androidx.room.compiler.codegen.XClassName
 import androidx.room.compiler.processing.XAnnotated
 import androidx.room.compiler.processing.XConstructorElement
 import androidx.room.compiler.processing.XEnumEntry
@@ -24,6 +25,7 @@
 import androidx.room.compiler.processing.XHasModifiers
 import androidx.room.compiler.processing.XMemberContainer
 import androidx.room.compiler.processing.XMethodElement
+import androidx.room.compiler.processing.XNullability
 import androidx.room.compiler.processing.XType
 import androidx.room.compiler.processing.XTypeElement
 import androidx.room.compiler.processing.XTypeParameterElement
@@ -44,6 +46,8 @@
 import com.google.devtools.ksp.symbol.Modifier
 import com.squareup.javapoet.ClassName
 import com.squareup.javapoet.TypeName
+import com.squareup.kotlinpoet.javapoet.JClassName
+import com.squareup.kotlinpoet.javapoet.KClassName
 
 internal sealed class KspTypeElement(
     env: KspProcessingEnv,
@@ -130,14 +134,22 @@
     }
 
     override val className: ClassName by lazy {
-        declaration.typeName(env.resolver).tryBox().also { typeName ->
-            check(typeName is ClassName) {
+        xClassName.java
+    }
+
+    private val xClassName: XClassName by lazy {
+        val java = declaration.asJTypeName(env.resolver).tryBox().also { typeName ->
+            check(typeName is JClassName) {
                 "Internal error. The type name for $declaration should be a class name but " +
                     "received ${typeName::class}"
             }
-        } as ClassName
+        } as JClassName
+        val kotlin = declaration.asKTypeName(env.resolver) as KClassName
+        XClassName(java, kotlin, XNullability.NONNULL)
     }
 
+    override fun asClassName() = xClassName
+
     private val allMethods = MemoizedSequence {
         collectAllMethods(this)
     }
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspVoidType.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspVoidType.kt
index 497280f6..87d50ca 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspVoidType.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/KspVoidType.kt
@@ -18,7 +18,8 @@
 
 import androidx.room.compiler.processing.XNullability
 import com.google.devtools.ksp.symbol.KSType
-import com.squareup.javapoet.TypeName
+import com.squareup.kotlinpoet.javapoet.JTypeName
+import com.squareup.kotlinpoet.javapoet.KTypeName
 
 /**
  * Representation of `void` in KSP.
@@ -33,14 +34,18 @@
     val boxed: Boolean,
     jvmTypeResolver: KspJvmTypeResolver?
 ) : KspType(env, ksType, jvmTypeResolver) {
-    override fun resolveTypeName(): TypeName {
+    override fun resolveJTypeName(): JTypeName {
         return if (boxed || nullability == XNullability.NULLABLE) {
-            TypeName.VOID.box()
+            JTypeName.VOID.box()
         } else {
-            TypeName.VOID
+            JTypeName.VOID
         }
     }
 
+    override fun resolveKTypeName(): KTypeName {
+        return com.squareup.kotlinpoet.UNIT
+    }
+
     override fun boxed(): KspType {
         return if (boxed) {
             this
diff --git a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/synthetic/KspSyntheticFileMemberContainer.kt b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/synthetic/KspSyntheticFileMemberContainer.kt
index a0e9fd3..82addef 100644
--- a/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/synthetic/KspSyntheticFileMemberContainer.kt
+++ b/room/room-compiler-processing/src/main/java/androidx/room/compiler/processing/ksp/synthetic/KspSyntheticFileMemberContainer.kt
@@ -16,14 +16,17 @@
 
 package androidx.room.compiler.processing.ksp.synthetic
 
+import androidx.room.compiler.codegen.XClassName
 import androidx.room.compiler.processing.XAnnotation
 import androidx.room.compiler.processing.XAnnotationBox
 import androidx.room.compiler.processing.XElement
 import androidx.room.compiler.processing.XEquality
+import androidx.room.compiler.processing.XNullability
 import androidx.room.compiler.processing.ksp.KspMemberContainer
 import androidx.room.compiler.processing.ksp.KspType
 import com.google.devtools.ksp.symbol.KSDeclaration
 import com.squareup.javapoet.ClassName
+import com.squareup.kotlinpoet.javapoet.toKClassName
 import kotlin.reflect.KClass
 
 /**
@@ -47,6 +50,10 @@
         get() = null
 
     override val className: ClassName by lazy {
+        xClassName.java
+    }
+
+    private val xClassName: XClassName by lazy {
         val packageName = binaryName.substringBeforeLast(
             delimiter = '.',
             missingDelimiterValue = ""
@@ -56,13 +63,19 @@
         } else {
             binaryName.substring(packageName.length + 1)
         }.split('$')
-        ClassName.get(
+        val java = ClassName.get(
             packageName,
             shortNames.first(),
             *shortNames.drop(1).toTypedArray()
         )
+        // Even though the generated Java class is not referencable from Kotlin code, instead of
+        // using 'Unavailable', for parity we use the same JavaPoet name for KotlinPoet,
+        val kotlin = java.toKClassName()
+        XClassName(java, kotlin, XNullability.NONNULL)
     }
 
+    override fun asClassName() = xClassName
+
     override fun kindName(): String {
         return "synthethic top level file"
     }
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/codegen/XTypeNameTest.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/codegen/XTypeNameTest.kt
new file mode 100644
index 0000000..4a42d64
--- /dev/null
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/codegen/XTypeNameTest.kt
@@ -0,0 +1,127 @@
+/*
+ * Copyright 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 androidx.room.compiler.codegen
+
+import com.google.common.truth.Truth.assertThat
+import com.squareup.kotlinpoet.INT
+import com.squareup.kotlinpoet.SHORT
+import com.squareup.kotlinpoet.javapoet.JClassName
+import org.junit.Test
+
+class XTypeNameTest {
+
+    @Test
+    fun equality() {
+        assertThat(
+            XTypeName(
+                java = JClassName.INT.box(),
+                kotlin = INT
+            )
+        ).isEqualTo(
+            XTypeName(
+                java = JClassName.INT.box(),
+                kotlin = INT
+            )
+        )
+
+        assertThat(
+            XTypeName(
+                java = JClassName.INT.box(),
+                kotlin = INT
+            )
+        ).isNotEqualTo(
+            XTypeName(
+                java = JClassName.INT.box(),
+                kotlin = SHORT
+            )
+        )
+
+        assertThat(
+            XTypeName(
+                java = JClassName.INT.box(),
+                kotlin = SHORT
+            )
+        ).isNotEqualTo(
+            XTypeName(
+                java = JClassName.INT.box(),
+                kotlin = INT
+            )
+        )
+    }
+
+    @Test
+    fun equality_kotlinUnavailable() {
+        assertThat(
+            XTypeName(
+                java = JClassName.INT.box(),
+                kotlin = INT
+            )
+        ).isEqualTo(
+            XTypeName(
+                java = JClassName.INT.box(),
+                kotlin = XTypeName.UNAVAILABLE_KTYPE_NAME
+            )
+        )
+
+        assertThat(
+            XTypeName(
+                java = JClassName.INT.box(),
+                kotlin = XTypeName.UNAVAILABLE_KTYPE_NAME
+            )
+        ).isEqualTo(
+            XTypeName(
+                java = JClassName.INT.box(),
+                kotlin = INT
+            )
+        )
+
+        assertThat(
+            XTypeName(
+                java = JClassName.SHORT.box(),
+                kotlin = SHORT
+            )
+        ).isNotEqualTo(
+            XTypeName(
+                java = JClassName.INT.box(),
+                kotlin = XTypeName.UNAVAILABLE_KTYPE_NAME
+            )
+        )
+
+        assertThat(
+            XTypeName(
+                java = JClassName.INT.box(),
+                kotlin = XTypeName.UNAVAILABLE_KTYPE_NAME
+            )
+        ).isNotEqualTo(
+            XTypeName(
+                java = JClassName.SHORT.box(),
+                kotlin = SHORT
+            )
+        )
+    }
+
+    @Test
+    fun hashCode_kotlinUnavailable() {
+        val expectedClass = XClassName.get("foo", "Bar")
+        assertThat(
+            XTypeName(
+                java = JClassName.get("foo", "Bar"),
+                kotlin = XTypeName.UNAVAILABLE_KTYPE_NAME
+            ).hashCode()
+        ).isEqualTo(expectedClass.hashCode())
+    }
+}
\ No newline at end of file
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/InternalModifierTest.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/InternalModifierTest.kt
index 1364fb3..524fd62 100644
--- a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/InternalModifierTest.kt
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/InternalModifierTest.kt
@@ -75,7 +75,7 @@
         fun buildSource(pkg: String) = Source.kotlin(
             "Subject.kt",
             """
-            package $pkg;
+            package $pkg
             internal class InternalClass(val value: String)
             inline class InlineClass(val value:String)
             abstract class Subject {
@@ -101,9 +101,9 @@
             """.trimIndent()
         )
 
-        fun XType.toSignature() = this.typeName.toString()
+        fun XType.toSignature() = this.asTypeName().java.toString()
 
-        fun XMemberContainer.toSignature() = className.toString()
+        fun XMemberContainer.toSignature() = asClassName().java.toString()
 
         fun XFieldElement.toSignature() =
             "${closestMemberContainer.toSignature()}.$name : ${type.toSignature()}"
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/KotlinMetadataTest.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/KotlinMetadataTest.kt
index fbcc78d..ea65ac3 100644
--- a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/KotlinMetadataTest.kt
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/KotlinMetadataTest.kt
@@ -18,10 +18,10 @@
 
 import androidx.room.compiler.processing.testcode.KotlinTestClass
 import androidx.room.compiler.processing.util.Source
+import androidx.room.compiler.processing.util.asJTypeName
 import androidx.room.compiler.processing.util.getMethodByJvmName
 import androidx.room.compiler.processing.util.getParameter
 import androidx.room.compiler.processing.util.runProcessorTest
-import androidx.room.compiler.processing.util.typeName
 import com.google.common.truth.Truth.assertThat
 import org.junit.Test
 
@@ -40,8 +40,8 @@
             val element = it.processingEnv.requireTypeElement(KotlinTestClass::class)
             element.getMethodByJvmName("mySuspendMethod").apply {
                 assertThat(parameters).hasSize(2)
-                assertThat(getParameter("param1").type.typeName)
-                    .isEqualTo(String::class.typeName())
+                assertThat(getParameter("param1").type.asTypeName().java)
+                    .isEqualTo(String::class.asJTypeName())
                 assertThat(isSuspendFunction()).isTrue()
             }
         }
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/TypeAliasTest.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/TypeAliasTest.kt
index 46e2c5b6..ba7cb80 100644
--- a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/TypeAliasTest.kt
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/TypeAliasTest.kt
@@ -16,17 +16,24 @@
 
 package androidx.room.compiler.processing
 
-import androidx.room.compiler.processing.util.CONTINUATION_CLASS_NAME
+import androidx.room.compiler.codegen.XTypeName
+import androidx.room.compiler.codegen.asClassName
+import androidx.room.compiler.processing.util.CONTINUATION_JCLASS_NAME
 import androidx.room.compiler.processing.util.Source
-import androidx.room.compiler.processing.util.className
+import androidx.room.compiler.processing.util.asJClassName
+import androidx.room.compiler.processing.util.asKClassName
 import androidx.room.compiler.processing.util.compileFiles
 import androidx.room.compiler.processing.util.getField
 import androidx.room.compiler.processing.util.getMethodByJvmName
 import androidx.room.compiler.processing.util.runProcessorTest
 import com.google.common.truth.Truth.assertThat
-import com.squareup.javapoet.ParameterizedTypeName
-import com.squareup.javapoet.TypeName
-import com.squareup.javapoet.WildcardTypeName
+import com.squareup.kotlinpoet.LONG
+import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy
+import com.squareup.kotlinpoet.javapoet.JParameterizedTypeName
+import com.squareup.kotlinpoet.javapoet.JTypeName
+import com.squareup.kotlinpoet.javapoet.JWildcardTypeName
+import com.squareup.kotlinpoet.javapoet.KWildcardTypeName
+import kotlin.coroutines.Continuation
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
@@ -57,28 +64,40 @@
                 val elm = invocation.processingEnv.requireTypeElement("$pkg.Subject")
                 elm.getField("prop").type.let {
                     assertThat(it.nullability).isEqualTo(XNullability.NONNULL)
-                    assertThat(it.typeName).isEqualTo(TypeName.LONG)
+                    assertThat(it.asTypeName()).isEqualTo(XTypeName.PRIMITIVE_LONG)
                 }
                 elm.getField("nullable").type.let {
                     assertThat(it.nullability).isEqualTo(XNullability.NULLABLE)
-                    assertThat(it.typeName).isEqualTo(TypeName.LONG.box())
+                    assertThat(it.asTypeName())
+                        .isEqualTo(Long::class.asClassName().copy(nullable = true))
                 }
                 elm.getField("inGeneric").type.let {
                     assertThat(it.nullability).isEqualTo(XNullability.NONNULL)
-                    assertThat(it.typeName).isEqualTo(
-                        ParameterizedTypeName.get(
-                            List::class.className(),
-                            TypeName.LONG.box()
+                    assertThat(it.asTypeName().java).isEqualTo(
+                        JParameterizedTypeName.get(
+                            List::class.asJClassName(),
+                            JTypeName.LONG.box()
                         )
                     )
+                    if (invocation.isKsp) {
+                        assertThat(it.asTypeName().kotlin).isEqualTo(
+                            List::class.asKClassName().parameterizedBy(LONG)
+                        )
+                    }
                 }
                 elm.getMethodByJvmName("suspendFun").parameters.last().type.let {
-                    assertThat(it.typeName).isEqualTo(
-                        ParameterizedTypeName.get(
-                            CONTINUATION_CLASS_NAME,
-                            WildcardTypeName.supertypeOf(TypeName.LONG.box())
+                    assertThat(it.asTypeName().java).isEqualTo(
+                        JParameterizedTypeName.get(
+                            CONTINUATION_JCLASS_NAME,
+                            JWildcardTypeName.supertypeOf(JTypeName.LONG.box())
                         )
                     )
+                    if (invocation.isKsp) {
+                        assertThat(it.asTypeName().kotlin).isEqualTo(
+                            Continuation::class.asKClassName()
+                                .parameterizedBy(KWildcardTypeName.consumerOf(LONG))
+                        )
+                    }
                 }
             }
         }
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/TypeInheritanceTest.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/TypeInheritanceTest.kt
index 7843716..40d916e 100644
--- a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/TypeInheritanceTest.kt
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/TypeInheritanceTest.kt
@@ -62,29 +62,42 @@
 
     private fun XTestInvocation.assertFieldType(fieldName: String, expectedTypeName: String) {
         val sub = processingEnv.requireTypeElement("SubClass")
-        val subField = sub.getField(fieldName).asMemberOf(sub.type).typeName.toString()
-        assertThat(subField).isEqualTo(expectedTypeName)
+        val subField = sub.getField(fieldName).asMemberOf(sub.type)
+        assertThat(subField.asTypeName().java.toString()).isEqualTo(expectedTypeName)
+        if (isKsp) {
+            assertThat(subField.asTypeName().kotlin.toString()).isEqualTo(expectedTypeName)
+        }
 
         val base = processingEnv.requireTypeElement("BaseClass")
-        val baseField = base.getField(fieldName).asMemberOf(sub.type).typeName.toString()
-        assertThat(baseField).isEqualTo(expectedTypeName)
+        val baseField = base.getField(fieldName).asMemberOf(sub.type)
+        assertThat(baseField.asTypeName().java.toString()).isEqualTo(expectedTypeName)
+        if (isKsp) {
+            assertThat(baseField.asTypeName().kotlin.toString()).isEqualTo(expectedTypeName)
+        }
     }
 
     private fun XTestInvocation.assertParamType(
         methodName: String,
         paramName: String,
-        expectedTypeName: String,
+        expectedJTypeName: String,
+        expectedKTypeName: String,
     ) {
         val sub = processingEnv.requireTypeElement("SubClass")
         val subMethod = sub.getMethodByJvmName(methodName)
         val paramIndex = subMethod.parameters.indexOf(subMethod.getParameter(paramName))
         val subMethodParam = subMethod.asMemberOf(sub.type).parameterTypes[paramIndex]
-        assertThat(subMethodParam.typeName.toString()).isEqualTo(expectedTypeName)
+        assertThat(subMethodParam.asTypeName().java.toString()).isEqualTo(expectedJTypeName)
+        if (isKsp) {
+            assertThat(subMethodParam.asTypeName().kotlin.toString()).isEqualTo(expectedKTypeName)
+        }
 
         val base = processingEnv.requireTypeElement("BaseClass")
         val baseMethod = base.getMethodByJvmName(methodName)
         val baseMethodParam = baseMethod.asMemberOf(sub.type).parameterTypes[paramIndex]
-        assertThat(baseMethodParam.typeName.toString()).isEqualTo(expectedTypeName)
+        assertThat(baseMethodParam.asTypeName().java.toString()).isEqualTo(expectedJTypeName)
+        if (isKsp) {
+            assertThat(baseMethodParam.asTypeName().kotlin.toString()).isEqualTo(expectedKTypeName)
+        }
     }
 
     private fun XTestInvocation.assertReturnType(methodName: String, expectedTypeName: String) {
@@ -110,9 +123,9 @@
             invocation.assertFieldType("varField", "Foo<Bar<Baz>>")
             invocation.assertFieldType("varFieldT1", "Foo<Bar<Baz>>")
             invocation.assertFieldType("varFieldT2", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "param", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "paramT1", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "paramT2", "Foo<Bar<Baz>>")
+            invocation.assertParamType("method", "param", "Foo<Bar<Baz>>", "Foo<Bar<Baz>>")
+            invocation.assertParamType("method", "paramT1", "Foo<Bar<Baz>>", "Foo<Bar<Baz>>")
+            invocation.assertParamType("method", "paramT2", "Foo<Bar<Baz>>", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturn", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT1", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT2", "Foo<Bar<Baz>>")
@@ -132,9 +145,9 @@
             invocation.assertFieldType("varField", "Foo<Bar<Baz>>")
             invocation.assertFieldType("varFieldT1", "Foo<Bar<Baz>>")
             invocation.assertFieldType("varFieldT2", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "param", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "paramT1", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "paramT2", "Foo<Bar<Baz>>")
+            invocation.assertParamType("method", "param", "Foo<Bar<Baz>>", "Foo<Bar<Baz>>")
+            invocation.assertParamType("method", "paramT1", "Foo<Bar<Baz>>", "Foo<Bar<Baz>>")
+            invocation.assertParamType("method", "paramT2", "Foo<Bar<Baz>>", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturn", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT1", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT2", "Foo<Bar<Baz>>")
@@ -154,9 +167,9 @@
             invocation.assertFieldType("varField", "Foo<Bar<Baz>>")
             invocation.assertFieldType("varFieldT1", "Foo<Bar<Baz>>")
             invocation.assertFieldType("varFieldT2", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "param", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "paramT1", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "paramT2", "Foo<Bar<Baz>>")
+            invocation.assertParamType("method", "param", "Foo<Bar<Baz>>", "Foo<Bar<Baz>>")
+            invocation.assertParamType("method", "paramT1", "Foo<Bar<Baz>>", "Foo<Bar<Baz>>")
+            invocation.assertParamType("method", "paramT2", "Foo<Bar<Baz>>", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturn", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT1", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT2", "Foo<Bar<Baz>>")
@@ -176,9 +189,9 @@
             invocation.assertFieldType("varField", "Foo<Bar<Baz>>")
             invocation.assertFieldType("varFieldT1", "Foo<Bar<Baz>>")
             invocation.assertFieldType("varFieldT2", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "param", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "paramT1", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "paramT2", "Foo<Bar<Baz>>")
+            invocation.assertParamType("method", "param", "Foo<Bar<Baz>>", "Foo<Bar<Baz>>")
+            invocation.assertParamType("method", "paramT1", "Foo<Bar<Baz>>", "Foo<Bar<Baz>>")
+            invocation.assertParamType("method", "paramT2", "Foo<Bar<Baz>>", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturn", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT1", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT2", "Foo<Bar<Baz>>")
@@ -198,9 +211,9 @@
             invocation.assertFieldType("varField", "Foo<Bar<Baz>>")
             invocation.assertFieldType("varFieldT1", "Foo<Bar<Baz>>")
             invocation.assertFieldType("varFieldT2", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "param", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "paramT1", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "paramT2", "Foo<Bar<Baz>>")
+            invocation.assertParamType("method", "param", "Foo<Bar<Baz>>", "Foo<Bar<Baz>>")
+            invocation.assertParamType("method", "paramT1", "Foo<Bar<Baz>>", "Foo<Bar<Baz>>")
+            invocation.assertParamType("method", "paramT2", "Foo<Bar<Baz>>", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturn", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT1", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT2", "Foo<Bar<Baz>>")
@@ -220,9 +233,9 @@
             invocation.assertFieldType("varField", "Foo<Bar<Baz>>")
             invocation.assertFieldType("varFieldT1", "Foo<Bar<Baz>>")
             invocation.assertFieldType("varFieldT2", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "param", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "paramT1", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "paramT2", "Foo<Bar<Baz>>")
+            invocation.assertParamType("method", "param", "Foo<Bar<Baz>>", "Foo<Bar<Baz>>")
+            invocation.assertParamType("method", "paramT1", "Foo<Bar<Baz>>", "Foo<Bar<Baz>>")
+            invocation.assertParamType("method", "paramT2", "Foo<Bar<Baz>>", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturn", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT1", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT2", "Foo<Bar<Baz>>")
@@ -242,9 +255,9 @@
             invocation.assertFieldType("varField", "Foo<Bar<Baz>>")
             invocation.assertFieldType("varFieldT1", "Foo<Bar<Baz>>")
             invocation.assertFieldType("varFieldT2", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "param", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "paramT1", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "paramT2", "Foo<Bar<Baz>>")
+            invocation.assertParamType("method", "param", "Foo<Bar<Baz>>", "Foo<Bar<Baz>>")
+            invocation.assertParamType("method", "paramT1", "Foo<Bar<Baz>>", "Foo<Bar<Baz>>")
+            invocation.assertParamType("method", "paramT2", "Foo<Bar<Baz>>", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturn", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT1", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT2", "Foo<Bar<Baz>>")
@@ -264,9 +277,9 @@
             invocation.assertFieldType("varField", "Foo<Bar<Baz>>")
             invocation.assertFieldType("varFieldT1", "Foo<Bar<Baz>>")
             invocation.assertFieldType("varFieldT2", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "param", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "paramT1", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "paramT2", "Foo<Bar<Baz>>")
+            invocation.assertParamType("method", "param", "Foo<Bar<Baz>>", "Foo<Bar<Baz>>")
+            invocation.assertParamType("method", "paramT1", "Foo<Bar<Baz>>", "Foo<Bar<Baz>>")
+            invocation.assertParamType("method", "paramT2", "Foo<Bar<Baz>>", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturn", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT1", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT2", "Foo<Bar<Baz>>")
@@ -285,9 +298,14 @@
             invocation.assertFieldType("valFieldT2", "Foo<Bar<Baz>>")
             invocation.assertFieldType("varField", "Foo<Bar<Baz>>")
             invocation.assertFieldType("varFieldT1", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "param", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "paramT1", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "paramT2", "Foo<? extends Bar<Baz>>")
+            invocation.assertParamType("method", "param", "Foo<Bar<Baz>>", "Foo<Bar<Baz>>")
+            invocation.assertParamType("method", "paramT1", "Foo<Bar<Baz>>", "Foo<Bar<Baz>>")
+            invocation.assertParamType(
+                "method",
+                "paramT2",
+                "Foo<? extends Bar<Baz>>",
+                "Foo<out Bar<Baz>>"
+            )
             invocation.assertReturnType("methodReturn", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT1", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT2", "Foo<Bar<Baz>>")
@@ -313,9 +331,14 @@
             invocation.assertFieldType("valFieldT2", "Foo<Bar<Baz>>")
             invocation.assertFieldType("varField", "Foo<Bar<Baz>>")
             invocation.assertFieldType("varFieldT1", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "param", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "paramT1", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "paramT2", "Foo<? extends Bar<Baz>>")
+            invocation.assertParamType("method", "param", "Foo<Bar<Baz>>", "Foo<Bar<Baz>>")
+            invocation.assertParamType("method", "paramT1", "Foo<Bar<Baz>>", "Foo<Bar<Baz>>")
+            invocation.assertParamType(
+                "method",
+                "paramT2",
+                "Foo<? extends Bar<Baz>>",
+                "Foo<out Bar<Baz>>"
+            )
             invocation.assertReturnType("methodReturn", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT1", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT2", "Foo<Bar<Baz>>")
@@ -339,9 +362,24 @@
             invocation.assertFieldType("valField", "Foo<Bar<Baz>>")
             invocation.assertFieldType("valFieldT1", "Foo<Bar<Baz>>")
             invocation.assertFieldType("valFieldT2", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "param", "Foo<? extends Bar<Baz>>")
-            invocation.assertParamType("method", "paramT1", "Foo<? extends Bar<Baz>>")
-            invocation.assertParamType("method", "paramT2", "Foo<? extends Bar<Baz>>")
+            invocation.assertParamType(
+                "method",
+                "param",
+                "Foo<? extends Bar<Baz>>",
+                "Foo<out Bar<Baz>>"
+            )
+            invocation.assertParamType(
+                "method",
+                "paramT1",
+                "Foo<? extends Bar<Baz>>",
+                "Foo<out Bar<Baz>>"
+            )
+            invocation.assertParamType(
+                "method",
+                "paramT2",
+                "Foo<? extends Bar<Baz>>",
+                "Foo<out Bar<Baz>>"
+            )
             invocation.assertReturnType("methodReturn", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT1", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT2", "Foo<Bar<Baz>>")
@@ -371,9 +409,14 @@
             invocation.assertFieldType("valFieldT2", "Foo<Bar<Baz>>")
             invocation.assertFieldType("varField", "Foo<Bar<Baz>>")
             invocation.assertFieldType("varFieldT1", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "param", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "paramT1", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "paramT2", "Foo<? extends Bar<Baz>>")
+            invocation.assertParamType("method", "param", "Foo<Bar<Baz>>", "Foo<Bar<Baz>>")
+            invocation.assertParamType("method", "paramT1", "Foo<Bar<Baz>>", "Foo<Bar<Baz>>")
+            invocation.assertParamType(
+                "method",
+                "paramT2",
+                "Foo<? extends Bar<Baz>>",
+                "Foo<out Bar<Baz>>"
+            )
             invocation.assertReturnType("methodReturn", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT1", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT2", "Foo<Bar<Baz>>")
@@ -397,9 +440,24 @@
             invocation.assertFieldType("valField", "Foo<Bar<Baz>>")
             invocation.assertFieldType("valFieldT1", "Foo<Bar<Baz>>")
             invocation.assertFieldType("valFieldT2", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "param", "Foo<? extends Bar<Baz>>")
-            invocation.assertParamType("method", "paramT1", "Foo<? extends Bar<Baz>>")
-            invocation.assertParamType("method", "paramT2", "Foo<? extends Bar<Baz>>")
+            invocation.assertParamType(
+                "method",
+                "param",
+                "Foo<? extends Bar<Baz>>",
+                "Foo<out Bar<Baz>>"
+            )
+            invocation.assertParamType(
+                "method",
+                "paramT1",
+                "Foo<? extends Bar<Baz>>",
+                "Foo<out Bar<Baz>>"
+            )
+            invocation.assertParamType(
+                "method",
+                "paramT2",
+                "Foo<? extends Bar<Baz>>",
+                "Foo<out Bar<Baz>>"
+            )
             invocation.assertReturnType("methodReturn", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT1", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT2", "Foo<Bar<Baz>>")
@@ -429,9 +487,14 @@
             invocation.assertFieldType("valFieldT2", "Foo<Bar<Baz>>")
             invocation.assertFieldType("varField", "Foo<Bar<Baz>>")
             invocation.assertFieldType("varFieldT1", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "param", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "paramT1", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "paramT2", "Foo<? extends Bar<Baz>>")
+            invocation.assertParamType("method", "param", "Foo<Bar<Baz>>", "Foo<Bar<Baz>>")
+            invocation.assertParamType("method", "paramT1", "Foo<Bar<Baz>>", "Foo<Bar<Baz>>")
+            invocation.assertParamType(
+                "method",
+                "paramT2",
+                "Foo<? extends Bar<Baz>>",
+                "Foo<out Bar<Baz>>"
+            )
             invocation.assertReturnType("methodReturn", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT1", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT2", "Foo<Bar<Baz>>")
@@ -455,9 +518,24 @@
             invocation.assertFieldType("valField", "Foo<Bar<Baz>>")
             invocation.assertFieldType("valFieldT1", "Foo<Bar<Baz>>")
             invocation.assertFieldType("valFieldT2", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "param", "Foo<? extends Bar<Baz>>")
-            invocation.assertParamType("method", "paramT1", "Foo<? extends Bar<Baz>>")
-            invocation.assertParamType("method", "paramT2", "Foo<? extends Bar<Baz>>")
+            invocation.assertParamType(
+                "method",
+                "param",
+                "Foo<? extends Bar<Baz>>",
+                "Foo<out Bar<Baz>>"
+            )
+            invocation.assertParamType(
+                "method",
+                "paramT1",
+                "Foo<? extends Bar<Baz>>",
+                "Foo<out Bar<Baz>>"
+            )
+            invocation.assertParamType(
+                "method",
+                "paramT2",
+                "Foo<? extends Bar<Baz>>",
+                "Foo<out Bar<Baz>>"
+            )
             invocation.assertReturnType("methodReturn", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT1", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT2", "Foo<Bar<Baz>>")
@@ -485,9 +563,24 @@
             invocation.assertFieldType("valField", "Foo<Bar<Baz>>")
             invocation.assertFieldType("valFieldT1", "Foo<Bar<Baz>>")
             invocation.assertFieldType("valFieldT2", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "param", "Foo<? extends Bar<Baz>>")
-            invocation.assertParamType("method", "paramT1", "Foo<? extends Bar<Baz>>")
-            invocation.assertParamType("method", "paramT2", "Foo<? extends Bar<Baz>>")
+            invocation.assertParamType(
+                "method",
+                "param",
+                "Foo<? extends Bar<Baz>>",
+                "Foo<out Bar<Baz>>"
+            )
+            invocation.assertParamType(
+                "method",
+                "paramT1",
+                "Foo<? extends Bar<Baz>>",
+                "Foo<out Bar<Baz>>"
+            )
+            invocation.assertParamType(
+                "method",
+                "paramT2",
+                "Foo<? extends Bar<Baz>>",
+                "Foo<out Bar<Baz>>"
+            )
             invocation.assertReturnType("methodReturn", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT1", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT2", "Foo<Bar<Baz>>")
@@ -516,8 +609,13 @@
             invocation.assertFieldType("valFieldT1", "Foo<Bar<Baz>>")
             invocation.assertFieldType("varField", "Foo<Bar<Baz>>")
             invocation.assertFieldType("varFieldT1", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "param", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "paramT2", "Foo<Bar<? extends Baz>>")
+            invocation.assertParamType("method", "param", "Foo<Bar<Baz>>", "Foo<Bar<Baz>>")
+            invocation.assertParamType(
+                "method",
+                "paramT2",
+                "Foo<Bar<? extends Baz>>",
+                "Foo<Bar<out Baz>>"
+            )
             invocation.assertReturnType("methodReturn", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT1", "Foo<Bar<Baz>>")
 
@@ -525,12 +623,22 @@
             if (invocation.isKsp) {
                 invocation.assertFieldType("valFieldT2", "Foo<Bar<Baz>>")
                 invocation.assertFieldType("varFieldT2", "Foo<Bar<Baz>>")
-                invocation.assertParamType("method", "paramT1", "Foo<Bar<? extends Baz>>")
+                invocation.assertParamType(
+                    "method",
+                    "paramT1",
+                    "Foo<Bar<? extends Baz>>",
+                    "Foo<Bar<out Baz>>"
+                )
                 invocation.assertReturnType("methodReturnT2", "Foo<Bar<Baz>>")
             } else {
                 invocation.assertFieldType("valFieldT2", "Foo<Bar<? extends Baz>>")
                 invocation.assertFieldType("varFieldT2", "Foo<Bar<? extends Baz>>")
-                invocation.assertParamType("method", "paramT1", "Foo<Bar<Baz>>")
+                invocation.assertParamType(
+                    "method",
+                    "paramT1",
+                    "Foo<Bar<Baz>>",
+                    "Foo<Bar<Baz>>"
+                )
                 invocation.assertReturnType("methodReturnT2", "Foo<Bar<? extends Baz>>")
             }
         }
@@ -547,8 +655,13 @@
             invocation.assertFieldType("valFieldT1", "Foo<Bar<Baz>>")
             invocation.assertFieldType("varField", "Foo<Bar<Baz>>")
             invocation.assertFieldType("varFieldT1", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "param", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "paramT2", "Foo<Bar<? extends Baz>>")
+            invocation.assertParamType("method", "param", "Foo<Bar<Baz>>", "Foo<Bar<Baz>>")
+            invocation.assertParamType(
+                "method",
+                "paramT2",
+                "Foo<Bar<? extends Baz>>",
+                "Foo<Bar<out Baz>>"
+            )
             invocation.assertReturnType("methodReturn", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT1", "Foo<Bar<Baz>>")
 
@@ -556,12 +669,17 @@
             if (invocation.isKsp) {
                 invocation.assertFieldType("valFieldT2", "Foo<Bar<Baz>>")
                 invocation.assertFieldType("varFieldT2", "Foo<Bar<Baz>>")
-                invocation.assertParamType("method", "paramT1", "Foo<Bar<? extends Baz>>")
+                invocation.assertParamType(
+                    "method",
+                    "paramT1",
+                    "Foo<Bar<? extends Baz>>",
+                    "Foo<Bar<out Baz>>"
+                )
                 invocation.assertReturnType("methodReturnT2", "Foo<Bar<Baz>>")
             } else {
                 invocation.assertFieldType("valFieldT2", "Foo<Bar<? extends Baz>>")
                 invocation.assertFieldType("varFieldT2", "Foo<Bar<? extends Baz>>")
-                invocation.assertParamType("method", "paramT1", "Foo<Bar<Baz>>")
+                invocation.assertParamType("method", "paramT1", "Foo<Bar<Baz>>", "Foo<Bar<Baz>>")
                 invocation.assertReturnType("methodReturnT2", "Foo<Bar<? extends Baz>>")
             }
         }
@@ -578,8 +696,13 @@
             invocation.assertFieldType("valFieldT1", "Foo<Bar<Baz>>")
             invocation.assertFieldType("varField", "Foo<Bar<Baz>>")
             invocation.assertFieldType("varFieldT1", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "param", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "paramT2", "Foo<Bar<? extends Baz>>")
+            invocation.assertParamType("method", "param", "Foo<Bar<Baz>>", "Foo<Bar<Baz>>")
+            invocation.assertParamType(
+                "method",
+                "paramT2",
+                "Foo<Bar<? extends Baz>>",
+                "Foo<Bar<out Baz>>"
+            )
             invocation.assertReturnType("methodReturn", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT1", "Foo<Bar<Baz>>")
 
@@ -587,12 +710,17 @@
             if (invocation.isKsp) {
                 invocation.assertFieldType("valFieldT2", "Foo<Bar<Baz>>")
                 invocation.assertFieldType("varFieldT2", "Foo<Bar<Baz>>")
-                invocation.assertParamType("method", "paramT1", "Foo<Bar<? extends Baz>>")
+                invocation.assertParamType(
+                    "method",
+                    "paramT1",
+                    "Foo<Bar<? extends Baz>>",
+                    "Foo<Bar<out Baz>>"
+                )
                 invocation.assertReturnType("methodReturnT2", "Foo<Bar<Baz>>")
             } else {
                 invocation.assertFieldType("valFieldT2", "Foo<Bar<? extends Baz>>")
                 invocation.assertFieldType("varFieldT2", "Foo<Bar<? extends Baz>>")
-                invocation.assertParamType("method", "paramT1", "Foo<Bar<Baz>>")
+                invocation.assertParamType("method", "paramT1", "Foo<Bar<Baz>>", "Foo<Bar<Baz>>")
                 invocation.assertReturnType("methodReturnT2", "Foo<Bar<? extends Baz>>")
             }
         }
@@ -609,7 +737,12 @@
             invocation.assertFieldType("valFieldT1", "Foo<Bar<Baz>>")
             invocation.assertFieldType("varField", "Foo<Bar<Baz>>")
             invocation.assertFieldType("varFieldT1", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "paramT2", "Foo<Bar<? extends Baz>>")
+            invocation.assertParamType(
+                "method",
+                "paramT2",
+                "Foo<Bar<? extends Baz>>",
+                "Foo<Bar<out Baz>>"
+            )
             invocation.assertReturnType("methodReturn", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT1", "Foo<Bar<Baz>>")
 
@@ -617,14 +750,24 @@
             if (invocation.isKsp) {
                 invocation.assertFieldType("valFieldT2", "Foo<Bar<Baz>>")
                 invocation.assertFieldType("varFieldT2", "Foo<Bar<Baz>>")
-                invocation.assertParamType("method", "param", "Foo<Bar<? extends Baz>>")
-                invocation.assertParamType("method", "paramT1", "Foo<Bar<? extends Baz>>")
+                invocation.assertParamType(
+                    "method",
+                    "param",
+                    "Foo<Bar<? extends Baz>>",
+                    "Foo<Bar<out Baz>>"
+                )
+                invocation.assertParamType(
+                    "method",
+                    "paramT1",
+                    "Foo<Bar<? extends Baz>>",
+                    "Foo<Bar<out Baz>>"
+                )
                 invocation.assertReturnType("methodReturnT2", "Foo<Bar<Baz>>")
             } else {
                 invocation.assertFieldType("valFieldT2", "Foo<Bar<? extends Baz>>")
                 invocation.assertFieldType("varFieldT2", "Foo<Bar<? extends Baz>>")
-                invocation.assertParamType("method", "param", "Foo<Bar<Baz>>")
-                invocation.assertParamType("method", "paramT1", "Foo<Bar<Baz>>")
+                invocation.assertParamType("method", "param", "Foo<Bar<Baz>>", "Foo<Bar<Baz>>")
+                invocation.assertParamType("method", "paramT1", "Foo<Bar<Baz>>", "Foo<Bar<Baz>>")
                 invocation.assertReturnType("methodReturnT2", "Foo<Bar<? extends Baz>>")
             }
         }
@@ -641,8 +784,13 @@
             invocation.assertFieldType("valFieldT1", "Foo<Bar<Baz>>")
             invocation.assertFieldType("varField", "Foo<Bar<Baz>>")
             invocation.assertFieldType("varFieldT1", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "param", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "paramT2", "Foo<Bar<? extends Baz>>")
+            invocation.assertParamType("method", "param", "Foo<Bar<Baz>>", "Foo<Bar<Baz>>")
+            invocation.assertParamType(
+                "method",
+                "paramT2",
+                "Foo<Bar<? extends Baz>>",
+                "Foo<Bar<out Baz>>"
+            )
             invocation.assertReturnType("methodReturn", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT1", "Foo<Bar<Baz>>")
 
@@ -650,12 +798,22 @@
             if (invocation.isKsp) {
                 invocation.assertFieldType("valFieldT2", "Foo<Bar<Baz>>")
                 invocation.assertFieldType("varFieldT2", "Foo<Bar<Baz>>")
-                invocation.assertParamType("method", "paramT1", "Foo<Bar<? extends Baz>>")
+                invocation.assertParamType(
+                    "method",
+                    "paramT1",
+                    "Foo<Bar<? extends Baz>>",
+                    "Foo<Bar<out Baz>>"
+                )
                 invocation.assertReturnType("methodReturnT2", "Foo<Bar<Baz>>")
             } else {
                 invocation.assertFieldType("valFieldT2", "Foo<Bar<? extends Baz>>")
                 invocation.assertFieldType("varFieldT2", "Foo<Bar<? extends Baz>>")
-                invocation.assertParamType("method", "paramT1", "Foo<Bar<Baz>>")
+                invocation.assertParamType(
+                    "method",
+                    "paramT1",
+                    "Foo<Bar<Baz>>",
+                    "Foo<Bar<Baz>>"
+                )
                 invocation.assertReturnType("methodReturnT2", "Foo<Bar<? extends Baz>>")
             }
         }
@@ -672,7 +830,12 @@
             invocation.assertFieldType("valFieldT1", "Foo<Bar<Baz>>")
             invocation.assertFieldType("varField", "Foo<Bar<Baz>>")
             invocation.assertFieldType("varFieldT1", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "paramT2", "Foo<Bar<? extends Baz>>")
+            invocation.assertParamType(
+                "method",
+                "paramT2",
+                "Foo<Bar<? extends Baz>>",
+                "Foo<Bar<out Baz>>"
+            )
             invocation.assertReturnType("methodReturn", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT1", "Foo<Bar<Baz>>")
 
@@ -680,14 +843,29 @@
             if (invocation.isKsp) {
                 invocation.assertFieldType("valFieldT2", "Foo<Bar<Baz>>")
                 invocation.assertFieldType("varFieldT2", "Foo<Bar<Baz>>")
-                invocation.assertParamType("method", "param", "Foo<Bar<? extends Baz>>")
-                invocation.assertParamType("method", "paramT1", "Foo<Bar<? extends Baz>>")
+                invocation.assertParamType(
+                    "method",
+                    "param",
+                    "Foo<Bar<? extends Baz>>",
+                    "Foo<Bar<out Baz>>"
+                )
+                invocation.assertParamType(
+                    "method",
+                    "paramT1",
+                    "Foo<Bar<? extends Baz>>",
+                    "Foo<Bar<out Baz>>"
+                )
                 invocation.assertReturnType("methodReturnT2", "Foo<Bar<Baz>>")
             } else {
                 invocation.assertFieldType("valFieldT2", "Foo<Bar<? extends Baz>>")
                 invocation.assertFieldType("varFieldT2", "Foo<Bar<? extends Baz>>")
-                invocation.assertParamType("method", "param", "Foo<Bar<Baz>>")
-                invocation.assertParamType("method", "paramT1", "Foo<Bar<Baz>>")
+                invocation.assertParamType("method", "param", "Foo<Bar<Baz>>", "Foo<Bar<Baz>>")
+                invocation.assertParamType(
+                    "method",
+                    "paramT1",
+                    "Foo<Bar<Baz>>",
+                    "Foo<Bar<Baz>>"
+                )
                 invocation.assertReturnType("methodReturnT2", "Foo<Bar<? extends Baz>>")
             }
         }
@@ -704,7 +882,12 @@
             invocation.assertFieldType("valFieldT1", "Foo<Bar<Baz>>")
             invocation.assertFieldType("varField", "Foo<Bar<Baz>>")
             invocation.assertFieldType("varFieldT1", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "paramT2", "Foo<Bar<? extends Baz>>")
+            invocation.assertParamType(
+                "method",
+                "paramT2",
+                "Foo<Bar<? extends Baz>>",
+                "Foo<Bar<out Baz>>"
+            )
             invocation.assertReturnType("methodReturn", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT1", "Foo<Bar<Baz>>")
 
@@ -712,14 +895,29 @@
             if (invocation.isKsp) {
                 invocation.assertFieldType("valFieldT2", "Foo<Bar<Baz>>")
                 invocation.assertFieldType("varFieldT2", "Foo<Bar<Baz>>")
-                invocation.assertParamType("method", "param", "Foo<Bar<? extends Baz>>")
-                invocation.assertParamType("method", "paramT1", "Foo<Bar<? extends Baz>>")
+                invocation.assertParamType(
+                    "method",
+                    "param",
+                    "Foo<Bar<? extends Baz>>",
+                    "Foo<Bar<out Baz>>"
+                )
+                invocation.assertParamType(
+                    "method",
+                    "paramT1",
+                    "Foo<Bar<? extends Baz>>",
+                    "Foo<Bar<out Baz>>"
+                )
                 invocation.assertReturnType("methodReturnT2", "Foo<Bar<Baz>>")
             } else {
                 invocation.assertFieldType("valFieldT2", "Foo<Bar<? extends Baz>>")
                 invocation.assertFieldType("varFieldT2", "Foo<Bar<? extends Baz>>")
-                invocation.assertParamType("method", "param", "Foo<Bar<Baz>>")
-                invocation.assertParamType("method", "paramT1", "Foo<Bar<Baz>>")
+                invocation.assertParamType("method", "param", "Foo<Bar<Baz>>", "Foo<Bar<Baz>>")
+                invocation.assertParamType(
+                    "method",
+                    "paramT1",
+                    "Foo<Bar<Baz>>",
+                    "Foo<Bar<Baz>>"
+                )
                 invocation.assertReturnType("methodReturnT2", "Foo<Bar<? extends Baz>>")
             }
         }
@@ -758,8 +956,13 @@
             invocation.assertFieldType("valField", "Foo<Bar<Baz>>")
             invocation.assertFieldType("valFieldT1", "Foo<Bar<Baz>>")
             invocation.assertFieldType("varField", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "param", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "paramT2", "Foo<? extends Bar<? extends Baz>>")
+            invocation.assertParamType("method", "param", "Foo<Bar<Baz>>", "Foo<Bar<Baz>>")
+            invocation.assertParamType(
+                "method",
+                "paramT2",
+                "Foo<? extends Bar<? extends Baz>>",
+                "Foo<out Bar<out Baz>>"
+            )
             invocation.assertReturnType("methodReturn", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT1", "Foo<Bar<Baz>>")
 
@@ -768,14 +971,22 @@
                 invocation.assertFieldType("valFieldT2", "Foo<Bar<Baz>>")
                 invocation.assertFieldType("varFieldT1", "Foo<Bar<Baz>>")
                 invocation.assertFieldType("varFieldT2", "Foo<Bar<Baz>>")
-                invocation.assertParamType("method", "paramT1", "Foo<Bar<? extends Baz>>")
+                invocation.assertParamType(
+                    "method",
+                    "paramT1",
+                    "Foo<Bar<? extends Baz>>",
+                    "Foo<Bar<out Baz>>"
+                )
                 invocation.assertReturnType("methodReturnT2", "Foo<Bar<Baz>>")
             } else {
                 invocation.assertFieldType("valFieldT2", "Foo<Bar<? extends Baz>>")
                 invocation.assertFieldType("varFieldT1", "Foo<? extends Bar<? extends Baz>>")
                 invocation.assertFieldType("varFieldT2", "Foo<? extends Bar<? extends Baz>>")
                 invocation.assertParamType(
-                    "method", "paramT1", "Foo<? extends Bar<? extends Baz>>"
+                    "method",
+                    "paramT1",
+                    "Foo<? extends Bar<? extends Baz>>",
+                    "Foo<out Bar<out Baz>>"
                 )
                 invocation.assertReturnType("methodReturnT2", "Foo<Bar<? extends Baz>>")
             }
@@ -792,8 +1003,13 @@
             invocation.assertFieldType("valField", "Foo<Bar<Baz>>")
             invocation.assertFieldType("valFieldT1", "Foo<Bar<Baz>>")
             invocation.assertFieldType("varField", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "param", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "paramT2", "Foo<? extends Bar<? extends Baz>>")
+            invocation.assertParamType("method", "param", "Foo<Bar<Baz>>", "Foo<Bar<Baz>>")
+            invocation.assertParamType(
+                "method",
+                "paramT2",
+                "Foo<? extends Bar<? extends Baz>>",
+                "Foo<out Bar<out Baz>>"
+            )
             invocation.assertReturnType("methodReturn", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT1", "Foo<Bar<Baz>>")
 
@@ -803,7 +1019,7 @@
                 invocation.assertFieldType("varFieldT1", "Foo<Bar<Baz>>")
                 invocation.assertFieldType("varFieldT2", "Foo<Bar<Baz>>")
                 invocation.assertParamType(
-                    "method", "paramT1", "Foo<Bar<? extends Baz>>"
+                    "method", "paramT1", "Foo<Bar<? extends Baz>>", "Foo<Bar<out Baz>>"
                 )
                 invocation.assertReturnType("methodReturnT2", "Foo<Bar<Baz>>")
             } else {
@@ -811,7 +1027,10 @@
                 invocation.assertFieldType("varFieldT1", "Foo<? extends Bar<? extends Baz>>")
                 invocation.assertFieldType("varFieldT2", "Foo<? extends Bar<? extends Baz>>")
                 invocation.assertParamType(
-                    "method", "paramT1", "Foo<? extends Bar<? extends Baz>>"
+                    "method",
+                    "paramT1",
+                    "Foo<? extends Bar<? extends Baz>>",
+                    "Foo<out Bar<out Baz>>"
                 )
                 invocation.assertReturnType("methodReturnT2", "Foo<Bar<? extends Baz>>")
             }
@@ -828,9 +1047,24 @@
             invocation.assertFieldType("valField", "Foo<Bar<Baz>>")
             invocation.assertFieldType("valFieldT1", "Foo<Bar<Baz>>")
 
-            invocation.assertParamType("method", "param", "Foo<? extends Bar<Baz>>")
-            invocation.assertParamType("method", "paramT1", "Foo<? extends Bar<? extends Baz>>")
-            invocation.assertParamType("method", "paramT2", "Foo<? extends Bar<? extends Baz>>")
+            invocation.assertParamType(
+                "method",
+                "param",
+                "Foo<? extends Bar<Baz>>",
+                "Foo<out Bar<Baz>>"
+            )
+            invocation.assertParamType(
+                "method",
+                "paramT1",
+                "Foo<? extends Bar<? extends Baz>>",
+                "Foo<out Bar<out Baz>>"
+            )
+            invocation.assertParamType(
+                "method",
+                "paramT2",
+                "Foo<? extends Bar<? extends Baz>>",
+                "Foo<out Bar<out Baz>>"
+            )
 
             invocation.assertReturnType("methodReturn", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT1", "Foo<Bar<Baz>>")
@@ -863,7 +1097,12 @@
             invocation.assertFieldType("valFieldT1", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturn", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT1", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "paramT2", "Foo<? extends Bar<? extends Baz>>")
+            invocation.assertParamType(
+                "method",
+                "paramT2",
+                "Foo<? extends Bar<? extends Baz>>",
+                "Foo<out Bar<out Baz>>"
+            )
 
             // TODO(b/237280547): Make KSP type name match KAPT.
             if (invocation.isKsp) {
@@ -871,17 +1110,35 @@
                 invocation.assertFieldType("varField", "Foo<Bar<Baz>>")
                 invocation.assertFieldType("varFieldT1", "Foo<Bar<Baz>>")
                 invocation.assertFieldType("varFieldT2", "Foo<Bar<Baz>>")
-                invocation.assertParamType("method", "param", "Foo<Bar<? extends Baz>>")
-                invocation.assertParamType("method", "paramT1", "Foo<Bar<? extends Baz>>")
+                invocation.assertParamType(
+                    "method",
+                    "param",
+                    "Foo<Bar<? extends Baz>>",
+                    "Foo<Bar<out Baz>>"
+                )
+                invocation.assertParamType(
+                    "method",
+                    "paramT1",
+                    "Foo<Bar<? extends Baz>>",
+                    "Foo<Bar<out Baz>>"
+                )
                 invocation.assertReturnType("methodReturnT2", "Foo<Bar<Baz>>")
             } else {
                 invocation.assertFieldType("valFieldT2", "Foo<Bar<? extends Baz>>")
                 invocation.assertFieldType("varField", "Foo<? extends Bar<? extends Baz>>")
                 invocation.assertFieldType("varFieldT1", "Foo<? extends Bar<? extends Baz>>")
                 invocation.assertFieldType("varFieldT2", "Foo<? extends Bar<? extends Baz>>")
-                invocation.assertParamType("method", "param", "Foo<? extends Bar<? extends Baz>>")
                 invocation.assertParamType(
-                    "method", "paramT1", "Foo<? extends Bar<? extends Baz>>"
+                    "method",
+                    "param",
+                    "Foo<? extends Bar<? extends Baz>>",
+                    "Foo<out Bar<out Baz>>"
+                )
+                invocation.assertParamType(
+                    "method",
+                    "paramT1",
+                    "Foo<? extends Bar<? extends Baz>>",
+                    "Foo<out Bar<out Baz>>"
                 )
                 invocation.assertReturnType("methodReturnT2", "Foo<Bar<? extends Baz>>")
             }
@@ -897,9 +1154,24 @@
         ) { invocation ->
             invocation.assertFieldType("valField", "Foo<Bar<Baz>>")
             invocation.assertFieldType("valFieldT1", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "param", "Foo<? extends Bar<Baz>>")
-            invocation.assertParamType("method", "paramT1", "Foo<? extends Bar<? extends Baz>>")
-            invocation.assertParamType("method", "paramT2", "Foo<? extends Bar<? extends Baz>>")
+            invocation.assertParamType(
+                "method",
+                "param",
+                "Foo<? extends Bar<Baz>>",
+                "Foo<out Bar<Baz>>"
+            )
+            invocation.assertParamType(
+                "method",
+                "paramT1",
+                "Foo<? extends Bar<? extends Baz>>",
+                "Foo<out Bar<out Baz>>"
+            )
+            invocation.assertParamType(
+                "method",
+                "paramT2",
+                "Foo<? extends Bar<? extends Baz>>",
+                "Foo<out Bar<out Baz>>"
+            )
             invocation.assertReturnType("methodReturn", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT1", "Foo<Bar<Baz>>")
 
@@ -929,7 +1201,12 @@
         ) { invocation ->
             invocation.assertFieldType("valField", "Foo<Bar<Baz>>")
             invocation.assertFieldType("valFieldT1", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "paramT2", "Foo<? extends Bar<? extends Baz>>")
+            invocation.assertParamType(
+                "method",
+                "paramT2",
+                "Foo<? extends Bar<? extends Baz>>",
+                "Foo<out Bar<out Baz>>"
+            )
             invocation.assertReturnType("methodReturn", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT1", "Foo<Bar<Baz>>")
 
@@ -939,16 +1216,36 @@
                 invocation.assertFieldType("varField", "Foo<Bar<Baz>>")
                 invocation.assertFieldType("varFieldT1", "Foo<Bar<Baz>>")
                 invocation.assertFieldType("varFieldT2", "Foo<Bar<Baz>>")
-                invocation.assertParamType("method", "param", "Foo<Bar<? extends Baz>>")
-                invocation.assertParamType("method", "paramT1", "Foo<Bar<? extends Baz>>")
+                invocation.assertParamType(
+                    "method",
+                    "param",
+                    "Foo<Bar<? extends Baz>>",
+                    "Foo<Bar<out Baz>>"
+                )
+                invocation.assertParamType(
+                    "method",
+                    "paramT1",
+                    "Foo<Bar<? extends Baz>>",
+                    "Foo<Bar<out Baz>>"
+                )
                 invocation.assertReturnType("methodReturnT2", "Foo<Bar<Baz>>")
             } else {
                 invocation.assertFieldType("valFieldT2", "Foo<Bar<? extends Baz>>")
                 invocation.assertFieldType("varField", "Foo<? extends Bar<? extends Baz>>")
                 invocation.assertFieldType("varFieldT1", "Foo<? extends Bar<? extends Baz>>")
                 invocation.assertFieldType("varFieldT2", "Foo<? extends Bar<? extends Baz>>")
-                invocation.assertParamType("method", "param", "Foo<? extends Bar<? extends Baz>>")
-                invocation.assertParamType("method", "paramT1", "Foo<? extends Bar<? extends Baz>>")
+                invocation.assertParamType(
+                    "method",
+                    "param",
+                    "Foo<? extends Bar<? extends Baz>>",
+                    "Foo<out Bar<out Baz>>"
+                )
+                invocation.assertParamType(
+                    "method",
+                    "paramT1",
+                    "Foo<? extends Bar<? extends Baz>>",
+                    "Foo<out Bar<out Baz>>"
+                )
                 invocation.assertReturnType("methodReturnT2", "Foo<Bar<? extends Baz>>")
             }
         }
@@ -963,9 +1260,24 @@
         ) { invocation ->
             invocation.assertFieldType("valField", "Foo<Bar<Baz>>")
             invocation.assertFieldType("valFieldT1", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "param", "Foo<? extends Bar<? extends Baz>>")
-            invocation.assertParamType("method", "paramT1", "Foo<? extends Bar<? extends Baz>>")
-            invocation.assertParamType("method", "paramT2", "Foo<? extends Bar<? extends Baz>>")
+            invocation.assertParamType(
+                "method",
+                "param",
+                "Foo<? extends Bar<? extends Baz>>",
+                "Foo<out Bar<out Baz>>"
+            )
+            invocation.assertParamType(
+                "method",
+                "paramT1",
+                "Foo<? extends Bar<? extends Baz>>",
+                "Foo<out Bar<out Baz>>"
+            )
+            invocation.assertParamType(
+                "method",
+                "paramT2",
+                "Foo<? extends Bar<? extends Baz>>",
+                "Foo<out Bar<out Baz>>"
+            )
             invocation.assertReturnType("methodReturn", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT1", "Foo<Bar<Baz>>")
 
@@ -995,9 +1307,24 @@
         ) { invocation ->
             invocation.assertFieldType("valField", "Foo<Bar<Baz>>")
             invocation.assertFieldType("valFieldT1", "Foo<Bar<Baz>>")
-            invocation.assertParamType("method", "param", "Foo<? extends Bar<? extends Baz>>")
-            invocation.assertParamType("method", "paramT1", "Foo<? extends Bar<? extends Baz>>")
-            invocation.assertParamType("method", "paramT2", "Foo<? extends Bar<? extends Baz>>")
+            invocation.assertParamType(
+                "method",
+                "param",
+                "Foo<? extends Bar<? extends Baz>>",
+                "Foo<out Bar<out Baz>>"
+            )
+            invocation.assertParamType(
+                "method",
+                "paramT1",
+                "Foo<? extends Bar<? extends Baz>>",
+                "Foo<out Bar<out Baz>>"
+            )
+            invocation.assertParamType(
+                "method",
+                "paramT2",
+                "Foo<? extends Bar<? extends Baz>>",
+                "Foo<out Bar<out Baz>>"
+            )
             invocation.assertReturnType("methodReturn", "Foo<Bar<Baz>>")
             invocation.assertReturnType("methodReturnT1", "Foo<Bar<Baz>>")
 
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XAnnotationBoxTest.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XAnnotationBoxTest.kt
index c86cdc4..ad37a87 100644
--- a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XAnnotationBoxTest.kt
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XAnnotationBoxTest.kt
@@ -16,6 +16,8 @@
 
 package androidx.room.compiler.processing
 
+import androidx.room.compiler.codegen.XTypeName
+import androidx.room.compiler.codegen.asClassName
 import androidx.room.compiler.processing.testcode.JavaAnnotationWithDefaults
 import androidx.room.compiler.processing.testcode.JavaAnnotationWithEnum
 import androidx.room.compiler.processing.testcode.JavaAnnotationWithEnumArray
@@ -41,7 +43,6 @@
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
-import java.util.LinkedHashMap
 
 @RunWith(Parameterized::class)
 class XAnnotationBoxTest(
@@ -243,11 +244,11 @@
             element.getAnnotation(MainAnnotation::class)!!.let { annotation ->
                 assertThat(
                     annotation.getAsTypeList("typeList").map {
-                        it.typeName
+                        it.asTypeName()
                     }
                 ).containsExactly(
-                    String::class.typeName(),
-                    Int::class.typeName()
+                    String::class.asClassName(),
+                    XTypeName.PRIMITIVE_INT
                 )
                 assertThat(
                     annotation.getAsType("singleType")
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XAnnotationTest.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XAnnotationTest.kt
index cd8ddde..889a878 100644
--- a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XAnnotationTest.kt
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XAnnotationTest.kt
@@ -16,6 +16,8 @@
 
 package androidx.room.compiler.processing
 
+import androidx.room.compiler.codegen.XTypeName
+import androidx.room.compiler.codegen.asClassName
 import androidx.room.compiler.processing.compat.XConverters.toJavac
 import androidx.room.compiler.processing.testcode.JavaAnnotationWithDefaults
 import androidx.room.compiler.processing.testcode.JavaAnnotationWithEnum
@@ -29,17 +31,18 @@
 import androidx.room.compiler.processing.testcode.TestSuppressWarnings
 import androidx.room.compiler.processing.util.Source
 import androidx.room.compiler.processing.util.XTestInvocation
+import androidx.room.compiler.processing.util.asJTypeName
+import androidx.room.compiler.processing.util.asKTypeName
 import androidx.room.compiler.processing.util.compileFiles
 import androidx.room.compiler.processing.util.getField
 import androidx.room.compiler.processing.util.getMethodByJvmName
 import androidx.room.compiler.processing.util.getParameter
 import androidx.room.compiler.processing.util.runProcessorTest
 import androidx.room.compiler.processing.util.runProcessorTestWithoutKsp
-import androidx.room.compiler.processing.util.typeName
 import com.google.common.truth.Truth.assertThat
 import com.google.common.truth.Truth.assertWithMessage
-import com.squareup.javapoet.AnnotationSpec
-import com.squareup.javapoet.ClassName
+import com.squareup.kotlinpoet.javapoet.JAnnotationSpec
+import com.squareup.kotlinpoet.javapoet.JClassName
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
@@ -136,10 +139,10 @@
         ) { invocation ->
             val element = invocation.processingEnv.requireTypeElement("test.MyClass")
             val annotation =
-                element.requireAnnotation(ClassName.get(TestSuppressWarnings::class.java))
+                element.requireAnnotation(JClassName.get(TestSuppressWarnings::class.java))
             if (!invocation.isKsp) {
                 assertThat(annotation.toAnnotationSpec())
-                    .isEqualTo(AnnotationSpec.get(annotation.toJavac()))
+                    .isEqualTo(JAnnotationSpec.get(annotation.toJavac()))
             }
         }
     }
@@ -188,7 +191,8 @@
 
             annotationsForAnnotations.forEach {
                 val annotations = element.getAnnotationsAnnotatedWith(
-                    ClassName.get("foo.bar", it))
+                    JClassName.get("foo.bar", it)
+                )
                 assertThat(annotations).hasSize(1)
                 val annotation = annotations.first()
                 assertThat(annotation.name)
@@ -273,7 +277,7 @@
         ) { invocation ->
             val element = invocation.processingEnv.requireTypeElement("foo.bar.Baz")
             val annotation =
-                element.requireAnnotation(ClassName.get(TestSuppressWarnings::class.java))
+                element.requireAnnotation(JClassName.get(TestSuppressWarnings::class.java))
 
             val argument = annotation.getAnnotationValue("value")
             assertThat(argument.name).isEqualTo("value")
@@ -404,16 +408,16 @@
 
             assertThat(
                 annotation.get<List<XType>>("typeList").map {
-                    it.typeName
+                    it.asTypeName()
                 }
             ).containsExactly(
-                String::class.typeName(),
-                Int::class.typeName()
+                String::class.asClassName(),
+                XTypeName.PRIMITIVE_INT
             )
             assertThat(
                 annotation.get<XType>("singleType")
             ).isEqualTo(
-                invocation.processingEnv.requireType(Long::class.typeName())
+                invocation.processingEnv.requireType(Long::class)
             )
 
             assertThat(annotation.get<Int>("intMethod")).isEqualTo(3)
@@ -451,8 +455,8 @@
             val subject = invocation.processingEnv.requireTypeElement("Subject")
             val annotation = subject.requireAnnotation<JavaAnnotationWithTypeReferences>()
             val annotationValue = annotation.get<List<XType>>("value").single()
-            assertThat(annotationValue.typeName).isEqualTo(
-                ClassName.get(String::class.java)
+            assertThat(annotationValue.asTypeName().java).isEqualTo(
+                String::class.asJTypeName()
             )
         }
     }
@@ -614,17 +618,27 @@
                     assertThat(annotation.get<String>("stringVal"))
                         .isEqualTo("foo")
                     assertThat(
-                        annotation.getAsType("typeVal").rawType.typeName
-                    ).isEqualTo(
-                        ClassName.get(HashMap::class.java)
-                    )
+                        annotation.getAsType("typeVal").rawType.asTypeName().java
+                    ).isEqualTo(HashMap::class.asJTypeName())
                     assertThat(
                         annotation.getAsTypeList("typeArrayVal").map {
-                            it.rawType.typeName
+                            it.rawType.asTypeName().java
                         }
                     ).isEqualTo(
-                        listOf(ClassName.get(LinkedHashMap::class.java))
+                        listOf(LinkedHashMap::class.asJTypeName())
                     )
+                    if (invocation.isKsp) {
+                        assertThat(
+                            annotation.getAsType("typeVal").rawType.asTypeName().kotlin
+                        ).isEqualTo(HashMap::class.asKTypeName())
+                        assertThat(
+                            annotation.getAsTypeList("typeArrayVal").map {
+                                it.rawType.asTypeName().kotlin
+                            }
+                        ).isEqualTo(
+                            listOf(LinkedHashMap::class.asKTypeName())
+                        )
+                    }
 
                     val enumValueEntry = annotation.getAsEnum("enumVal")
                     assertThat(enumValueEntry.name).isEqualTo("DEFAULT")
@@ -676,7 +690,7 @@
         val kotlinSrc = Source.kotlin(
             "KotlinSubject.kt",
             """
-            import androidx.room.compiler.processing.testcode.*;
+            import androidx.room.compiler.processing.testcode.*
             class KotlinSubject {
                 @JavaAnnotationWithPrimitiveArray(intArray = [1, 2, 3])
                 val annotated1:Any = TODO()
@@ -715,7 +729,7 @@
         val kotlinSrc = Source.kotlin(
             "KotlinSubject.kt",
             """
-            import androidx.room.compiler.processing.testcode.*;
+            import androidx.room.compiler.processing.testcode.*
             class KotlinSubject {
                 @JavaAnnotationWithEnum(JavaEnum.VAL1)
                 val annotated1: Any = TODO()
@@ -938,7 +952,7 @@
         ) { invocation ->
             val element = invocation.processingEnv.requireTypeElement("foo.bar.Baz")
             val annotation =
-                element.requireAnnotation(ClassName.get(JavaAnnotationWithDefaults::class.java))
+                element.requireAnnotation(JClassName.get(JavaAnnotationWithDefaults::class.java))
 
             assertThat(annotation.get<String>("stringVal")).isEqualTo("test")
             assertThat(annotation.get<Int>("intVal")).isEqualTo(3)
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XAnnotationValueTest.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XAnnotationValueTest.kt
index 3a55b34..8393b02 100644
--- a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XAnnotationValueTest.kt
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XAnnotationValueTest.kt
@@ -16,16 +16,38 @@
 
 package androidx.room.compiler.processing
 
+import androidx.room.compiler.codegen.JArrayTypeName
 import androidx.room.compiler.processing.util.Source
 import androidx.room.compiler.processing.util.XTestInvocation
+import androidx.room.compiler.processing.util.asJClassName
+import androidx.room.compiler.processing.util.asKClassName
 import androidx.room.compiler.processing.util.compileFiles
 import androidx.room.compiler.processing.util.runProcessorTest
 import com.google.common.truth.Truth.assertThat
-import com.squareup.javapoet.ArrayTypeName
-import com.squareup.javapoet.ClassName
-import com.squareup.javapoet.ParameterizedTypeName
-import com.squareup.javapoet.TypeName
-import com.squareup.javapoet.WildcardTypeName
+import com.squareup.kotlinpoet.ARRAY
+import com.squareup.kotlinpoet.BOOLEAN
+import com.squareup.kotlinpoet.BOOLEAN_ARRAY
+import com.squareup.kotlinpoet.BYTE
+import com.squareup.kotlinpoet.BYTE_ARRAY
+import com.squareup.kotlinpoet.CHAR
+import com.squareup.kotlinpoet.CHAR_ARRAY
+import com.squareup.kotlinpoet.DOUBLE
+import com.squareup.kotlinpoet.DOUBLE_ARRAY
+import com.squareup.kotlinpoet.FLOAT
+import com.squareup.kotlinpoet.FLOAT_ARRAY
+import com.squareup.kotlinpoet.INT
+import com.squareup.kotlinpoet.INT_ARRAY
+import com.squareup.kotlinpoet.LONG
+import com.squareup.kotlinpoet.LONG_ARRAY
+import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy
+import com.squareup.kotlinpoet.SHORT
+import com.squareup.kotlinpoet.SHORT_ARRAY
+import com.squareup.kotlinpoet.STAR
+import com.squareup.kotlinpoet.javapoet.JClassName
+import com.squareup.kotlinpoet.javapoet.JParameterizedTypeName
+import com.squareup.kotlinpoet.javapoet.JTypeName
+import com.squareup.kotlinpoet.javapoet.JWildcardTypeName
+import com.squareup.kotlinpoet.javapoet.KClassName
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.Parameterized
@@ -113,14 +135,21 @@
             ) as Source.KotlinSource
         ) { invocation ->
             fun checkSingleValue(annotationValue: XAnnotationValue, expectedValue: Boolean) {
-                assertThat(annotationValue.valueType.typeName).isEqualTo(TypeName.BOOLEAN)
+                assertThat(annotationValue.valueType.asTypeName().java).isEqualTo(JTypeName.BOOLEAN)
+                if (invocation.isKsp) {
+                    assertThat(annotationValue.valueType.asTypeName().kotlin).isEqualTo(BOOLEAN)
+                }
                 assertThat(annotationValue.hasBooleanValue()).isTrue()
                 assertThat(annotationValue.asBoolean()).isEqualTo(expectedValue)
             }
 
             fun checkListValues(annotationValue: XAnnotationValue, vararg expectedValues: Boolean) {
-                assertThat(annotationValue.valueType.typeName)
-                    .isEqualTo(ArrayTypeName.of(TypeName.BOOLEAN))
+                assertThat(annotationValue.valueType.asTypeName().java)
+                    .isEqualTo(JArrayTypeName.of(JTypeName.BOOLEAN))
+                if (invocation.isKsp) {
+                    assertThat(annotationValue.valueType.asTypeName().kotlin)
+                        .isEqualTo(BOOLEAN_ARRAY)
+                }
                 assertThat(annotationValue.hasBooleanListValue()).isTrue()
                 // Check the list of values
                 assertThat(annotationValue.asBooleanList())
@@ -196,14 +225,21 @@
             ) as Source.KotlinSource
         ) { invocation ->
             fun checkSingleValue(annotationValue: XAnnotationValue, expectedValue: Int) {
-                assertThat(annotationValue.valueType.typeName).isEqualTo(TypeName.INT)
+                assertThat(annotationValue.valueType.asTypeName().java).isEqualTo(JTypeName.INT)
+                if (invocation.isKsp) {
+                    assertThat(annotationValue.valueType.asTypeName().kotlin).isEqualTo(INT)
+                }
                 assertThat(annotationValue.hasIntValue()).isTrue()
                 assertThat(annotationValue.asInt()).isEqualTo(expectedValue)
             }
 
             fun checkListValues(annotationValue: XAnnotationValue, vararg expectedValues: Int) {
-                assertThat(annotationValue.valueType.typeName)
-                    .isEqualTo(ArrayTypeName.of(TypeName.INT))
+                assertThat(annotationValue.valueType.asTypeName().java)
+                    .isEqualTo(JArrayTypeName.of(JTypeName.INT))
+                if (invocation.isKsp) {
+                    assertThat(annotationValue.valueType.asTypeName().kotlin)
+                        .isEqualTo(INT_ARRAY)
+                }
                 assertThat(annotationValue.hasIntListValue()).isTrue()
                 // Check the list of values
                 assertThat(annotationValue.asIntList())
@@ -279,14 +315,21 @@
             ) as Source.KotlinSource
         ) { invocation ->
             fun checkSingleValue(annotationValue: XAnnotationValue, expectedValue: Short) {
-                assertThat(annotationValue.valueType.typeName).isEqualTo(TypeName.SHORT)
+                assertThat(annotationValue.valueType.asTypeName().java).isEqualTo(JTypeName.SHORT)
+                if (invocation.isKsp) {
+                    assertThat(annotationValue.valueType.asTypeName().kotlin).isEqualTo(SHORT)
+                }
                 assertThat(annotationValue.hasShortValue()).isTrue()
                 assertThat(annotationValue.asShort()).isEqualTo(expectedValue)
             }
 
             fun checkListValues(annotationValue: XAnnotationValue, vararg expectedValues: Short) {
-                assertThat(annotationValue.valueType.typeName)
-                    .isEqualTo(ArrayTypeName.of(TypeName.SHORT))
+                assertThat(annotationValue.valueType.asTypeName().java)
+                    .isEqualTo(JArrayTypeName.of(JTypeName.SHORT))
+                if (invocation.isKsp) {
+                    assertThat(annotationValue.valueType.asTypeName().kotlin)
+                        .isEqualTo(SHORT_ARRAY)
+                }
                 assertThat(annotationValue.hasShortListValue()).isTrue()
                 // Check the list of values
                 assertThat(annotationValue.asShortList())
@@ -362,14 +405,21 @@
             ) as Source.KotlinSource
         ) { invocation ->
             fun checkSingleValue(annotationValue: XAnnotationValue, expectedValue: Long) {
-                assertThat(annotationValue.valueType.typeName).isEqualTo(TypeName.LONG)
+                assertThat(annotationValue.valueType.asTypeName().java).isEqualTo(JTypeName.LONG)
+                if (invocation.isKsp) {
+                    assertThat(annotationValue.valueType.asTypeName().kotlin).isEqualTo(LONG)
+                }
                 assertThat(annotationValue.hasLongValue()).isTrue()
                 assertThat(annotationValue.asLong()).isEqualTo(expectedValue)
             }
 
             fun checkListValues(annotationValue: XAnnotationValue, vararg expectedValues: Long) {
-                assertThat(annotationValue.valueType.typeName)
-                    .isEqualTo(ArrayTypeName.of(TypeName.LONG))
+                assertThat(annotationValue.valueType.asTypeName().java)
+                    .isEqualTo(JArrayTypeName.of(JTypeName.LONG))
+                if (invocation.isKsp) {
+                    assertThat(annotationValue.valueType.asTypeName().kotlin)
+                        .isEqualTo(LONG_ARRAY)
+                }
                 assertThat(annotationValue.hasLongListValue()).isTrue()
                 // Check the list of values
                 assertThat(annotationValue.asLongList())
@@ -445,14 +495,21 @@
             ) as Source.KotlinSource
         ) { invocation ->
             fun checkSingleValue(annotationValue: XAnnotationValue, expectedValue: Float) {
-                assertThat(annotationValue.valueType.typeName).isEqualTo(TypeName.FLOAT)
+                assertThat(annotationValue.valueType.asTypeName().java).isEqualTo(JTypeName.FLOAT)
+                if (invocation.isKsp) {
+                    assertThat(annotationValue.valueType.asTypeName().kotlin).isEqualTo(FLOAT)
+                }
                 assertThat(annotationValue.hasFloatValue()).isTrue()
                 assertThat(annotationValue.asFloat()).isEqualTo(expectedValue)
             }
 
             fun checkListValues(annotationValue: XAnnotationValue, vararg expectedValues: Float) {
-                assertThat(annotationValue.valueType.typeName)
-                    .isEqualTo(ArrayTypeName.of(TypeName.FLOAT))
+                assertThat(annotationValue.valueType.asTypeName().java)
+                    .isEqualTo(JArrayTypeName.of(JTypeName.FLOAT))
+                if (invocation.isKsp) {
+                    assertThat(annotationValue.valueType.asTypeName().kotlin)
+                        .isEqualTo(FLOAT_ARRAY)
+                }
                 assertThat(annotationValue.hasFloatListValue()).isTrue()
                 // Check the list of values
                 assertThat(annotationValue.asFloatList())
@@ -528,14 +585,21 @@
             ) as Source.KotlinSource
         ) { invocation ->
             fun checkSingleValue(annotationValue: XAnnotationValue, expectedValue: Double) {
-                assertThat(annotationValue.valueType.typeName).isEqualTo(TypeName.DOUBLE)
+                assertThat(annotationValue.valueType.asTypeName().java).isEqualTo(JTypeName.DOUBLE)
+                if (invocation.isKsp) {
+                    assertThat(annotationValue.valueType.asTypeName().kotlin).isEqualTo(DOUBLE)
+                }
                 assertThat(annotationValue.hasDoubleValue()).isTrue()
                 assertThat(annotationValue.asDouble()).isEqualTo(expectedValue)
             }
 
             fun checkListValues(annotationValue: XAnnotationValue, vararg expectedValues: Double) {
-                assertThat(annotationValue.valueType.typeName)
-                    .isEqualTo(ArrayTypeName.of(TypeName.DOUBLE))
+                assertThat(annotationValue.valueType.asTypeName().java)
+                    .isEqualTo(JArrayTypeName.of(JTypeName.DOUBLE))
+                if (invocation.isKsp) {
+                    assertThat(annotationValue.valueType.asTypeName().kotlin)
+                        .isEqualTo(DOUBLE_ARRAY)
+                }
                 assertThat(annotationValue.hasDoubleListValue()).isTrue()
                 // Check the list of values
                 assertThat(annotationValue.asDoubleList())
@@ -611,14 +675,21 @@
             ) as Source.KotlinSource
         ) { invocation ->
             fun checkSingleValue(annotationValue: XAnnotationValue, expectedValue: Byte) {
-                assertThat(annotationValue.valueType.typeName).isEqualTo(TypeName.BYTE)
+                assertThat(annotationValue.valueType.asTypeName().java).isEqualTo(JTypeName.BYTE)
+                if (invocation.isKsp) {
+                    assertThat(annotationValue.valueType.asTypeName().kotlin).isEqualTo(BYTE)
+                }
                 assertThat(annotationValue.hasByteValue()).isTrue()
                 assertThat(annotationValue.asByte()).isEqualTo(expectedValue)
             }
 
             fun checkListValues(annotationValue: XAnnotationValue, vararg expectedValues: Byte) {
-                assertThat(annotationValue.valueType.typeName)
-                    .isEqualTo(ArrayTypeName.of(TypeName.BYTE))
+                assertThat(annotationValue.valueType.asTypeName().java)
+                    .isEqualTo(JArrayTypeName.of(JTypeName.BYTE))
+                if (invocation.isKsp) {
+                    assertThat(annotationValue.valueType.asTypeName().kotlin)
+                        .isEqualTo(BYTE_ARRAY)
+                }
                 assertThat(annotationValue.hasByteListValue()).isTrue()
                 // Check the list of values
                 assertThat(annotationValue.asByteList())
@@ -694,14 +765,21 @@
             ) as Source.KotlinSource
         ) { invocation ->
             fun checkSingleValue(annotationValue: XAnnotationValue, expectedValue: Char) {
-                assertThat(annotationValue.valueType.typeName).isEqualTo(TypeName.CHAR)
+                assertThat(annotationValue.valueType.asTypeName().java).isEqualTo(JTypeName.CHAR)
+                if (invocation.isKsp) {
+                    assertThat(annotationValue.valueType.asTypeName().kotlin).isEqualTo(CHAR)
+                }
                 assertThat(annotationValue.hasCharValue()).isTrue()
                 assertThat(annotationValue.asChar()).isEqualTo(expectedValue)
             }
 
             fun checkListValues(annotationValue: XAnnotationValue, vararg expectedValues: Char) {
-                assertThat(annotationValue.valueType.typeName)
-                    .isEqualTo(ArrayTypeName.of(TypeName.CHAR))
+                assertThat(annotationValue.valueType.asTypeName().java)
+                    .isEqualTo(JArrayTypeName.of(JTypeName.CHAR))
+                if (invocation.isKsp) {
+                    assertThat(annotationValue.valueType.asTypeName().kotlin)
+                        .isEqualTo(CHAR_ARRAY)
+                }
                 assertThat(annotationValue.hasCharListValue()).isTrue()
                 // Check the list of values
                 assertThat(annotationValue.asCharList())
@@ -776,17 +854,24 @@
                 """.trimIndent()
             ) as Source.KotlinSource
         ) { invocation ->
-            val stringTypeName = TypeName.get(String::class.java)
-
             fun checkSingleValue(annotationValue: XAnnotationValue, expectedValue: String) {
-                assertThat(annotationValue.valueType.typeName).isEqualTo(stringTypeName)
+                assertThat(annotationValue.valueType.asTypeName().java)
+                    .isEqualTo(String::class.asJClassName())
+                if (invocation.isKsp) {
+                    assertThat(annotationValue.valueType.asTypeName().kotlin)
+                        .isEqualTo(String::class.asKClassName())
+                }
                 assertThat(annotationValue.hasStringValue()).isTrue()
                 assertThat(annotationValue.asString()).isEqualTo(expectedValue)
             }
 
             fun checkListValues(annotationValue: XAnnotationValue, vararg expectedValues: String) {
-                assertThat(annotationValue.valueType.typeName)
-                    .isEqualTo(ArrayTypeName.of(stringTypeName))
+                assertThat(annotationValue.valueType.asTypeName().java)
+                    .isEqualTo(JArrayTypeName.of(String::class.asJClassName()))
+                if (invocation.isKsp) {
+                    assertThat(annotationValue.valueType.asTypeName().kotlin)
+                        .isEqualTo(ARRAY.parameterizedBy(String::class.asKClassName()))
+                }
                 assertThat(annotationValue.hasStringListValue()).isTrue()
                 // Check the list of values
                 assertThat(annotationValue.asStringList())
@@ -863,17 +948,27 @@
                 """.trimIndent()
             ) as Source.KotlinSource
         ) { invocation ->
-            val myEnumTypeName = ClassName.get("", "test.MyEnum")
+            val myEnumJTypeName = JClassName.get("", "test.MyEnum")
+            val myEnumKTypeName = KClassName("", "test.MyEnum")
 
             fun checkSingleValue(annotationValue: XAnnotationValue, expectedValue: String) {
-                assertThat(annotationValue.valueType.typeName).isEqualTo(myEnumTypeName)
+                assertThat(annotationValue.valueType.asTypeName().java)
+                    .isEqualTo(myEnumJTypeName)
+                if (invocation.isKsp) {
+                    assertThat(annotationValue.valueType.asTypeName().kotlin)
+                        .isEqualTo(myEnumKTypeName)
+                }
                 assertThat(annotationValue.hasEnumValue()).isTrue()
                 assertThat(annotationValue.asEnum().name).isEqualTo(expectedValue)
             }
 
             fun checkListValues(annotationValue: XAnnotationValue, vararg expectedValues: String) {
-                assertThat(annotationValue.valueType.typeName)
-                    .isEqualTo(ArrayTypeName.of(myEnumTypeName))
+                assertThat(annotationValue.valueType.asTypeName().java)
+                    .isEqualTo(JArrayTypeName.of(myEnumJTypeName))
+                if (invocation.isKsp) {
+                    assertThat(annotationValue.valueType.asTypeName().kotlin)
+                        .isEqualTo(ARRAY.parameterizedBy(myEnumKTypeName))
+                }
                 assertThat(annotationValue.hasEnumListValue()).isTrue()
                 // Check the list of values
                 assertThat(annotationValue.asEnumList().map { it.name })
@@ -953,20 +1048,25 @@
                 """.trimIndent()
             ) as Source.KotlinSource
         ) { invocation ->
-            val classTypeName = ParameterizedTypeName.get(
-                ClassName.get(Class::class.java),
-                WildcardTypeName.subtypeOf(TypeName.OBJECT)
+            val classJTypeName = JParameterizedTypeName.get(
+                JClassName.get(Class::class.java),
+                JWildcardTypeName.subtypeOf(JTypeName.OBJECT)
             )
-            val kClassTypeName = ParameterizedTypeName.get(
-                ClassName.get(kotlin.reflect.KClass::class.java),
-                WildcardTypeName.subtypeOf(TypeName.OBJECT)
+            val kClassJTypeName = JParameterizedTypeName.get(
+                JClassName.get(kotlin.reflect.KClass::class.java),
+                JWildcardTypeName.subtypeOf(JTypeName.OBJECT)
             )
+            val kClassKTypeName = kotlin.reflect.KClass::class.asKClassName().parameterizedBy(STAR)
             fun checkSingleValue(annotationValue: XAnnotationValue, expectedValue: String) {
                 // TODO(bcorso): Consider making the value types match in this case.
                 if (!invocation.isKsp || (sourceKind == SourceKind.JAVA && !isPreCompiled)) {
-                    assertThat(annotationValue.valueType.typeName).isEqualTo(classTypeName)
+                    assertThat(annotationValue.valueType.asTypeName().java)
+                        .isEqualTo(classJTypeName)
                 } else {
-                    assertThat(annotationValue.valueType.typeName).isEqualTo(kClassTypeName)
+                    assertThat(annotationValue.valueType.asTypeName().java)
+                        .isEqualTo(kClassJTypeName)
+                    assertThat(annotationValue.valueType.asTypeName().kotlin)
+                        .isEqualTo(kClassKTypeName)
                 }
                 assertThat(annotationValue.hasTypeValue()).isTrue()
                 assertThat(annotationValue.asType().typeElement?.name).isEqualTo(expectedValue)
@@ -975,11 +1075,13 @@
             fun checkListValues(annotationValue: XAnnotationValue, vararg expectedValues: String) {
                 // TODO(bcorso): Consider making the value types match in this case.
                 if (!invocation.isKsp || (sourceKind == SourceKind.JAVA && !isPreCompiled)) {
-                    assertThat(annotationValue.valueType.typeName)
-                        .isEqualTo(ArrayTypeName.of(classTypeName))
+                    assertThat(annotationValue.valueType.asTypeName().java)
+                        .isEqualTo(JArrayTypeName.of(classJTypeName))
                 } else {
-                    assertThat(annotationValue.valueType.typeName)
-                        .isEqualTo(ArrayTypeName.of(kClassTypeName))
+                    assertThat(annotationValue.valueType.asTypeName().java)
+                        .isEqualTo(JArrayTypeName.of(kClassJTypeName))
+                    assertThat(annotationValue.valueType.asTypeName().kotlin)
+                        .isEqualTo(ARRAY.parameterizedBy(kClassKTypeName))
                 }
                 assertThat(annotationValue.hasTypeListValue()).isTrue()
                 // Check the list of values
@@ -1059,18 +1161,28 @@
                 """.trimIndent()
             ) as Source.KotlinSource
         ) { invocation ->
-            val aTypeName = ClassName.get("", "test.A")
+            val aJTypeName = JClassName.get("", "test.A")
+            val aKTypeName = KClassName("", "test.A")
 
             fun checkSingleValue(annotationValue: XAnnotationValue, expectedValue: String) {
-                assertThat(annotationValue.valueType.typeName).isEqualTo(aTypeName)
+                assertThat(annotationValue.valueType.asTypeName().java)
+                    .isEqualTo(aJTypeName)
+                if (invocation.isKsp) {
+                    assertThat(annotationValue.valueType.asTypeName().kotlin)
+                        .isEqualTo(aKTypeName)
+                }
                 assertThat(annotationValue.hasAnnotationValue()).isTrue()
                 assertThat(annotationValue.asAnnotation().getAsString("value"))
                     .isEqualTo(expectedValue)
             }
 
             fun checkListValues(annotationValue: XAnnotationValue, vararg expectedValues: String) {
-                assertThat(annotationValue.valueType.typeName)
-                    .isEqualTo(ArrayTypeName.of(aTypeName))
+                assertThat(annotationValue.valueType.asTypeName().java)
+                    .isEqualTo(JArrayTypeName.of(aJTypeName))
+                if (invocation.isKsp) {
+                    assertThat(annotationValue.valueType.asTypeName().kotlin)
+                        .isEqualTo(ARRAY.parameterizedBy(aKTypeName))
+                }
                 assertThat(annotationValue.hasAnnotationListValue()).isTrue()
                 // Check the list of values
                 assertThat(annotationValue.asAnnotationList().map { it.getAsString("value") })
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XArrayTypeTest.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XArrayTypeTest.kt
index 1bbe125..96a2bc9 100644
--- a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XArrayTypeTest.kt
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XArrayTypeTest.kt
@@ -16,18 +16,21 @@
 
 package androidx.room.compiler.processing
 
+import androidx.room.compiler.codegen.JArrayTypeName
 import androidx.room.compiler.processing.ksp.KspProcessingEnv
 import androidx.room.compiler.processing.ksp.createTypeReference
 import androidx.room.compiler.processing.util.Source
+import androidx.room.compiler.processing.util.asJTypeName
+import androidx.room.compiler.processing.util.asKTypeName
 import androidx.room.compiler.processing.util.getField
 import androidx.room.compiler.processing.util.kspResolver
 import androidx.room.compiler.processing.util.runKspTest
 import androidx.room.compiler.processing.util.runProcessorTest
-import androidx.room.compiler.processing.util.typeName
 import com.google.common.truth.Truth.assertThat
 import com.google.common.truth.Truth.assertWithMessage
-import com.squareup.javapoet.ArrayTypeName
-import com.squareup.javapoet.TypeName
+import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy
+import com.squareup.kotlinpoet.javapoet.JTypeName
+import com.squareup.kotlinpoet.javapoet.KTypeName
 import org.junit.Test
 
 class XArrayTypeTest {
@@ -50,12 +53,20 @@
                 .getField("param")
                 .type
             assertThat(type.isArray()).isTrue()
-            assertThat(type.typeName).isEqualTo(
-                ArrayTypeName.of(String::class.java)
+            assertThat(type.asTypeName().java).isEqualTo(
+                JArrayTypeName.of(String::class.java)
             )
+            if (invocation.isKsp) {
+                assertThat(type.asTypeName().kotlin).isEqualTo(
+                    com.squareup.kotlinpoet.ARRAY.parameterizedBy(String::class.asKTypeName())
+                )
+            }
             check(type.isArray())
             type.componentType.let { component ->
-                assertThat(component.typeName).isEqualTo(String::class.typeName())
+                assertThat(component.asTypeName().java).isEqualTo(String::class.asJTypeName())
+                if (invocation.isKsp) {
+                    assertThat(component.asTypeName().kotlin).isEqualTo(String::class.asKTypeName())
+                }
                 assertThat(component.nullability).isEqualTo(XNullability.UNKNOWN)
             }
         }
@@ -64,16 +75,30 @@
     @Test
     fun synthetic() {
         runProcessorTest {
-            val objArray = it.processingEnv.getArrayType(
-                TypeName.OBJECT
+            fun checkObjectArray(objArray: XArrayType) {
+                check(objArray.isArray())
+                assertThat(objArray.componentType.asTypeName().java)
+                    .isEqualTo(JTypeName.OBJECT)
+                assertThat(objArray.asTypeName().java).isEqualTo(
+                    JArrayTypeName.of(JTypeName.OBJECT)
+                )
+                if (it.isKsp) {
+                    assertThat(objArray.componentType.asTypeName().kotlin)
+                        .isEqualTo(com.squareup.kotlinpoet.ANY)
+                    assertThat(objArray.asTypeName().kotlin).isEqualTo(
+                        com.squareup.kotlinpoet.ARRAY.parameterizedBy(com.squareup.kotlinpoet.ANY)
+                    )
+                }
+            }
+            checkObjectArray(
+                it.processingEnv.getArrayType(it.processingEnv.requireType("java.lang.Object"))
             )
-            check(objArray.isArray())
-            assertThat(objArray.componentType.typeName).isEqualTo(
-                TypeName.OBJECT
-            )
-            assertThat(objArray.typeName).isEqualTo(
-                ArrayTypeName.of(TypeName.OBJECT)
-            )
+            if (it.isKsp) {
+                // javac can't resolve Any
+                checkObjectArray(
+                    it.processingEnv.getArrayType(it.processingEnv.requireType("kotlin.Any"))
+                )
+            }
         }
     }
 
@@ -93,25 +118,51 @@
             sources = listOf(source)
         ) { invocation ->
             val element = invocation.processingEnv.requireTypeElement("foo.bar.Baz")
-            val nonNull = element.getField("nonNull").type
-            val nullable = element.getField("nullable").type
-            listOf(nonNull, nullable).forEach {
-                assertThat(it.isArray()).isTrue()
-                assertThat(it.typeName).isEqualTo(
-                    ArrayTypeName.of(String::class.java)
+            element.getField("nonNull").type.let { nonNull ->
+                check(nonNull.isArray())
+                assertThat(nonNull.asTypeName().java).isEqualTo(
+                    JArrayTypeName.of(String::class.java)
                 )
+                if (invocation.isKsp) {
+                    assertThat(nonNull.asTypeName().kotlin).isEqualTo(
+                        com.squareup.kotlinpoet.ARRAY.parameterizedBy(String::class.asKTypeName())
+                    )
+                }
+                nonNull.componentType.let { component ->
+                    assertThat(component.asTypeName().java).isEqualTo(
+                        String::class.asJTypeName()
+                    )
+                    if (invocation.isKsp) {
+                        assertThat(component.asTypeName().kotlin).isEqualTo(
+                            String::class.asKTypeName()
+                        )
+                    }
+                    assertThat(component.nullability).isEqualTo(XNullability.NONNULL)
+                }
             }
-            check(nonNull.isArray())
-            nonNull.componentType.let { component ->
-                assertThat(component.typeName).isEqualTo(
-                    String::class.typeName()
+            element.getField("nullable").type.let { nullable ->
+                check(nullable.isArray())
+                assertThat(nullable.asTypeName().java).isEqualTo(
+                    JArrayTypeName.of(String::class.java)
                 )
-                assertThat(component.nullability).isEqualTo(XNullability.NONNULL)
-            }
-            check(nullable.isArray())
-            nullable.componentType.let { component ->
-                assertThat(component.typeName).isEqualTo(String::class.typeName())
-                assertThat(component.nullability).isEqualTo(XNullability.NULLABLE)
+                if (invocation.isKsp) {
+                    assertThat(nullable.asTypeName().kotlin).isEqualTo(
+                        com.squareup.kotlinpoet.ARRAY.parameterizedBy(
+                            String::class.asKTypeName().copy(nullable = true)
+                        )
+                    )
+                }
+                nullable.componentType.let { component ->
+                    assertThat(component.asTypeName().java).isEqualTo(
+                        String::class.asJTypeName()
+                    )
+                    if (invocation.isKsp) {
+                        assertThat(component.asTypeName().kotlin).isEqualTo(
+                            String::class.asKTypeName().copy(nullable = true)
+                        )
+                    }
+                    assertThat(component.nullability).isEqualTo(XNullability.NULLABLE)
+                }
             }
         }
     }
@@ -141,29 +192,119 @@
             }
             """.trimIndent()
         )
-        runProcessorTest(listOf(src)) {
-            val subject = it.processingEnv.requireTypeElement("Subject")
+        runProcessorTest(listOf(src)) { invocation ->
+            class Container(
+                val method: String,
+                val jTypeName: JTypeName,
+                val kTypeName: KTypeName
+            ) {
+                override fun equals(other: Any?): Boolean {
+                    if (this === other) return true
+                    if (javaClass != other?.javaClass) return false
+                    other as Container
+                    if (method != other.method) return false
+                    if (jTypeName != other.jTypeName) return false
+                    if (invocation.isKsp) {
+                        if (kTypeName != other.kTypeName) return false
+                    }
+                    return true
+                }
+                override fun hashCode(): Int {
+                    var result = method.hashCode()
+                    result = 31 * result + jTypeName.hashCode()
+                    if (invocation.isKsp) {
+                        result = 31 * result + kTypeName.hashCode()
+                    }
+                    return result
+                }
+            }
+
+            val subject = invocation.processingEnv.requireTypeElement("Subject")
             val types = subject.getAllFieldsIncludingPrivateSupers().map {
                 assertWithMessage(it.name).that(it.type.isArray()).isTrue()
-                it.name to it.type.typeName
+                Container(it.name, it.type.asTypeName().java, it.type.asTypeName().kotlin)
             }.toList()
             assertThat(types).containsExactly(
-                "primitiveBooleanArray" to ArrayTypeName.of(TypeName.BOOLEAN),
-                "primitiveByteArray" to ArrayTypeName.of(TypeName.BYTE),
-                "primitiveShortArray" to ArrayTypeName.of(TypeName.SHORT),
-                "primitiveIntArray" to ArrayTypeName.of(TypeName.INT),
-                "primitiveLongArray" to ArrayTypeName.of(TypeName.LONG),
-                "primitiveCharArray" to ArrayTypeName.of(TypeName.CHAR),
-                "primitiveFloatArray" to ArrayTypeName.of(TypeName.FLOAT),
-                "primitiveDoubleArray" to ArrayTypeName.of(TypeName.DOUBLE),
-                "boxedBooleanArray" to ArrayTypeName.of(TypeName.BOOLEAN.box()),
-                "boxedByteArray" to ArrayTypeName.of(TypeName.BYTE.box()),
-                "boxedShortArray" to ArrayTypeName.of(TypeName.SHORT.box()),
-                "boxedIntArray" to ArrayTypeName.of(TypeName.INT.box()),
-                "boxedLongArray" to ArrayTypeName.of(TypeName.LONG.box()),
-                "boxedCharArray" to ArrayTypeName.of(TypeName.CHAR.box()),
-                "boxedFloatArray" to ArrayTypeName.of(TypeName.FLOAT.box()),
-                "boxedDoubleArray" to ArrayTypeName.of(TypeName.DOUBLE.box())
+                Container(
+                    "primitiveBooleanArray",
+                    JArrayTypeName.of(JTypeName.BOOLEAN),
+                    com.squareup.kotlinpoet.BOOLEAN_ARRAY
+                ),
+                Container(
+                    "primitiveByteArray",
+                    JArrayTypeName.of(JTypeName.BYTE),
+                    com.squareup.kotlinpoet.BYTE_ARRAY
+                ),
+                Container(
+                        "primitiveShortArray",
+                    JArrayTypeName.of(JTypeName.SHORT),
+                    com.squareup.kotlinpoet.SHORT_ARRAY
+                ),
+                Container(
+                    "primitiveIntArray",
+                    JArrayTypeName.of(JTypeName.INT),
+                    com.squareup.kotlinpoet.INT_ARRAY
+                ),
+                Container(
+                    "primitiveLongArray",
+                    JArrayTypeName.of(JTypeName.LONG),
+                    com.squareup.kotlinpoet.LONG_ARRAY
+                ),
+                Container(
+                    "primitiveCharArray",
+                    JArrayTypeName.of(JTypeName.CHAR),
+                    com.squareup.kotlinpoet.CHAR_ARRAY
+                ),
+                Container(
+                    "primitiveFloatArray",
+                    JArrayTypeName.of(JTypeName.FLOAT),
+                    com.squareup.kotlinpoet.FLOAT_ARRAY
+                ),
+                Container(
+                    "primitiveDoubleArray",
+                    JArrayTypeName.of(JTypeName.DOUBLE),
+                    com.squareup.kotlinpoet.DOUBLE_ARRAY
+                ),
+                Container(
+                    "boxedBooleanArray",
+                    JArrayTypeName.of(JTypeName.BOOLEAN.box()),
+                    com.squareup.kotlinpoet.ARRAY.parameterizedBy(com.squareup.kotlinpoet.BOOLEAN)
+                ),
+                Container(
+                    "boxedByteArray",
+                    JArrayTypeName.of(JTypeName.BYTE.box()),
+                    com.squareup.kotlinpoet.ARRAY.parameterizedBy(com.squareup.kotlinpoet.BYTE)
+                ),
+                Container(
+                    "boxedShortArray",
+                    JArrayTypeName.of(JTypeName.SHORT.box()),
+                    com.squareup.kotlinpoet.ARRAY.parameterizedBy(com.squareup.kotlinpoet.SHORT)
+                ),
+                Container(
+                    "boxedIntArray",
+                    JArrayTypeName.of(JTypeName.INT.box()),
+                    com.squareup.kotlinpoet.ARRAY.parameterizedBy(com.squareup.kotlinpoet.INT)
+                ),
+                Container(
+                    "boxedLongArray",
+                    JArrayTypeName.of(JTypeName.LONG.box()),
+                    com.squareup.kotlinpoet.ARRAY.parameterizedBy(com.squareup.kotlinpoet.LONG)
+                ),
+                Container(
+                    "boxedCharArray",
+                    JArrayTypeName.of(JTypeName.CHAR.box()),
+                    com.squareup.kotlinpoet.ARRAY.parameterizedBy(com.squareup.kotlinpoet.CHAR)
+                ),
+                Container(
+                    "boxedFloatArray",
+                    JArrayTypeName.of(JTypeName.FLOAT.box()),
+                    com.squareup.kotlinpoet.ARRAY.parameterizedBy(com.squareup.kotlinpoet.FLOAT)
+                ),
+                Container(
+                    "boxedDoubleArray",
+                    JArrayTypeName.of(JTypeName.DOUBLE.box()),
+                    com.squareup.kotlinpoet.ARRAY.parameterizedBy(com.squareup.kotlinpoet.DOUBLE)
+                )
             )
         }
     }
@@ -177,8 +318,11 @@
             invocation.processingEnv.getArrayType(intType).let {
                 assertThat(it.isArray()).isTrue()
                 assertThat(it.componentType).isEqualTo(intType)
-                assertThat(it.typeName).isEqualTo(
-                    ArrayTypeName.of(TypeName.INT)
+                assertThat(it.asTypeName().java).isEqualTo(
+                    JArrayTypeName.of(JTypeName.INT)
+                )
+                assertThat(it.asTypeName().kotlin).isEqualTo(
+                    com.squareup.kotlinpoet.INT_ARRAY
                 )
             }
             val nullableInt = (invocation.processingEnv as KspProcessingEnv).wrap(
@@ -188,8 +332,13 @@
             invocation.processingEnv.getArrayType(nullableInt).let {
                 assertThat(it.isArray()).isTrue()
                 assertThat(it.componentType).isEqualTo(nullableInt)
-                assertThat(it.typeName).isEqualTo(
-                    ArrayTypeName.of(TypeName.INT.box())
+                assertThat(it.asTypeName().java).isEqualTo(
+                    JArrayTypeName.of(JTypeName.INT.box())
+                )
+                assertThat(it.asTypeName().kotlin).isEqualTo(
+                    com.squareup.kotlinpoet.ARRAY.parameterizedBy(
+                        com.squareup.kotlinpoet.INT.copy(nullable = true)
+                    )
                 )
             }
         }
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XElementTest.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XElementTest.kt
index 0c28901..f7c0e52 100644
--- a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XElementTest.kt
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XElementTest.kt
@@ -16,6 +16,8 @@
 
 package androidx.room.compiler.processing
 
+import androidx.room.compiler.codegen.XTypeName
+import androidx.room.compiler.codegen.asClassName
 import androidx.room.compiler.processing.javac.JavacTypeElement
 import androidx.room.compiler.processing.ksp.KspExecutableElement
 import androidx.room.compiler.processing.ksp.KspFieldElement
@@ -24,26 +26,25 @@
 import androidx.room.compiler.processing.testcode.OtherAnnotation
 import androidx.room.compiler.processing.util.Source
 import androidx.room.compiler.processing.util.XTestInvocation
-import androidx.room.compiler.processing.util.className
+import androidx.room.compiler.processing.util.asJClassName
 import androidx.room.compiler.processing.util.compileFiles
+import androidx.room.compiler.processing.util.createXTypeVariableName
 import androidx.room.compiler.processing.util.getField
 import androidx.room.compiler.processing.util.getMethodByJvmName
 import androidx.room.compiler.processing.util.getParameter
 import androidx.room.compiler.processing.util.kspProcessingEnv
 import androidx.room.compiler.processing.util.kspResolver
-import androidx.room.compiler.processing.util.runProcessorTestWithoutKsp
 import androidx.room.compiler.processing.util.runProcessorTest
+import androidx.room.compiler.processing.util.runProcessorTestWithoutKsp
 import com.google.common.truth.Truth.assertThat
 import com.google.devtools.ksp.KspExperimental
 import com.google.devtools.ksp.symbol.KSFunctionDeclaration
 import com.google.devtools.ksp.symbol.KSPropertyDeclaration
-import com.squareup.javapoet.ClassName
-import com.squareup.javapoet.TypeName
-import com.squareup.javapoet.TypeVariableName
+import com.squareup.kotlinpoet.javapoet.JClassName
+import kotlin.reflect.KClass
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
-import kotlin.reflect.KClass
 
 @RunWith(JUnit4::class)
 class XElementTest {
@@ -191,71 +192,75 @@
         ) {
             fun validateMethodElement(
                 element: XTypeElement,
-                tTypeName: TypeName,
-                rTypeName: TypeName
+                tTypeName: XTypeName,
+                rTypeName: XTypeName
             ) {
                 element.getMethodByJvmName("returnT").let { method ->
                     assertThat(method.parameters).isEmpty()
-                    assertThat(method.returnType.typeName).isEqualTo(tTypeName)
+                    assertThat(method.returnType.asTypeName()).isEqualTo(tTypeName)
                 }
                 element.getMethodByJvmName("receiveT").let { method ->
-                    assertThat(method.getParameter("param1").type.typeName).isEqualTo(tTypeName)
-                    assertThat(method.returnType.typeName).isEqualTo(TypeName.INT)
+                    assertThat(method.getParameter("param1").type.asTypeName()).isEqualTo(tTypeName)
+                    assertThat(method.returnType.asTypeName())
+                        .isEqualTo(XTypeName.PRIMITIVE_INT)
                 }
                 element.getMethodByJvmName("receiveR").let { method ->
-                    assertThat(method.getParameter("param1").type.typeName).isEqualTo(rTypeName)
-                    assertThat(method.returnType.typeName).isEqualTo(TypeName.INT)
+                    assertThat(method.getParameter("param1").type.asTypeName()).isEqualTo(rTypeName)
+                    assertThat(method.returnType.asTypeName())
+                        .isEqualTo(XTypeName.PRIMITIVE_INT)
                 }
                 element.getMethodByJvmName("returnR").let { method ->
                     assertThat(method.parameters).isEmpty()
-                    assertThat(method.returnType.typeName).isEqualTo(rTypeName)
+                    assertThat(method.returnType.asTypeName()).isEqualTo(rTypeName)
                 }
             }
             fun validateMethodTypeAsMemberOf(
                 element: XTypeElement,
-                tTypeName: TypeName,
-                rTypeName: TypeName
+                tTypeName: XTypeName,
+                rTypeName: XTypeName
             ) {
                 element.getMethodByJvmName("returnT").asMemberOf(element.type).let { method ->
                     assertThat(method.parameterTypes).isEmpty()
-                    assertThat(method.returnType.typeName).isEqualTo(tTypeName)
+                    assertThat(method.returnType.asTypeName()).isEqualTo(tTypeName)
                 }
                 element.getMethodByJvmName("receiveT").asMemberOf(element.type).let { method ->
                     assertThat(method.parameterTypes).hasSize(1)
-                    assertThat(method.parameterTypes[0].typeName).isEqualTo(tTypeName)
-                    assertThat(method.returnType.typeName).isEqualTo(TypeName.INT)
+                    assertThat(method.parameterTypes[0].asTypeName()).isEqualTo(tTypeName)
+                    assertThat(method.returnType.asTypeName())
+                        .isEqualTo(XTypeName.PRIMITIVE_INT)
                 }
                 element.getMethodByJvmName("receiveR").asMemberOf(element.type).let { method ->
                     assertThat(method.parameterTypes).hasSize(1)
-                    assertThat(method.parameterTypes[0].typeName).isEqualTo(rTypeName)
-                    assertThat(method.returnType.typeName).isEqualTo(TypeName.INT)
+                    assertThat(method.parameterTypes[0].asTypeName()).isEqualTo(rTypeName)
+                    assertThat(method.returnType.asTypeName())
+                        .isEqualTo(XTypeName.PRIMITIVE_INT)
                 }
                 element.getMethodByJvmName("returnR").let { method ->
                     assertThat(method.parameters).isEmpty()
-                    assertThat(method.returnType.typeName).isEqualTo(rTypeName)
+                    assertThat(method.returnType.asTypeName()).isEqualTo(rTypeName)
                 }
             }
 
             validateMethodElement(
                 element = it.processingEnv.requireTypeElement("foo.bar.Base"),
-                tTypeName = TypeVariableName.get("T"),
-                rTypeName = TypeVariableName.get("R")
+                tTypeName = createXTypeVariableName("T"),
+                rTypeName = createXTypeVariableName("R")
             )
             validateMethodElement(
                 element = it.processingEnv.requireTypeElement("foo.bar.Child"),
-                tTypeName = TypeVariableName.get("T"),
-                rTypeName = TypeVariableName.get("R")
+                tTypeName = createXTypeVariableName("T"),
+                rTypeName = createXTypeVariableName("R")
             )
 
             validateMethodTypeAsMemberOf(
                 element = it.processingEnv.requireTypeElement("foo.bar.Base"),
-                tTypeName = TypeVariableName.get("T"),
-                rTypeName = TypeVariableName.get("R")
+                tTypeName = createXTypeVariableName("T"),
+                rTypeName = createXTypeVariableName("R")
             )
             validateMethodTypeAsMemberOf(
                 element = it.processingEnv.requireTypeElement("foo.bar.Child"),
-                tTypeName = String::class.className(),
-                rTypeName = TypeVariableName.get("R")
+                tTypeName = String::class.asClassName(),
+                rTypeName = createXTypeVariableName("R")
             )
         }
     }
@@ -348,36 +353,67 @@
             assertThat(element.hasAllAnnotations(RunWith::class)).isTrue()
             assertThat(element.hasAllAnnotations(RunWith::class, Test::class)).isFalse()
 
-            assertThat(element.hasAllAnnotations(*arrayOf<ClassName>())).isTrue()
-            assertThat(element.hasAllAnnotations(RunWith::class.className())).isTrue()
-            assertThat(element.hasAllAnnotations(RunWith::class.className(),
-                Test::class.className())).isFalse()
+            assertThat(element.hasAllAnnotations(*arrayOf<JClassName>())).isTrue()
+            assertThat(element.hasAllAnnotations(RunWith::class.asJClassName())).isTrue()
+            assertThat(
+                element.hasAllAnnotations(
+                    RunWith::class.asJClassName(),
+                    Test::class.asJClassName()
+                )
+            ).isFalse()
 
-            assertThat(element.hasAllAnnotations(emptyList<ClassName>())).isTrue()
-            assertThat(element.hasAllAnnotations(listOf(RunWith::class.className()))).isTrue()
-            assertThat(element.hasAllAnnotations(listOf(RunWith::class.className(),
-                Test::class.className()))).isFalse()
+            assertThat(element.hasAllAnnotations(emptyList<JClassName>())).isTrue()
+            assertThat(element.hasAllAnnotations(listOf(RunWith::class.asJClassName()))).isTrue()
+            assertThat(
+                element.hasAllAnnotations(
+                    listOf(
+                        RunWith::class.asJClassName(),
+                        Test::class.asJClassName()
+                    )
+                )
+            ).isFalse()
 
             element.getMethodByJvmName("testMethod").let { method ->
                 assertThat(method.hasAllAnnotations(*arrayOf<KClass<Annotation>>())).isTrue()
                 assertThat(method.hasAllAnnotations(Test::class)).isTrue()
                 assertThat(method.hasAllAnnotations(Test::class, OtherAnnotation::class)).isTrue()
-                assertThat(method.hasAllAnnotations(Test::class, OtherAnnotation::class,
-                    RunWith::class)).isFalse()
+                assertThat(
+                    method.hasAllAnnotations(
+                        Test::class, OtherAnnotation::class,
+                        RunWith::class
+                    )
+                ).isFalse()
 
-                assertThat(method.hasAllAnnotations(*arrayOf<ClassName>())).isTrue()
-                assertThat(method.hasAllAnnotations(Test::class.className())).isTrue()
-                assertThat(method.hasAllAnnotations(Test::class.className(),
-                    OtherAnnotation::class.className())).isTrue()
-                assertThat(method.hasAllAnnotations(Test::class.className(),
-                    OtherAnnotation::class.className(), RunWith::class.className())).isFalse()
+                assertThat(method.hasAllAnnotations(*arrayOf<JClassName>())).isTrue()
+                assertThat(method.hasAllAnnotations(Test::class.asJClassName())).isTrue()
+                assertThat(
+                    method.hasAllAnnotations(
+                        Test::class.asJClassName(),
+                        OtherAnnotation::class.asJClassName()
+                    )
+                ).isTrue()
+                assertThat(
+                    method.hasAllAnnotations(
+                        Test::class.asJClassName(),
+                        OtherAnnotation::class.asJClassName(), RunWith::class.asJClassName()
+                    )
+                ).isFalse()
 
-                assertThat(method.hasAllAnnotations(emptyList<ClassName>())).isTrue()
-                assertThat(method.hasAllAnnotations(listOf(Test::class.className()))).isTrue()
-                assertThat(method.hasAllAnnotations(
-                    listOf(Test::class.className(), OtherAnnotation::class.className()))).isTrue()
-                assertThat(method.hasAllAnnotations(listOf(Test::class.className(),
-                    OtherAnnotation::class.className(), RunWith::class.className()))).isFalse()
+                assertThat(method.hasAllAnnotations(emptyList<JClassName>())).isTrue()
+                assertThat(method.hasAllAnnotations(listOf(Test::class.asJClassName()))).isTrue()
+                assertThat(
+                    method.hasAllAnnotations(
+                        listOf(Test::class.asJClassName(), OtherAnnotation::class.asJClassName())
+                    )
+                ).isTrue()
+                assertThat(
+                    method.hasAllAnnotations(
+                        listOf(
+                            Test::class.asJClassName(),
+                            OtherAnnotation::class.asJClassName(), RunWith::class.asJClassName()
+                        )
+                    )
+                ).isFalse()
             }
             element.getField("testField").let { field ->
                 assertThat(field.hasAllAnnotations(*arrayOf<KClass<Annotation>>())).isTrue()
@@ -386,20 +422,40 @@
                 assertThat(field.hasAllAnnotations(OtherAnnotation::class, OtherAnnotation::class))
                     .isTrue()
 
-                assertThat(field.hasAllAnnotations(*arrayOf<ClassName>())).isTrue()
-                assertThat(field.hasAllAnnotations(OtherAnnotation::class.className())).isTrue()
-                assertThat(field.hasAllAnnotations(OtherAnnotation::class.className(),
-                    Test::class.className())).isFalse()
-                assertThat(field.hasAllAnnotations(OtherAnnotation::class.className(),
-                    OtherAnnotation::class.className())).isTrue()
+                assertThat(field.hasAllAnnotations(*arrayOf<JClassName>())).isTrue()
+                assertThat(field.hasAllAnnotations(OtherAnnotation::class.asJClassName())).isTrue()
+                assertThat(
+                    field.hasAllAnnotations(
+                        OtherAnnotation::class.asJClassName(),
+                        Test::class.asJClassName()
+                    )
+                ).isFalse()
+                assertThat(
+                    field.hasAllAnnotations(
+                        OtherAnnotation::class.asJClassName(),
+                        OtherAnnotation::class.asJClassName()
+                    )
+                ).isTrue()
 
-                assertThat(field.hasAllAnnotations(listOf<ClassName>())).isTrue()
-                assertThat(field.hasAllAnnotations(listOf(OtherAnnotation::class.className())))
+                assertThat(field.hasAllAnnotations(listOf<JClassName>())).isTrue()
+                assertThat(field.hasAllAnnotations(listOf(OtherAnnotation::class.asJClassName())))
                     .isTrue()
-                assertThat(field.hasAllAnnotations(listOf(OtherAnnotation::class.className(),
-                    Test::class.className()))).isFalse()
-                assertThat(field.hasAllAnnotations(listOf(OtherAnnotation::class.className(),
-                    OtherAnnotation::class.className()))).isTrue()
+                assertThat(
+                    field.hasAllAnnotations(
+                        listOf(
+                            OtherAnnotation::class.asJClassName(),
+                            Test::class.asJClassName()
+                        )
+                    )
+                ).isFalse()
+                assertThat(
+                    field.hasAllAnnotations(
+                        listOf(
+                            OtherAnnotation::class.asJClassName(),
+                            OtherAnnotation::class.asJClassName()
+                        )
+                    )
+                ).isTrue()
             }
         }
     }
@@ -434,36 +490,67 @@
             assertThat(element.hasAnyAnnotation(RunWith::class)).isTrue()
             assertThat(element.hasAnyAnnotation(RunWith::class, Test::class)).isTrue()
 
-            assertThat(element.hasAnyAnnotation(*arrayOf<ClassName>())).isFalse()
-            assertThat(element.hasAnyAnnotation(RunWith::class.className())).isTrue()
-            assertThat(element.hasAnyAnnotation(RunWith::class.className(),
-                Test::class.className())).isTrue()
+            assertThat(element.hasAnyAnnotation(*arrayOf<JClassName>())).isFalse()
+            assertThat(element.hasAnyAnnotation(RunWith::class.asJClassName())).isTrue()
+            assertThat(
+                element.hasAnyAnnotation(
+                    RunWith::class.asJClassName(),
+                    Test::class.asJClassName()
+                )
+            ).isTrue()
 
-            assertThat(element.hasAnyAnnotation(emptyList<ClassName>())).isFalse()
-            assertThat(element.hasAnyAnnotation(listOf(RunWith::class.className()))).isTrue()
-            assertThat(element.hasAnyAnnotation(listOf(RunWith::class.className(),
-                Test::class.className()))).isTrue()
+            assertThat(element.hasAnyAnnotation(emptyList<JClassName>())).isFalse()
+            assertThat(element.hasAnyAnnotation(listOf(RunWith::class.asJClassName()))).isTrue()
+            assertThat(
+                element.hasAnyAnnotation(
+                    listOf(
+                        RunWith::class.asJClassName(),
+                        Test::class.asJClassName()
+                    )
+                )
+            ).isTrue()
 
             element.getMethodByJvmName("testMethod").let { method ->
                 assertThat(method.hasAnyAnnotation(*arrayOf<KClass<Annotation>>())).isFalse()
                 assertThat(method.hasAnyAnnotation(Test::class)).isTrue()
                 assertThat(method.hasAnyAnnotation(Test::class, OtherAnnotation::class)).isTrue()
-                assertThat(method.hasAnyAnnotation(Test::class, OtherAnnotation::class,
-                    RunWith::class)).isTrue()
+                assertThat(
+                    method.hasAnyAnnotation(
+                        Test::class, OtherAnnotation::class,
+                        RunWith::class
+                    )
+                ).isTrue()
 
-                assertThat(method.hasAnyAnnotation(*arrayOf<ClassName>())).isFalse()
-                assertThat(method.hasAnyAnnotation(Test::class.className())).isTrue()
-                assertThat(method.hasAnyAnnotation(Test::class.className(),
-                    OtherAnnotation::class.className())).isTrue()
-                assertThat(method.hasAnyAnnotation(Test::class.className(),
-                    OtherAnnotation::class.className(), RunWith::class.className())).isTrue()
+                assertThat(method.hasAnyAnnotation(*arrayOf<JClassName>())).isFalse()
+                assertThat(method.hasAnyAnnotation(Test::class.asJClassName())).isTrue()
+                assertThat(
+                    method.hasAnyAnnotation(
+                        Test::class.asJClassName(),
+                        OtherAnnotation::class.asJClassName()
+                    )
+                ).isTrue()
+                assertThat(
+                    method.hasAnyAnnotation(
+                        Test::class.asJClassName(),
+                        OtherAnnotation::class.asJClassName(), RunWith::class.asJClassName()
+                    )
+                ).isTrue()
 
-                assertThat(method.hasAnyAnnotation(emptyList<ClassName>())).isFalse()
-                assertThat(method.hasAnyAnnotation(listOf(Test::class.className()))).isTrue()
-                assertThat(method.hasAnyAnnotation(
-                    listOf(Test::class.className(), OtherAnnotation::class.className()))).isTrue()
-                assertThat(method.hasAnyAnnotation(listOf(Test::class.className(),
-                    OtherAnnotation::class.className(), RunWith::class.className()))).isTrue()
+                assertThat(method.hasAnyAnnotation(emptyList<JClassName>())).isFalse()
+                assertThat(method.hasAnyAnnotation(listOf(Test::class.asJClassName()))).isTrue()
+                assertThat(
+                    method.hasAnyAnnotation(
+                        listOf(Test::class.asJClassName(), OtherAnnotation::class.asJClassName())
+                    )
+                ).isTrue()
+                assertThat(
+                    method.hasAnyAnnotation(
+                        listOf(
+                            Test::class.asJClassName(),
+                            OtherAnnotation::class.asJClassName(), RunWith::class.asJClassName()
+                        )
+                    )
+                ).isTrue()
             }
             element.getField("testField").let { field ->
                 assertThat(field.hasAnyAnnotation(*arrayOf<KClass<Annotation>>())).isFalse()
@@ -472,20 +559,40 @@
                 assertThat(field.hasAnyAnnotation(OtherAnnotation::class, OtherAnnotation::class))
                     .isTrue()
 
-                assertThat(field.hasAnyAnnotation(*arrayOf<ClassName>())).isFalse()
-                assertThat(field.hasAnyAnnotation(OtherAnnotation::class.className())).isTrue()
-                assertThat(field.hasAnyAnnotation(OtherAnnotation::class.className(),
-                    Test::class.className())).isTrue()
-                assertThat(field.hasAnyAnnotation(OtherAnnotation::class.className(),
-                    OtherAnnotation::class.className())).isTrue()
+                assertThat(field.hasAnyAnnotation(*arrayOf<JClassName>())).isFalse()
+                assertThat(field.hasAnyAnnotation(OtherAnnotation::class.asJClassName())).isTrue()
+                assertThat(
+                    field.hasAnyAnnotation(
+                        OtherAnnotation::class.asJClassName(),
+                        Test::class.asJClassName()
+                    )
+                ).isTrue()
+                assertThat(
+                    field.hasAnyAnnotation(
+                        OtherAnnotation::class.asJClassName(),
+                        OtherAnnotation::class.asJClassName()
+                    )
+                ).isTrue()
 
-                assertThat(field.hasAnyAnnotation(listOf<ClassName>())).isFalse()
-                assertThat(field.hasAnyAnnotation(listOf(OtherAnnotation::class.className())))
+                assertThat(field.hasAnyAnnotation(listOf<JClassName>())).isFalse()
+                assertThat(field.hasAnyAnnotation(listOf(OtherAnnotation::class.asJClassName())))
                     .isTrue()
-                assertThat(field.hasAnyAnnotation(listOf(OtherAnnotation::class.className(),
-                    Test::class.className()))).isTrue()
-                assertThat(field.hasAnyAnnotation(listOf(OtherAnnotation::class.className(),
-                    OtherAnnotation::class.className()))).isTrue()
+                assertThat(
+                    field.hasAnyAnnotation(
+                        listOf(
+                            OtherAnnotation::class.asJClassName(),
+                            Test::class.asJClassName()
+                        )
+                    )
+                ).isTrue()
+                assertThat(
+                    field.hasAnyAnnotation(
+                        listOf(
+                            OtherAnnotation::class.asJClassName(),
+                            OtherAnnotation::class.asJClassName()
+                        )
+                    )
+                ).isTrue()
             }
         }
     }
@@ -526,7 +633,7 @@
         runProcessorTest(
             sources = listOf(subject)
         ) {
-            val inner = ClassName.get("foo.bar", "Baz.Inner")
+            val inner = JClassName.get("foo.bar", "Baz.Inner")
             assertThat(
                 it.processingEnv.requireTypeElement(inner).isInterface()
             ).isTrue()
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XExecutableElementTest.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XExecutableElementTest.kt
index 9233b1a..50ef811 100644
--- a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XExecutableElementTest.kt
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XExecutableElementTest.kt
@@ -16,11 +16,14 @@
 
 package androidx.room.compiler.processing
 
-import androidx.room.compiler.processing.util.CONTINUATION_CLASS_NAME
+import androidx.room.compiler.codegen.XTypeName
+import androidx.room.compiler.codegen.asClassName
+import androidx.room.compiler.processing.util.CONTINUATION_JCLASS_NAME
 import androidx.room.compiler.processing.util.Source
-import androidx.room.compiler.processing.util.UNIT_CLASS_NAME
+import androidx.room.compiler.processing.util.UNIT_JCLASS_NAME
 import androidx.room.compiler.processing.util.className
 import androidx.room.compiler.processing.util.compileFiles
+import androidx.room.compiler.processing.util.createXTypeVariableName
 import androidx.room.compiler.processing.util.getDeclaredMethodByJvmName
 import androidx.room.compiler.processing.util.getMethodByJvmName
 import androidx.room.compiler.processing.util.getParameter
@@ -31,13 +34,20 @@
 import com.squareup.javapoet.ClassName
 import com.squareup.javapoet.ParameterizedTypeName
 import com.squareup.javapoet.TypeName
-import com.squareup.javapoet.TypeVariableName
 import com.squareup.javapoet.WildcardTypeName
+import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy
+import com.squareup.kotlinpoet.UNIT
+import com.squareup.kotlinpoet.javapoet.JClassName
+import com.squareup.kotlinpoet.javapoet.JParameterizedTypeName
+import com.squareup.kotlinpoet.javapoet.JTypeName
+import com.squareup.kotlinpoet.javapoet.JTypeVariableName
+import com.squareup.kotlinpoet.javapoet.KClassName
+import com.squareup.kotlinpoet.javapoet.KTypeVariableName
+import java.io.File
+import java.io.IOException
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
-import java.io.File
-import java.io.IOException
 
 @RunWith(JUnit4::class)
 class XExecutableElementTest {
@@ -77,11 +87,11 @@
                 method.getParameter("param1").let { param ->
                     val paramType = param.type
                     check(paramType.isArray())
-                    assertThat(paramType.componentType.typeName)
-                        .isEqualTo(String::class.typeName())
+                    assertThat(paramType.componentType.asTypeName())
+                        .isEqualTo(String::class.asClassName())
                     assertThat(param.enclosingElement).isEqualTo(method)
                 }
-                assertThat(method.returnType.typeName).isEqualTo(String::class.typeName())
+                assertThat(method.returnType.asTypeName()).isEqualTo(String::class.asClassName())
             }
             element.getConstructors().single().let { ctor ->
                 assertThat(ctor.parameters).hasSize(1)
@@ -324,8 +334,8 @@
                 method.executableType.parameterTypes.last().let { cont ->
                     assertThat(cont.typeName).isEqualTo(
                         ParameterizedTypeName.get(
-                            CONTINUATION_CLASS_NAME,
-                            WildcardTypeName.supertypeOf(UNIT_CLASS_NAME)
+                            CONTINUATION_JCLASS_NAME,
+                            WildcardTypeName.supertypeOf(UNIT_JCLASS_NAME)
                         )
                     )
                     assertThat(cont.nullability).isEqualTo(XNullability.NONNULL)
@@ -336,7 +346,7 @@
                 method.parameters.last().let { cont ->
                     assertThat(cont.type.typeName).isEqualTo(
                         ParameterizedTypeName.get(
-                            CONTINUATION_CLASS_NAME,
+                            CONTINUATION_JCLASS_NAME,
                             WildcardTypeName.supertypeOf(Integer::class.java)
                         )
                     )
@@ -347,7 +357,7 @@
                 method.executableType.parameterTypes.last().let { cont ->
                     assertThat(cont.typeName).isEqualTo(
                         ParameterizedTypeName.get(
-                            CONTINUATION_CLASS_NAME,
+                            CONTINUATION_JCLASS_NAME,
                             WildcardTypeName.supertypeOf(Integer::class.java)
                         )
                     )
@@ -366,7 +376,7 @@
                 method.executableType.parameterTypes.last().let { cont ->
                     assertThat(cont.typeName).isEqualTo(
                         ParameterizedTypeName.get(
-                            CONTINUATION_CLASS_NAME,
+                            CONTINUATION_JCLASS_NAME,
                             WildcardTypeName.supertypeOf(
                                 ParameterizedTypeName.get(
                                     Pair::class.className(),
@@ -416,16 +426,20 @@
             listOf("getX", "getProp1", "getProp2", "getProp3", "getProp5", "getProp6",
                 "getProp8\$main").forEach {
                 klass.getMethodByJvmName(it).let { method ->
-                    assertThat(method.returnType.typeName).isEqualTo(String::class.typeName())
+                    assertThat(method.returnType.asTypeName())
+                        .isEqualTo(String::class.asClassName())
                     assertThat(method.parameters).isEmpty()
                     assertThat(method.returnType.nullability).isEqualTo(XNullability.NONNULL)
                 }
             }
             listOf("setY", "setProp2", "setProp8\$main").forEach {
                 klass.getMethodByJvmName(it).let { method ->
-                    assertThat(method.returnType.typeName).isEqualTo(TypeName.VOID)
-                    assertThat(method.parameters.first().type.typeName).isEqualTo(
-                        String::class.typeName()
+                    assertThat(method.returnType.asTypeName().java).isEqualTo(JTypeName.VOID)
+                    if (invocation.isKsp) {
+                        assertThat(method.returnType.asTypeName().kotlin).isEqualTo(UNIT)
+                    }
+                    assertThat(method.parameters.first().type.asTypeName()).isEqualTo(
+                        String::class.asClassName()
                     )
                     assertThat(method.isPublic()).isTrue()
                     assertThat(method.parameters.first().type.nullability).isEqualTo(
@@ -469,11 +483,12 @@
             val method = base.getMethodByJvmName("foo")
             method.getParameter("t").let { param ->
                 param.asMemberOf(subject).let {
-                    assertThat(it.typeName).isEqualTo(String::class.typeName())
+                    assertThat(it.asTypeName()).isEqualTo(String::class.asClassName())
                     assertThat(it.nullability).isEqualTo(XNullability.NONNULL)
                 }
                 param.asMemberOf(nullableSubject).let {
-                    assertThat(it.typeName).isEqualTo(String::class.typeName())
+                    assertThat(it.asTypeName())
+                        .isEqualTo(String::class.asClassName().copy(nullable = true))
                     if (invocation.isKsp) {
                         // kapt implementation is unable to read this properly
                         assertThat(it.nullability).isEqualTo(XNullability.NULLABLE)
@@ -482,11 +497,13 @@
             }
             method.getParameter("nullableT").let { param ->
                 param.asMemberOf(subject).let {
-                    assertThat(it.typeName).isEqualTo(String::class.typeName())
+                    assertThat(it.asTypeName())
+                        .isEqualTo(String::class.asClassName().copy(nullable = true))
                     assertThat(it.nullability).isEqualTo(XNullability.NULLABLE)
                 }
                 param.asMemberOf(nullableSubject).let {
-                    assertThat(it.typeName).isEqualTo(String::class.typeName())
+                    assertThat(it.asTypeName())
+                        .isEqualTo(String::class.asClassName().copy(nullable = true))
                     assertThat(it.nullability).isEqualTo(XNullability.NULLABLE)
                 }
             }
@@ -542,7 +559,7 @@
             }
             listOf(impl, javaImpl).forEach { subject ->
                 listOf("getY", "getX", "setY").forEach { methodName ->
-                    assertWithMessage("${subject.className}:$methodName").that(
+                    assertWithMessage("${subject.asClassName().canonicalName}:$methodName").that(
                         overrides(
                             owner = subject,
                             ownerMethodName = methodName,
@@ -551,7 +568,7 @@
                     ).isTrue()
                 }
 
-                assertWithMessage(subject.className.canonicalName()).that(
+                assertWithMessage(subject.asClassName().canonicalName).that(
                     overrides(
                         owner = subject,
                         ownerMethodName = "getY",
@@ -560,7 +577,7 @@
                     )
                 ).isFalse()
 
-                assertWithMessage(subject.className.canonicalName()).that(
+                assertWithMessage(subject.asClassName().canonicalName).that(
                     overrides(
                         owner = subject,
                         ownerMethodName = "getY",
@@ -569,7 +586,7 @@
                     )
                 ).isFalse()
 
-                assertWithMessage(subject.className.canonicalName()).that(
+                assertWithMessage(subject.asClassName().canonicalName).that(
                     overrides(
                         owner = base,
                         ownerMethodName = "getX",
@@ -578,7 +595,7 @@
                     )
                 ).isFalse()
 
-                assertWithMessage(subject.className.canonicalName()).that(
+                assertWithMessage(subject.asClassName().canonicalName).that(
                     overrides(
                         owner = subject,
                         ownerMethodName = "setY",
@@ -587,7 +604,7 @@
                     )
                 ).isFalse()
 
-                assertWithMessage(subject.className.canonicalName()).that(
+                assertWithMessage(subject.asClassName().canonicalName).that(
                     overrides(
                         owner = subject,
                         ownerMethodName = "setY",
@@ -679,14 +696,14 @@
         ) { invocation ->
             val elm = invocation.processingEnv.requireTypeElement("JavaImpl")
             assertThat(
-                elm.getMethodByJvmName("getX").returnType.typeName
-            ).isEqualTo(TypeName.INT)
+                elm.getMethodByJvmName("getX").returnType.asTypeName()
+            ).isEqualTo(XTypeName.PRIMITIVE_INT)
             assertThat(
-                elm.getMethodByJvmName("getY").returnType.typeName
-            ).isEqualTo(TypeName.INT)
+                elm.getMethodByJvmName("getY").returnType.asTypeName()
+            ).isEqualTo(XTypeName.PRIMITIVE_INT)
             assertThat(
-                elm.getMethodByJvmName("setY").parameters.first().type.typeName
-            ).isEqualTo(TypeName.INT)
+                elm.getMethodByJvmName("setY").parameters.first().type.asTypeName()
+            ).isEqualTo(XTypeName.PRIMITIVE_INT)
         }
     }
 
@@ -721,14 +738,14 @@
         ) { invocation ->
             val elm = invocation.processingEnv.requireTypeElement("JavaImpl")
             assertThat(
-                elm.getMethodByJvmName("getX").returnType.typeName
-            ).isEqualTo(TypeName.INT.box())
+                elm.getMethodByJvmName("getX").returnType.asTypeName()
+            ).isEqualTo(Int::class.asClassName())
             assertThat(
-                elm.getMethodByJvmName("getY").returnType.typeName
-            ).isEqualTo(TypeName.INT.box())
+                elm.getMethodByJvmName("getY").returnType.asTypeName()
+            ).isEqualTo(Int::class.asClassName())
             assertThat(
-                elm.getMethodByJvmName("setY").parameters.first().type.typeName
-            ).isEqualTo(TypeName.INT.box())
+                elm.getMethodByJvmName("setY").parameters.first().type.asTypeName()
+            ).isEqualTo(Int::class.asClassName())
         }
     }
 
@@ -876,7 +893,7 @@
             sources = buildSources("app"),
             classpath = compileFiles(sources = buildSources("lib"))
         ) { invocation ->
-            fun collectExceptions(subject: XTypeElement): List<Pair<String, Set<TypeName>>> {
+            fun collectExceptions(subject: XTypeElement): List<Pair<String, Set<XTypeName>>> {
                 return (subject.getConstructors() + subject.getDeclaredMethods()).mapNotNull {
                     val throwTypes = it.thrownTypes
                     val name = if (it is XMethodElement) {
@@ -887,16 +904,16 @@
                     if (throwTypes.isEmpty()) {
                         null
                     } else {
-                        name to throwTypes.map { it.typeName }.toSet()
+                        name to throwTypes.map { it.asTypeName() }.toSet()
                     }
                 }
             }
             listOf("app", "lib").forEach { pkg ->
                 val expectedConstructor =
-                    "<init>" to setOf(ClassName.get(IllegalArgumentException::class.java))
+                    "<init>" to setOf(IllegalArgumentException::class.asClassName())
                 val expectedMethod = "multipleThrows" to setOf(
-                    ClassName.get(IOException::class.java),
-                    ClassName.get(IllegalStateException::class.java)
+                    IOException::class.asClassName(),
+                    IllegalStateException::class.asClassName()
                 )
                 invocation.processingEnv.requireTypeElement("$pkg.KotlinSubject").let { subject ->
                     assertWithMessage(subject.qualifiedName).that(
@@ -918,17 +935,17 @@
                         collectExceptions(subject)
                     ).containsExactly(
                         "getGetterThrows" to setOf(
-                            ClassName.get(IllegalArgumentException::class.java)
+                            IllegalArgumentException::class.asClassName()
                         ),
                         "setSetterThrows" to setOf(
-                            ClassName.get(IllegalStateException::class.java)
+                            IllegalStateException::class.asClassName()
                         ),
                         "getBothThrows" to setOf(
-                            ClassName.get(IOException::class.java)
+                            IOException::class.asClassName()
                         ),
                         "setBothThrows" to setOf(
-                            ClassName.get(IllegalStateException::class.java),
-                            ClassName.get(IllegalArgumentException::class.java)
+                            IllegalStateException::class.asClassName(),
+                            IllegalArgumentException::class.asClassName()
                         ),
                     )
                 }
@@ -966,14 +983,14 @@
                     assertThat(method.isExtensionFunction()).isTrue()
                     assertThat(method.parameters.size).isEqualTo(1)
                     assertThat(method.parameters[0].name).isEqualTo("\$this\$ext1")
-                    assertThat(method.parameters[0].type.typeName)
-                        .isEqualTo(String::class.typeName())
+                    assertThat(method.parameters[0].type.asTypeName())
+                        .isEqualTo(String::class.asClassName())
                 }
                 element.getDeclaredMethodByJvmName("ext2").let { method ->
                     assertThat(method.parameters.size).isEqualTo(2)
                     assertThat(method.parameters[0].name).isEqualTo("\$this\$ext2")
-                    assertThat(method.parameters[0].type.typeName)
-                        .isEqualTo(String::class.typeName())
+                    assertThat(method.parameters[0].type.asTypeName())
+                        .isEqualTo(String::class.asClassName())
                     assertThat(method.parameters[1].name).isEqualTo("inputParam")
                 }
                 element.getDeclaredMethodByJvmName("ext3").let { method ->
@@ -985,23 +1002,28 @@
                     )
                 }
                 element.getDeclaredMethodByJvmName("ext4").let { method ->
-                    assertThat(method.parameters[0].type.typeName).isEqualTo(
-                        ParameterizedTypeName.get(
-                            ClassName.get(pkg, "Foo"),
-                            TypeVariableName.get("T")
+                    assertThat(method.parameters[0].type.asTypeName().java).isEqualTo(
+                        JParameterizedTypeName.get(
+                            JClassName.get(pkg, "Foo"),
+                            JTypeVariableName.get("T")
                         )
                     )
+                    if (it.isKsp) {
+                        assertThat(method.parameters[0].type.asTypeName().kotlin).isEqualTo(
+                            KClassName(pkg, "Foo").parameterizedBy(KTypeVariableName("T"))
+                        )
+                    }
                 }
                 element.getDeclaredMethodByJvmName("ext5").let { method ->
-                    assertThat(method.parameters[0].type.typeName)
-                        .isEqualTo(TypeVariableName.get("T"))
+                    assertThat(method.parameters[0].type.asTypeName())
+                        .isEqualTo(createXTypeVariableName("T"))
                 }
                 element.getDeclaredMethodByJvmName("ext6").let { method ->
                     assertThat(method.isSuspendFunction()).isTrue()
                     assertThat(method.isExtensionFunction()).isTrue()
                     assertThat(method.parameters.size).isEqualTo(2)
-                    assertThat(method.parameters[0].type.typeName)
-                        .isEqualTo(String::class.typeName())
+                    assertThat(method.parameters[0].type.asTypeName())
+                        .isEqualTo(String::class.asClassName())
                     assertThat(method.parameters[1].type.typeName).isEqualTo(
                         ParameterizedTypeName.get(
                             ClassName.get("kotlin.coroutines", "Continuation"),
@@ -1013,24 +1035,24 @@
                 element.getDeclaredMethodByJvmName("ext7").let { method ->
                     assertThat(method.isAbstract()).isTrue()
                     assertThat(method.isExtensionFunction()).isTrue()
-                    assertThat(method.parameters[0].type.typeName)
-                        .isEqualTo(TypeVariableName.get("T"))
+                    assertThat(method.parameters[0].type.asTypeName())
+                        .isEqualTo(createXTypeVariableName("T"))
 
                     val fooImpl = it.processingEnv.requireTypeElement("$pkg.FooImpl")
-                    assertThat(method.parameters[0].asMemberOf(fooImpl.type).typeName)
-                        .isEqualTo(TypeName.INT.box())
+                    assertThat(method.parameters[0].asMemberOf(fooImpl.type).asTypeName())
+                        .isEqualTo(Int::class.asClassName())
                 }
                 // Verify non-overridden Foo.ext1() asMemberOf FooImpl
                 element.getDeclaredMethodByJvmName("ext1").let { method ->
                     val fooImpl = it.processingEnv.requireTypeElement("$pkg.FooImpl")
-                    assertThat(method.parameters[0].asMemberOf(fooImpl.type).typeName)
-                        .isEqualTo(String::class.typeName())
+                    assertThat(method.parameters[0].asMemberOf(fooImpl.type).asTypeName())
+                        .isEqualTo(String::class.asClassName())
                 }
                 // Verify non-overridden Foo.ext5() asMemberOf FooImpl
                 element.getDeclaredMethodByJvmName("ext5").let { method ->
                     val fooImpl = it.processingEnv.requireTypeElement("$pkg.FooImpl")
-                    assertThat(method.parameters[0].asMemberOf(fooImpl.type).typeName)
-                        .isEqualTo(TypeName.INT.box())
+                    assertThat(method.parameters[0].asMemberOf(fooImpl.type).asTypeName())
+                        .isEqualTo(Int::class.asClassName())
                 }
             }
         }
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XExecutableTypeTest.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XExecutableTypeTest.kt
index 4bdc27b..bc037bc 100644
--- a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XExecutableTypeTest.kt
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XExecutableTypeTest.kt
@@ -16,9 +16,9 @@
 
 package androidx.room.compiler.processing
 
-import androidx.room.compiler.processing.util.CONTINUATION_CLASS_NAME
+import androidx.room.compiler.processing.util.CONTINUATION_JCLASS_NAME
 import androidx.room.compiler.processing.util.Source
-import androidx.room.compiler.processing.util.UNIT_CLASS_NAME
+import androidx.room.compiler.processing.util.UNIT_JCLASS_NAME
 import androidx.room.compiler.processing.util.getMethodByJvmName
 import androidx.room.compiler.processing.util.runProcessorTest
 import androidx.room.compiler.processing.util.typeName
@@ -120,7 +120,7 @@
             checkMethods("suspendGetT", subject) { type ->
                 assertThat(type.parameterTypes.first().typeName).isEqualTo(
                     ParameterizedTypeName.get(
-                        CONTINUATION_CLASS_NAME,
+                        CONTINUATION_JCLASS_NAME,
                         WildcardTypeName.supertypeOf(String::class.java)
                     )
                 )
@@ -132,8 +132,8 @@
                 )
                 assertThat(type.parameterTypes[1].typeName).isEqualTo(
                     ParameterizedTypeName.get(
-                        CONTINUATION_CLASS_NAME,
-                        WildcardTypeName.supertypeOf(UNIT_CLASS_NAME)
+                        CONTINUATION_JCLASS_NAME,
+                        WildcardTypeName.supertypeOf(UNIT_JCLASS_NAME)
                     )
                 )
                 assertThat(type.returnType.typeName).isEqualTo(TypeName.OBJECT)
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XNullabilityTest.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XNullabilityTest.kt
index 9a28341..4786cff 100644
--- a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XNullabilityTest.kt
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XNullabilityTest.kt
@@ -23,10 +23,13 @@
 import androidx.room.compiler.processing.util.getField
 import androidx.room.compiler.processing.util.getMethodByJvmName
 import androidx.room.compiler.processing.util.getParameter
-import androidx.room.compiler.processing.util.runProcessorTestWithoutKsp
 import androidx.room.compiler.processing.util.runProcessorTest
+import androidx.room.compiler.processing.util.runProcessorTestWithoutKsp
 import com.google.common.truth.Truth.assertThat
-import com.squareup.javapoet.TypeName
+import com.squareup.kotlinpoet.INT
+import com.squareup.kotlinpoet.UNIT
+import com.squareup.kotlinpoet.javapoet.JTypeName
+import org.junit.Assert.fail
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
@@ -258,22 +261,29 @@
     @Test
     fun changeNullability_primitives() {
         runProcessorTest { invocation ->
-            PRIMITIVE_TYPES.forEach { primitiveTypeName ->
-                val primitive = invocation.processingEnv.requireType(primitiveTypeName)
+            PRIMITIVE_JTYPE_NAMES.forEachIndexed { index, primitiveJTypeName ->
+                val primitive = invocation.processingEnv.requireType(primitiveJTypeName)
                 assertThat(primitive.nullability).isEqualTo(NONNULL)
                 val nullable = primitive.makeNullable()
                 assertThat(nullable.nullability).isEqualTo(NULLABLE)
-                assertThat(nullable.typeName).isEqualTo(primitiveTypeName.box())
+                assertThat(nullable.asTypeName().java).isEqualTo(primitiveJTypeName.box())
+                if (invocation.isKsp) {
+                    assertThat(nullable.asTypeName().kotlin)
+                        .isEqualTo(PRIMITIVE_KTYPE_NAMES[index].copy(nullable = true))
+                }
 
                 // When a boxed primitive is marked as non-null, it should stay as boxed primitive
                 // Even though this might be counter-intutive (because making it nullable will box
                 // it) it is more consistent as it is completely valid to annotate a boxed primitive
                 // with non-null while you cannot annoteted a primitive with nullable as it is not
                 // a valid state.
-                val boxedPrimitive = invocation.processingEnv.requireType(primitiveTypeName.box())
+                val boxedPrimitive = invocation.processingEnv.requireType(primitiveJTypeName.box())
                 val nonNull = boxedPrimitive.makeNonNullable()
                 assertThat(nonNull.nullability).isEqualTo(NONNULL)
-                assertThat(nonNull.typeName).isEqualTo(primitiveTypeName.box())
+                assertThat(nonNull.asTypeName().java).isEqualTo(primitiveJTypeName.box())
+                if (invocation.isKsp) {
+                    assertThat(nonNull.asTypeName().kotlin).isEqualTo(PRIMITIVE_KTYPE_NAMES[index])
+                }
             }
         }
     }
@@ -300,15 +310,33 @@
                 val subject = invocation.processingEnv.requireTypeElement(it)
                     .getField("subject").type
                 val typeArg = subject.typeArguments.first()
-                assertThat(typeArg.typeName).isEqualTo(TypeName.INT.box())
+                assertThat(typeArg.asTypeName().java).isEqualTo(JTypeName.INT.box())
                 typeArg.makeNonNullable().let {
-                    assertThat(it.typeName).isEqualTo(TypeName.INT.box())
+                    assertThat(it.asTypeName().java).isEqualTo(JTypeName.INT.box())
                     assertThat(it.nullability).isEqualTo(NONNULL)
                 }
                 typeArg.makeNonNullable().makeNullable().let {
-                    assertThat(it.typeName).isEqualTo(TypeName.INT.box())
+                    assertThat(it.asTypeName().java).isEqualTo(JTypeName.INT.box())
                     assertThat(it.nullability).isEqualTo(NULLABLE)
                 }
+                if (invocation.isKsp) {
+                    assertThat(typeArg.asTypeName().kotlin).isEqualTo(
+                        when (it) {
+                            "KotlinClass" -> INT.copy(nullable = true)
+                            // A type arg from Java has unknown nullability,
+                            // so name defaults to not-null
+                            "JavaClass" -> INT
+                            else -> fail("Unknown src $it")
+                        }
+                    )
+
+                    typeArg.makeNonNullable().let {
+                        assertThat(it.asTypeName().kotlin).isEqualTo(INT)
+                    }
+                    typeArg.makeNonNullable().makeNullable().let {
+                        assertThat(it.asTypeName().kotlin).isEqualTo(INT.copy(nullable = true))
+                    }
+                }
             }
         }
     }
@@ -367,24 +395,42 @@
         runProcessorTest(sources = listOf(src)) { invocation ->
             val voidType = invocation.processingEnv.requireTypeElement("Foo")
                 .getMethodByJvmName("subject").returnType
-            assertThat(voidType.typeName).isEqualTo(TypeName.VOID)
+            assertThat(voidType.asTypeName().java).isEqualTo(JTypeName.VOID)
             voidType.makeNullable().let {
                 assertThat(it.nullability).isEqualTo(NULLABLE)
-                assertThat(it.typeName).isEqualTo(TypeName.VOID.box())
+                assertThat(it.asTypeName().java).isEqualTo(JTypeName.VOID.box())
+            }
+            if (invocation.isKsp) {
+                assertThat(voidType.asTypeName().kotlin).isEqualTo(UNIT)
+                voidType.makeNullable().let {
+                    // `Unit?` does not make sense so XTypeName's KotlinPoet is non-null Unit
+                    assertThat(it.asTypeName().kotlin).isEqualTo(UNIT)
+                }
             }
         }
     }
 
     companion object {
-        val PRIMITIVE_TYPES = listOf(
-            TypeName.BOOLEAN,
-            TypeName.BYTE,
-            TypeName.SHORT,
-            TypeName.INT,
-            TypeName.LONG,
-            TypeName.CHAR,
-            TypeName.FLOAT,
-            TypeName.DOUBLE,
+        val PRIMITIVE_JTYPE_NAMES = listOf(
+            JTypeName.BOOLEAN,
+            JTypeName.BYTE,
+            JTypeName.SHORT,
+            JTypeName.INT,
+            JTypeName.LONG,
+            JTypeName.CHAR,
+            JTypeName.FLOAT,
+            JTypeName.DOUBLE,
+        )
+
+        val PRIMITIVE_KTYPE_NAMES = listOf(
+            com.squareup.kotlinpoet.BOOLEAN,
+            com.squareup.kotlinpoet.BYTE,
+            com.squareup.kotlinpoet.SHORT,
+            com.squareup.kotlinpoet.INT,
+            com.squareup.kotlinpoet.LONG,
+            com.squareup.kotlinpoet.CHAR,
+            com.squareup.kotlinpoet.FLOAT,
+            com.squareup.kotlinpoet.DOUBLE,
         )
     }
 }
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XProcessingEnvTest.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XProcessingEnvTest.kt
index a66452a..daad3ba 100644
--- a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XProcessingEnvTest.kt
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XProcessingEnvTest.kt
@@ -16,6 +16,7 @@
 
 package androidx.room.compiler.processing
 
+import androidx.room.compiler.codegen.XClassName
 import androidx.room.compiler.processing.util.Source
 import androidx.room.compiler.processing.util.runProcessorTest
 import com.google.common.truth.Truth.assertThat
@@ -23,11 +24,12 @@
 import com.squareup.javapoet.JavaFile
 import com.squareup.javapoet.TypeName
 import com.squareup.javapoet.TypeSpec
+import com.squareup.kotlinpoet.javapoet.JClassName
+import javax.lang.model.element.Modifier
+import javax.tools.Diagnostic
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
-import javax.lang.model.element.Modifier
-import javax.tools.Diagnostic
 
 @RunWith(JUnit4::class)
 class XProcessingEnvTest {
@@ -38,20 +40,20 @@
                 Source.java(
                     "foo.bar.Baz",
                     """
-                package foo.bar;
-                public class Baz {
-                }
+                    package foo.bar;
+                    public class Baz {
+                    }
                     """.trimIndent()
                 )
             )
         ) {
             val qName = "java.util.List"
-            val className = ClassName.get("java.util", "List")
+            val jClassName = JClassName.get("java.util", "List")
             val klass = List::class
             val element = it.processingEnv.requireTypeElement(qName)
             assertThat(element).isNotNull()
-            assertThat(element.className).isEqualTo(
-                className
+            assertThat(element.asClassName().java).isEqualTo(
+                jClassName
             )
 
             val type = element.type
@@ -60,14 +62,14 @@
                 it.processingEnv.findTypeElement(qName)
             ).isEqualTo(element)
             assertThat(
-                it.processingEnv.findTypeElement(className)
+                it.processingEnv.findTypeElement(jClassName)
             ).isEqualTo(element)
             assertThat(
                 it.processingEnv.findTypeElement(klass)
             ).isEqualTo(element)
 
             assertThat(
-                it.processingEnv.requireTypeElement(className)
+                it.processingEnv.requireTypeElement(jClassName)
             ).isEqualTo(element)
             assertThat(
                 it.processingEnv.requireTypeElement(klass)
@@ -77,14 +79,14 @@
                 it.processingEnv.findType(qName)
             ).isEqualTo(type)
             assertThat(
-                it.processingEnv.findType(className)
+                it.processingEnv.findType(jClassName)
             ).isEqualTo(type)
             assertThat(
                 it.processingEnv.findType(klass)
             ).isEqualTo(type)
 
             assertThat(
-                it.processingEnv.requireType(className)
+                it.processingEnv.requireType(jClassName)
             ).isEqualTo(type)
             assertThat(
                 it.processingEnv.requireType(klass)
@@ -116,8 +118,8 @@
             val element = it.processingEnv.requireTypeElement("foo.bar.Baz")
             assertThat(element.packageName).isEqualTo("foo.bar")
             assertThat(element.name).isEqualTo("Baz")
-            assertThat(element.className)
-                .isEqualTo(ClassName.get("foo.bar", "Baz"))
+            assertThat(element.asClassName())
+                .isEqualTo(XClassName.get("foo.bar", "Baz"))
             assertThat(element.findPrimaryConstructor()).isNull()
             assertThat(element.getConstructors()).hasSize(1)
             assertThat(element.getDeclaredMethods()).hasSize(2)
@@ -164,10 +166,9 @@
         )
         runProcessorTest(sources = listOf(src)) {
             it.processingEnv.requireTypeElement("foo.bar.Outer.Inner").let {
-                val className = it.className
-                assertThat(className.packageName()).isEqualTo("foo.bar")
-                assertThat(className.simpleNames()).containsExactly("Outer", "Inner")
-                assertThat(className.simpleName()).isEqualTo("Inner")
+                val className = it.asClassName()
+                assertThat(className.packageName).isEqualTo("foo.bar")
+                assertThat(className.simpleNames).containsExactly("Outer", "Inner")
             }
         }
     }
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XProcessingStepTest.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XProcessingStepTest.kt
index 97a8b97..036604c 100644
--- a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XProcessingStepTest.kt
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XProcessingStepTest.kt
@@ -25,7 +25,7 @@
 import androidx.room.compiler.processing.testcode.SingleTypeValueAnnotation
 import androidx.room.compiler.processing.util.CompilationTestCapabilities
 import androidx.room.compiler.processing.util.Source
-import androidx.room.compiler.processing.util.className
+import androidx.room.compiler.processing.util.asJClassName
 import androidx.room.compiler.processing.util.compiler.TestCompilationArguments
 import androidx.room.compiler.processing.util.compiler.compile
 import com.google.common.truth.Truth.assertAbout
@@ -40,13 +40,12 @@
 import com.squareup.javapoet.AnnotationSpec
 import com.squareup.javapoet.ClassName
 import com.squareup.javapoet.JavaFile
-import com.squareup.javapoet.TypeName
 import com.squareup.javapoet.TypeSpec
+import javax.tools.Diagnostic
+import kotlin.reflect.KClass
 import org.junit.Rule
 import org.junit.Test
 import org.junit.rules.TemporaryFolder
-import javax.tools.Diagnostic
-import kotlin.reflect.KClass
 
 class XProcessingStepTest {
     @field:Rule
@@ -130,7 +129,7 @@
 
     @Test
     fun multiStepProcessing() {
-        val otherAnnotatedElements = mutableListOf<TypeName>()
+        val otherAnnotatedElements = mutableListOf<String>()
         // create a scenario where we run multi-step processing so that we can test caching
         val processingStep = object : XProcessingStep {
             override fun process(
@@ -161,7 +160,7 @@
                 elementsByAnnotation[OtherAnnotation::class.qualifiedName]
                     ?.filterIsInstance<XTypeElement>()
                     ?.forEach {
-                        otherAnnotatedElements.add(it.type.typeName)
+                        otherAnnotatedElements.add(it.type.toString())
                     }
                 return emptySet()
             }
@@ -197,9 +196,7 @@
                 override fun processingSteps() = listOf(processingStep)
             }
         ).compilesWithoutError()
-        assertThat(otherAnnotatedElements).containsExactly(
-            ClassName.get("foo.bar", "Main_Impl")
-        )
+        assertThat(otherAnnotatedElements).containsExactly("foo.bar.Main_Impl")
     }
 
     @Test
@@ -848,14 +845,15 @@
                     elementsByAnnotation[MainAnnotation::class.qualifiedName!!]!!.single()
                 try {
                     val otherElement = env.requireTypeElement(
-                        mainElement.requireAnnotation(MainAnnotation::class.className())
-                            .getAsType("singleType")
-                            .typeName
+                        mainElement.requireAnnotation(
+                            MainAnnotation::class.asJClassName()
+                        ).getAsType("singleType").asTypeName().java
                     )
                     val generatedType =
-                        otherElement.requireAnnotation(SingleTypeValueAnnotation::class.className())
-                            .getAsType("value")
-                    assertThat(generatedType.typeName).isEqualTo(genClassName)
+                        otherElement.requireAnnotation(
+                            SingleTypeValueAnnotation::class.asJClassName()
+                        ).getAsType("value")
+                    assertThat(generatedType.asTypeName().java).isEqualTo(genClassName)
                     return emptySet()
                 } catch (ex: TypeNotPresentException) {
                     return setOf(mainElement)
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XRoundEnvTest.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XRoundEnvTest.kt
index 181755d..9fba451 100644
--- a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XRoundEnvTest.kt
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XRoundEnvTest.kt
@@ -16,6 +16,8 @@
 
 package androidx.room.compiler.processing
 
+import androidx.room.compiler.codegen.XClassName
+import androidx.room.compiler.codegen.XTypeName
 import androidx.room.compiler.processing.testcode.OtherAnnotation
 import androidx.room.compiler.processing.util.Source
 import androidx.room.compiler.processing.util.getDeclaredMethodByJvmName
@@ -24,8 +26,9 @@
 import androidx.room.compiler.processing.util.runKspTest
 import androidx.room.compiler.processing.util.runProcessorTest
 import com.google.common.truth.Truth.assertThat
-import com.squareup.javapoet.ClassName
-import com.squareup.javapoet.TypeName
+import com.squareup.kotlinpoet.INT
+import com.squareup.kotlinpoet.UNIT
+import com.squareup.kotlinpoet.javapoet.JTypeName
 import org.junit.Test
 
 class XRoundEnvTest {
@@ -35,7 +38,7 @@
         val source = Source.kotlin(
             "Baz.kt",
             """
-            import androidx.room.compiler.processing.testcode.OtherAnnotation;
+            import androidx.room.compiler.processing.testcode.OtherAnnotation
             @OtherAnnotation(value="xx")
             class Baz {
                 @OtherAnnotation(value="xx")
@@ -80,7 +83,7 @@
         val source = Source.kotlin(
             "Baz.kt",
             """
-            import androidx.room.compiler.processing.testcode.OtherAnnotation;
+            import androidx.room.compiler.processing.testcode.OtherAnnotation
             class Baz {
                 @get:OtherAnnotation(value="xx")
                 var myProperty1: Int = 0
@@ -116,7 +119,7 @@
         val source = Source.kotlin(
             "Baz.kt",
             """
-            import androidx.room.compiler.processing.XRoundEnvTest.PropertyAnnotation;
+            import androidx.room.compiler.processing.XRoundEnvTest.PropertyAnnotation
             class Baz {
                 @PropertyAnnotation
                 fun myFun(): Int = 0
@@ -147,8 +150,8 @@
             assertThat(annotatedElements).hasSize(1)
             val subject = annotatedElements.filterIsInstance<XMethodElement>().first()
             assertThat(subject.jvmName).isEqualTo("myFun")
-            assertThat(subject.enclosingElement.className).isEqualTo(
-                ClassName.get("", "BazKt")
+            assertThat(subject.enclosingElement.asClassName()).isEqualTo(
+                XClassName.get("", "BazKt")
             )
             assertThat(subject.isStatic()).isTrue()
         }
@@ -183,34 +186,31 @@
                     else -> error("unexpected type $it")
                 }
             }
-            val containerClassName = ClassName.get("foo.bar", "MyCustomClass")
+            val containerClassName = XClassName.get("foo.bar", "MyCustomClass")
             assertThat(byName.keys).containsExactly(
                 "getMyPropertyGetter",
                 "setMyPropertySetter",
                 "myProperty"
             )
             (byName["getMyPropertyGetter"] as XMethodElement).let {
-                assertThat(it.returnType.typeName).isEqualTo(TypeName.INT)
+                assertThat(it.returnType.asTypeName()).isEqualTo(XTypeName.PRIMITIVE_INT)
                 assertThat(it.parameters).hasSize(0)
-                assertThat(it.enclosingElement.className).isEqualTo(
-                    containerClassName
-                )
+                assertThat(it.enclosingElement.asClassName()).isEqualTo(containerClassName)
                 assertThat(it.isStatic()).isTrue()
             }
             (byName["setMyPropertySetter"] as XMethodElement).let {
-                assertThat(it.returnType.typeName).isEqualTo(TypeName.VOID)
+                assertThat(it.returnType.asTypeName().java).isEqualTo(JTypeName.VOID)
+                assertThat(it.returnType.asTypeName().kotlin).isEqualTo(UNIT)
                 assertThat(it.parameters).hasSize(1)
-                assertThat(it.parameters.first().type.typeName).isEqualTo(TypeName.INT)
-                assertThat(it.enclosingElement.className).isEqualTo(
-                    containerClassName
-                )
+                assertThat(it.parameters.first().type.asTypeName())
+                    .isEqualTo(XTypeName.PRIMITIVE_INT)
+                assertThat(it.enclosingElement.asClassName()).isEqualTo(containerClassName)
                 assertThat(it.isStatic()).isTrue()
             }
             (byName["myProperty"] as XFieldElement).let {
-                assertThat(it.type.typeName).isEqualTo(TypeName.INT)
-                assertThat(it.enclosingElement.className).isEqualTo(
-                    containerClassName
-                )
+                assertThat(it.type.asTypeName().java).isEqualTo(JTypeName.INT)
+                assertThat(it.type.asTypeName().kotlin).isEqualTo(INT)
+                assertThat(it.enclosingElement.asClassName()).isEqualTo(containerClassName)
                 assertThat(it.isStatic()).isTrue()
             }
         }
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XTypeElementTest.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XTypeElementTest.kt
index c1134d4..243f014 100644
--- a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XTypeElementTest.kt
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XTypeElementTest.kt
@@ -16,19 +16,29 @@
 
 package androidx.room.compiler.processing
 
+import androidx.room.compiler.codegen.XClassName
+import androidx.room.compiler.codegen.XTypeName
+import androidx.room.compiler.codegen.asClassName
 import androidx.room.compiler.processing.util.Source
 import androidx.room.compiler.processing.util.XTestInvocation
+import androidx.room.compiler.processing.util.asKClassName
+import androidx.room.compiler.processing.util.asMutableKClassName
 import androidx.room.compiler.processing.util.compileFiles
+import androidx.room.compiler.processing.util.createXTypeVariableName
 import androidx.room.compiler.processing.util.getAllFieldNames
 import androidx.room.compiler.processing.util.getField
 import androidx.room.compiler.processing.util.getMethodByJvmName
 import androidx.room.compiler.processing.util.runProcessorTest
 import com.google.common.truth.Truth.assertThat
 import com.google.common.truth.Truth.assertWithMessage
-import com.squareup.javapoet.ClassName
-import com.squareup.javapoet.ParameterizedTypeName
-import com.squareup.javapoet.TypeName
-import com.squareup.javapoet.TypeVariableName
+import com.squareup.kotlinpoet.INT
+import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy
+import com.squareup.kotlinpoet.javapoet.JClassName
+import com.squareup.kotlinpoet.javapoet.JParameterizedTypeName
+import com.squareup.kotlinpoet.javapoet.JTypeName
+import com.squareup.kotlinpoet.javapoet.JTypeVariableName
+import com.squareup.kotlinpoet.javapoet.KClassName
+import com.squareup.kotlinpoet.javapoet.KTypeVariableName
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
@@ -67,29 +77,35 @@
                 assertThat(it.packageName).isEqualTo("")
                 assertThat(it.name).isEqualTo("TopLevel")
                 assertThat(it.qualifiedName).isEqualTo("TopLevel")
-                assertThat(it.className).isEqualTo(ClassName.get("", "TopLevel"))
+                assertThat(it.asClassName().java)
+                    .isEqualTo(JClassName.get("", "TopLevel"))
+                if (invocation.isKsp) {
+                    assertThat(it.asClassName().kotlin)
+                        .isEqualTo(KClassName("", "TopLevel"))
+                } else {
+                    // In javac / kapt we don't have KotlinPoet names
+                    assertThat(it.asClassName().kotlin)
+                        .isEqualTo(XTypeName.UNAVAILABLE_KTYPE_NAME)
+                }
             }
             invocation.processingEnv.requireTypeElement("foo.bar.InFooBar").let {
                 assertThat(it.packageName).isEqualTo("foo.bar")
                 assertThat(it.name).isEqualTo("InFooBar")
                 assertThat(it.qualifiedName).isEqualTo("foo.bar.InFooBar")
-                assertThat(it.className).isEqualTo(ClassName.get("foo.bar", "InFooBar"))
+                assertThat(it.asClassName()).isEqualTo(XClassName.get("foo.bar", "InFooBar"))
             }
             invocation.processingEnv.requireTypeElement("foo.bar.Outer").let {
                 assertThat(it.packageName).isEqualTo("foo.bar")
                 assertThat(it.name).isEqualTo("Outer")
                 assertThat(it.qualifiedName).isEqualTo("foo.bar.Outer")
-                assertThat(it.className).isEqualTo(
-                    ClassName.get("foo.bar", "Outer")
-                )
+                assertThat(it.asClassName()).isEqualTo(XClassName.get("foo.bar", "Outer"))
             }
             invocation.processingEnv.requireTypeElement("foo.bar.Outer.Nested").let {
                 assertThat(it.packageName).isEqualTo("foo.bar")
                 assertThat(it.name).isEqualTo("Nested")
                 assertThat(it.qualifiedName).isEqualTo("foo.bar.Outer.Nested")
-                assertThat(it.className).isEqualTo(
-                    ClassName.get("foo.bar", "Outer", "Nested")
-                )
+                assertThat(it.asClassName())
+                    .isEqualTo(XClassName.get("foo.bar", "Outer", "Nested"))
             }
             if (invocation.isKsp) {
                 // these are KSP specific tests, typenames are tested elsewhere
@@ -98,11 +114,15 @@
                     assertThat(it.packageName).isEqualTo("kotlin")
                     assertThat(it.name).isEqualTo("Int")
                     assertThat(it.qualifiedName).isEqualTo("kotlin.Int")
+                    assertThat(it.asClassName().java).isEqualTo(JTypeName.INT.box())
+                    assertThat(it.asClassName().kotlin).isEqualTo(INT)
                 }
                 invocation.processingEnv.requireTypeElement("kotlin.Int").let {
                     assertThat(it.packageName).isEqualTo("kotlin")
                     assertThat(it.name).isEqualTo("Int")
                     assertThat(it.qualifiedName).isEqualTo("kotlin.Int")
+                    assertThat(it.asClassName().java).isEqualTo(JTypeName.INT.box())
+                    assertThat(it.asClassName().kotlin).isEqualTo(INT)
                 }
             }
         }
@@ -113,12 +133,11 @@
         val src = Source.kotlin(
             "foo.kt",
             """
-            package foo.bar;
-            class Baz : MyInterface, AbstractClass() {
-            }
-            abstract class AbstractClass {}
-            interface MyInterface {}
-            interface AnotherInterface : MyInterface {}
+            package foo.bar
+            class Baz : MyInterface, AbstractClass()
+            abstract class AbstractClass
+            interface MyInterface
+            interface AnotherInterface : MyInterface
             """.trimIndent()
         )
         runProcessorTest(sources = listOf(src)) { invocation ->
@@ -139,10 +158,10 @@
             }
             invocation.processingEnv.requireTypeElement("foo.bar.AbstractClass").let {
                 assertThat(it.superClass).isEqualTo(
-                    invocation.processingEnv.requireType(TypeName.OBJECT)
+                    invocation.processingEnv.requireType(JTypeName.OBJECT)
                 )
                 assertThat(it.superTypes).containsExactly(
-                    invocation.processingEnv.requireType(TypeName.OBJECT)
+                    invocation.processingEnv.requireType(JTypeName.OBJECT)
                 )
                 assertThat(it.isAbstract()).isTrue()
                 assertThat(it.isInterface()).isFalse()
@@ -153,7 +172,7 @@
             invocation.processingEnv.requireTypeElement("foo.bar.MyInterface").let {
                 assertThat(it.superClass).isNull()
                 assertThat(it.superTypes).containsExactly(
-                    invocation.processingEnv.requireType(TypeName.OBJECT)
+                    invocation.processingEnv.requireType(JTypeName.OBJECT)
                 )
                 assertThat(it.isInterface()).isTrue()
                 assertThat(it.type).isEqualTo(
@@ -178,11 +197,10 @@
         val src = Source.kotlin(
             "foo.kt",
             """
-            package foo.bar;
-            class Baz : MyInterface<String>, AbstractClass() {
-            }
-            abstract class AbstractClass {}
-            interface MyInterface<E> {}
+            package foo.bar
+            class Baz : MyInterface<String>, AbstractClass()
+            abstract class AbstractClass
+            interface MyInterface<E>
             """.trimIndent()
         )
         runProcessorTest(sources = listOf(src)) { invocation ->
@@ -192,8 +210,12 @@
                     type.rawType.toString() == "foo.bar.MyInterface"
                 }
                 assertThat(superInterface.typeArguments).hasSize(1)
-                assertThat(superInterface.typeArguments[0].typeName)
-                    .isEqualTo(ClassName.get("java.lang", "String"))
+                assertThat(superInterface.typeArguments[0].asTypeName().java)
+                    .isEqualTo(JClassName.get("java.lang", "String"))
+                if (invocation.isKsp) {
+                    assertThat(superInterface.typeArguments[0].asTypeName().kotlin)
+                        .isEqualTo(KClassName("kotlin", "String"))
+                }
             }
         }
     }
@@ -203,7 +225,7 @@
         val src = Source.kotlin(
             "Foo.kt",
             """
-            package foo.bar;
+            package foo.bar
             class Outer {
                 class Inner
             }
@@ -211,12 +233,14 @@
         )
         runProcessorTest(sources = listOf(src)) { invocation ->
             invocation.processingEnv.requireTypeElement("foo.bar.Outer").let {
-                assertThat(it.className).isEqualTo(ClassName.get("foo.bar", "Outer"))
+                assertThat(it.asClassName())
+                    .isEqualTo(XClassName.get("foo.bar", "Outer"))
                 assertThat(it.isNested()).isFalse()
                 assertThat(it.enclosingTypeElement).isNull()
             }
             invocation.processingEnv.requireTypeElement("foo.bar.Outer.Inner").let {
-                assertThat(it.className).isEqualTo(ClassName.get("foo.bar", "Outer", "Inner"))
+                assertThat(it.asClassName())
+                    .isEqualTo(XClassName.get("foo.bar", "Outer", "Inner"))
                 assertThat(it.packageName).isEqualTo("foo.bar")
                 assertThat(it.name).isEqualTo("Inner")
                 assertThat(it.isNested()).isTrue()
@@ -386,16 +410,17 @@
             val baseMethod = baseClass.getMethodByJvmName("baseMethod")
             baseMethod.asMemberOf(subClass.type).let { methodType ->
                 val genericArg = methodType.parameterTypes.first()
-                assertThat(genericArg.typeName).isEqualTo(TypeName.INT.box())
+                assertThat(genericArg.asTypeName()).isEqualTo(Int::class.asClassName())
             }
 
             baseClass.getField("genericProp").let { field ->
-                assertThat(field.type.typeName).isEqualTo(TypeVariableName.get("T"))
+                assertThat(field.type.asTypeName()).isEqualTo(createXTypeVariableName("T"))
             }
 
             subClass.getField("genericProp").let { field ->
                 // this is tricky because even though it is non-null it, it should still be boxed
-                assertThat(field.asMemberOf(subClass.type).typeName).isEqualTo(TypeName.INT.box())
+                assertThat(field.asMemberOf(subClass.type).asTypeName())
+                    .isEqualTo(Int::class.asClassName())
             }
         }
     }
@@ -418,16 +443,22 @@
             assertThat(baseClass.getAllFieldNames()).containsExactly("value")
             val subClass = invocation.processingEnv.requireTypeElement("SubClass")
             assertThat(subClass.getAllFieldNames()).containsExactly("value")
-            assertThat(
-                baseClass.getField("value").type.typeName
-            ).isEqualTo(
-                ParameterizedTypeName.get(List::class.java, Integer::class.java)
+            val baseFieldType = baseClass.getField("value").type
+            val subFieldType = subClass.getField("value").type
+            assertThat(baseFieldType.asTypeName().java).isEqualTo(
+                JParameterizedTypeName.get(List::class.java, Integer::class.java)
             )
-            assertThat(
-                subClass.getField("value").type.typeName
-            ).isEqualTo(
-                ParameterizedTypeName.get(List::class.java, Integer::class.java)
+            assertThat(subFieldType.asTypeName().java).isEqualTo(
+                JParameterizedTypeName.get(List::class.java, Integer::class.java)
             )
+            if (invocation.isKsp) {
+                assertThat(baseFieldType.asTypeName().kotlin).isEqualTo(
+                    List::class.asKClassName().parameterizedBy(INT)
+                )
+                assertThat(subFieldType.asTypeName().kotlin).isEqualTo(
+                    List::class.asMutableKClassName().parameterizedBy(INT)
+                )
+            }
         }
     }
 
@@ -436,7 +467,7 @@
         fun buildSrc(pkg: String) = Source.kotlin(
             "Foo.kt",
             """
-            package $pkg;
+            package $pkg
             class Subject {
                 val realField: String = ""
                     get() = field
@@ -495,7 +526,7 @@
         fun buildSource(pkg: String) = Source.kotlin(
             "Foo.kt",
             """
-            package $pkg;
+            package $pkg
             abstract class Subject {
                 val value: String = ""
                 abstract val abstractValue: String
@@ -746,7 +777,7 @@
         fun buildSrc(pkg: String) = Source.kotlin(
             "Foo.kt",
             """
-            package $pkg;
+            package $pkg
             interface Parent<T> {
                 fun parent(t: T)
             }
@@ -1415,7 +1446,7 @@
                     VAL1(1),
                     VAL2(2);
 
-                    fun enumMethod():Unit {}
+                    fun enumMethod(): Unit {}
                 }
                 """.trimIndent()
             ),
@@ -1568,7 +1599,7 @@
                 Source.kotlin(
                     "test.ConcreteClass.kt",
                     """
-                    package test;
+                    package test
                     class ConcreteClass: AbstractClass<Foo, Bar>() {}
                     abstract class AbstractClass<T1, T2> {
                         fun method(t1: T1, t2: T2): T2 {
@@ -1593,23 +1624,32 @@
                     method = method,
                     name = "method",
                     enclosingElement = abstractClass,
-                    returnType = TypeVariableName.get("T2"),
-                    parameterTypes = arrayOf(TypeVariableName.get("T1"), TypeVariableName.get("T2"))
+                    returnType = createXTypeVariableName("T2"),
+                    parameterTypes = arrayOf(
+                        createXTypeVariableName("T1"),
+                        createXTypeVariableName("T2")
+                    )
                 )
                 checkMethodType(
                     methodType = method.executableType,
-                    returnType = TypeVariableName.get("T2"),
-                    parameterTypes = arrayOf(TypeVariableName.get("T1"), TypeVariableName.get("T2"))
+                    returnType = createXTypeVariableName("T2"),
+                    parameterTypes = arrayOf(
+                        createXTypeVariableName("T1"),
+                        createXTypeVariableName("T2")
+                    )
                 )
                 checkMethodType(
                     methodType = method.asMemberOf(abstractClass.type),
-                    returnType = TypeVariableName.get("T2"),
-                    parameterTypes = arrayOf(TypeVariableName.get("T1"), TypeVariableName.get("T2"))
+                    returnType = createXTypeVariableName("T2"),
+                    parameterTypes = arrayOf(
+                        createXTypeVariableName("T1"),
+                        createXTypeVariableName("T2")
+                    )
                 )
                 checkMethodType(
                     methodType = method.asMemberOf(concreteClass.type),
-                    returnType = barType.typeName,
-                    parameterTypes = arrayOf(fooType.typeName, barType.typeName)
+                    returnType = barType.asTypeName(),
+                    parameterTypes = arrayOf(fooType.asTypeName(), barType.asTypeName())
                 )
             }
 
@@ -1626,7 +1666,7 @@
                 Source.kotlin(
                     "test.ConcreteClass.kt",
                     """
-                    package test;
+                    package test
                     class ConcreteClass: AbstractClass<Foo, Bar>() {
                         override fun method(t1: Foo, t2: Bar): Bar {
                           return t2
@@ -1656,23 +1696,32 @@
                 method = abstractClassMethod,
                 name = "method",
                 enclosingElement = abstractClass,
-                returnType = TypeVariableName.get("T2"),
-                parameterTypes = arrayOf(TypeVariableName.get("T1"), TypeVariableName.get("T2"))
+                returnType = createXTypeVariableName("T2"),
+                parameterTypes = arrayOf(
+                    createXTypeVariableName("T1"),
+                    createXTypeVariableName("T2")
+                )
             )
             checkMethodType(
                 methodType = abstractClassMethod.executableType,
-                returnType = TypeVariableName.get("T2"),
-                parameterTypes = arrayOf(TypeVariableName.get("T1"), TypeVariableName.get("T2"))
+                returnType = createXTypeVariableName("T2"),
+                parameterTypes = arrayOf(
+                    createXTypeVariableName("T1"),
+                    createXTypeVariableName("T2")
+                )
             )
             checkMethodType(
                 methodType = abstractClassMethod.asMemberOf(abstractClass.type),
-                returnType = TypeVariableName.get("T2"),
-                parameterTypes = arrayOf(TypeVariableName.get("T1"), TypeVariableName.get("T2"))
+                returnType = createXTypeVariableName("T2"),
+                parameterTypes = arrayOf(
+                    createXTypeVariableName("T1"),
+                    createXTypeVariableName("T2"),
+                )
             )
             checkMethodType(
                 methodType = abstractClassMethod.asMemberOf(concreteClass.type),
-                returnType = barType.typeName,
-                parameterTypes = arrayOf(fooType.typeName, barType.typeName)
+                returnType = barType.asTypeName(),
+                parameterTypes = arrayOf(fooType.asTypeName(), barType.asTypeName())
             )
 
             // Check the concrete method and method type
@@ -1680,18 +1729,18 @@
                 method = concreteClassMethod,
                 name = "method",
                 enclosingElement = concreteClass,
-                returnType = barType.typeName,
-                parameterTypes = arrayOf(fooType.typeName, barType.typeName)
+                returnType = barType.asTypeName(),
+                parameterTypes = arrayOf(fooType.asTypeName(), barType.asTypeName())
             )
             checkMethodType(
                 methodType = concreteClassMethod.executableType,
-                returnType = barType.typeName,
-                parameterTypes = arrayOf(fooType.typeName, barType.typeName)
+                returnType = barType.asTypeName(),
+                parameterTypes = arrayOf(fooType.asTypeName(), barType.asTypeName())
             )
             checkMethodType(
                 methodType = concreteClassMethod.asMemberOf(concreteClass.type),
-                returnType = barType.typeName,
-                parameterTypes = arrayOf(fooType.typeName, barType.typeName)
+                returnType = barType.asTypeName(),
+                parameterTypes = arrayOf(fooType.asTypeName(), barType.asTypeName())
             )
         }
     }
@@ -1700,23 +1749,23 @@
         method: XMethodElement,
         name: String,
         enclosingElement: XTypeElement,
-        returnType: TypeName,
-        parameterTypes: Array<TypeName>
+        returnType: XTypeName,
+        parameterTypes: Array<XTypeName>
     ) {
         assertThat(method.name).isEqualTo(name)
         assertThat(method.enclosingElement).isEqualTo(enclosingElement)
-        assertThat(method.returnType.typeName).isEqualTo(returnType)
-        assertThat(method.parameters.map { it.type.typeName })
+        assertThat(method.returnType.asTypeName()).isEqualTo(returnType)
+        assertThat(method.parameters.map { it.type.asTypeName() })
             .containsExactly(*parameterTypes)
             .inOrder()
     }
     private fun checkMethodType(
         methodType: XMethodType,
-        returnType: TypeName,
-        parameterTypes: Array<TypeName>
+        returnType: XTypeName,
+        parameterTypes: Array<XTypeName>
     ) {
-        assertThat(methodType.returnType.typeName).isEqualTo(returnType)
-        assertThat(methodType.parameterTypes.map { it.typeName })
+        assertThat(methodType.returnType.asTypeName()).isEqualTo(returnType)
+        assertThat(methodType.parameterTypes.map { it.asTypeName() })
             .containsExactly(*parameterTypes)
             .inOrder()
     }
@@ -1728,7 +1777,7 @@
                 Source.kotlin(
                     "test.ConcreteClass.kt",
                     """
-                    package test;
+                    package test
                     class ConcreteClass(foo: Foo): AbstractClass<Foo>(foo) {}
                     abstract class AbstractClass<T>(t: T)
                     class Foo
@@ -1742,17 +1791,25 @@
 
             fun checkConstructorParameters(
                 typeElement: XTypeElement,
-                expectedParameters: Array<TypeName>
+                expectedParameters: Array<XTypeName>
             ) {
                 assertThat(typeElement.getConstructors()).hasSize(1)
                 val constructor = typeElement.getConstructors()[0]
-                assertThat(constructor.parameters.map { it.type.typeName })
+                assertThat(constructor.parameters.map { it.type.asTypeName() })
                     .containsExactly(*expectedParameters)
                     .inOrder()
             }
 
-            checkConstructorParameters(abstractClass, arrayOf(TypeVariableName.get("T")))
-            checkConstructorParameters(concreteClass, arrayOf(fooType.typeName))
+            checkConstructorParameters(
+                typeElement = abstractClass,
+                expectedParameters = arrayOf(
+                    createXTypeVariableName("T")
+                )
+            )
+            checkConstructorParameters(
+                typeElement = concreteClass,
+                expectedParameters = arrayOf(fooType.asTypeName())
+            )
         }
     }
 
@@ -1763,7 +1820,7 @@
                 Source.kotlin(
                     "test.ConcreteClass.kt",
                     """
-                    package test;
+                    package test
                     class ConcreteClass: AbstractClass<Foo>()
                     abstract class AbstractClass<T> {
                         val field: T = TODO()
@@ -1781,11 +1838,18 @@
 
             fun checkFieldElement(field: XFieldElement) {
                 assertThat(field.name).isEqualTo("field")
-                assertThat(field.type.typeName).isEqualTo(TypeVariableName.get("T"))
-                assertThat(field.asMemberOf(abstractClass.type).typeName)
-                    .isEqualTo(TypeVariableName.get("T"))
-                assertThat(field.asMemberOf(concreteClass.type).typeName)
-                    .isEqualTo(fooType.typeName)
+                assertThat(field.type.asTypeName().java).isEqualTo(JTypeVariableName.get("T"))
+                assertThat(field.asMemberOf(abstractClass.type).asTypeName().java)
+                    .isEqualTo(JTypeVariableName.get("T"))
+                assertThat(field.asMemberOf(concreteClass.type).asTypeName().java)
+                    .isEqualTo(fooType.asTypeName().java)
+                if (invocation.isKsp) {
+                    assertThat(field.type.asTypeName().kotlin).isEqualTo(KTypeVariableName("T"))
+                    assertThat(field.asMemberOf(abstractClass.type).asTypeName().kotlin)
+                        .isEqualTo(KTypeVariableName("T"))
+                    assertThat(field.asMemberOf(concreteClass.type).asTypeName().kotlin)
+                        .isEqualTo(fooType.asTypeName().kotlin)
+                }
             }
 
             assertThat(concreteClassField).isEqualTo(abstractClassField)
@@ -1814,9 +1878,9 @@
     private fun XMethodElement.signature(owner: XType): String {
         val methodType = this.asMemberOf(owner)
         val params = methodType.parameterTypes.joinToString(",") {
-            it.typeName.toString()
+            it.asTypeName().java.toString()
         }
-        return "$jvmName($params):${returnType.typeName}"
+        return "$jvmName($params):${returnType.asTypeName().java}"
     }
 
     private fun XTestInvocation.nonObjectMethodSignatures(typeElement: XTypeElement): List<String> =
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XTypeParameterElementTest.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XTypeParameterElementTest.kt
index 2b63704..48a219f 100644
--- a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XTypeParameterElementTest.kt
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XTypeParameterElementTest.kt
@@ -56,12 +56,18 @@
 
             assertThat(t1.bounds).hasSize(1)
             val t1Bound = t1.bounds[0]
-            assertThat(t1Bound.typeName.toString()).isEqualTo("java.lang.Object")
+            assertThat(t1Bound.asTypeName().java.toString()).isEqualTo("java.lang.Object")
+            if (invocation.isKsp) {
+                assertThat(t1Bound.asTypeName().kotlin.toString()).isEqualTo("kotlin.Any?")
+            }
             assertThat(t1Bound.isSameType(expectedBoundType)).isTrue()
 
             assertThat(t2.bounds).hasSize(1)
             val t2Bound = t2.bounds[0]
-            assertThat(t2Bound.typeName.toString()).isEqualTo("java.lang.Object")
+            assertThat(t2Bound.asTypeName().java.toString()).isEqualTo("java.lang.Object")
+            if (invocation.isKsp) {
+                assertThat(t2Bound.asTypeName().kotlin.toString()).isEqualTo("kotlin.Any?")
+            }
             assertThat(t2Bound.isSameType(expectedBoundType)).isTrue()
         }
     }
@@ -91,13 +97,19 @@
 
             assertThat(t1.bounds).hasSize(1)
             val t1Bound = t1.bounds[0]
-            assertThat(t1Bound.typeName.toString()).isEqualTo("Bar")
+            assertThat(t1Bound.asTypeName().java.toString()).isEqualTo("Bar")
+            if (invocation.isKsp) {
+                assertThat(t1Bound.asTypeName().kotlin.toString()).isEqualTo("Bar")
+            }
             val bar = invocation.processingEnv.requireType("Bar")
             assertThat(t1Bound.isSameType(bar)).isTrue()
 
             assertThat(t2.bounds).hasSize(1)
             val t2Bound = t2.bounds[0]
-            assertThat(t2Bound.typeName.toString()).isEqualTo("Baz")
+            assertThat(t2Bound.asTypeName().java.toString()).isEqualTo("Baz")
+            if (invocation.isKsp) {
+                assertThat(t2Bound.asTypeName().kotlin.toString()).isEqualTo("Baz?")
+            }
             val nullableBar = invocation.processingEnv.requireType("Baz").makeNullable()
             assertThat(t2Bound.isSameType(nullableBar)).isTrue()
         }
@@ -128,13 +140,19 @@
 
             assertThat(t1.bounds).hasSize(1)
             val t1Bound = t1.bounds[0]
-            assertThat(t1Bound.typeName.toString()).isEqualTo("Bar")
+            assertThat(t1Bound.asTypeName().java.toString()).isEqualTo("Bar")
+            if (invocation.isKsp) {
+                assertThat(t1Bound.asTypeName().kotlin.toString()).isEqualTo("Bar?")
+            }
             val nullableBar = invocation.processingEnv.requireType("Bar").makeNullable()
             assertThat(t1Bound.isSameType(nullableBar)).isTrue()
 
             assertThat(t2.bounds).hasSize(1)
             val t2Bound = t2.bounds[0]
-            assertThat(t2Bound.typeName.toString()).isEqualTo("Baz")
+            assertThat(t2Bound.asTypeName().java.toString()).isEqualTo("Baz")
+            if (invocation.isKsp) {
+                assertThat(t2Bound.asTypeName().kotlin.toString()).isEqualTo("Baz")
+            }
             val baz = invocation.processingEnv.requireType("Baz")
             assertThat(t2Bound.isSameType(baz)).isTrue()
         }
@@ -162,13 +180,19 @@
             assertThat(t.bounds).hasSize(2)
 
             val bound0 = t.bounds[0]
-            assertThat(bound0.typeName.toString()).isEqualTo("Bar")
+            assertThat(bound0.asTypeName().java.toString()).isEqualTo("Bar")
+            if (invocation.isKsp) {
+                assertThat(bound0.asTypeName().kotlin.toString()).isEqualTo("Bar")
+            }
             val bar = invocation.processingEnv.requireType("Bar")
             assertThat(bound0.isSameType(bar)).isTrue()
             assertThat(bound0.nullability).isEqualTo(XNullability.UNKNOWN)
 
             val bound1 = t.bounds[1]
-            assertThat(bound1.typeName.toString()).isEqualTo("Baz")
+            assertThat(bound1.asTypeName().java.toString()).isEqualTo("Baz")
+            if (invocation.isKsp) {
+                assertThat(bound1.asTypeName().kotlin.toString()).isEqualTo("Baz")
+            }
             val baz = invocation.processingEnv.requireType("Baz")
             assertThat(bound1.isSameType(baz)).isTrue()
             assertThat(bound1.nullability).isEqualTo(XNullability.UNKNOWN)
@@ -212,12 +236,18 @@
 
             assertThat(t1.bounds).hasSize(1)
             val t1Bound = t1.bounds[0]
-            assertThat(t1Bound.typeName.toString()).isEqualTo("java.lang.Object")
+            assertThat(t1Bound.asTypeName().java.toString()).isEqualTo("java.lang.Object")
+            if (invocation.isKsp) {
+                assertThat(t1Bound.asTypeName().kotlin.toString()).isEqualTo("kotlin.Any?")
+            }
             assertThat(t1Bound.isSameType(expectedBoundType)).isTrue()
 
             assertThat(t2.bounds).hasSize(1)
             val t2Bound = t2.bounds[0]
-            assertThat(t2Bound.typeName.toString()).isEqualTo("java.lang.Object")
+            assertThat(t2Bound.asTypeName().java.toString()).isEqualTo("java.lang.Object")
+            if (invocation.isKsp) {
+                assertThat(t2Bound.asTypeName().kotlin.toString()).isEqualTo("kotlin.Any?")
+            }
             assertThat(t2Bound.isSameType(expectedBoundType)).isTrue()
         }
     }
@@ -254,13 +284,19 @@
 
             assertThat(t1.bounds).hasSize(1)
             val t1Bound = t1.bounds[0]
-            assertThat(t1Bound.typeName.toString()).isEqualTo("Bar")
+            assertThat(t1Bound.asTypeName().java.toString()).isEqualTo("Bar")
+            if (invocation.isKsp) {
+                assertThat(t1Bound.asTypeName().kotlin.toString()).isEqualTo("Bar")
+            }
             val bar = invocation.processingEnv.requireType("Bar")
             assertThat(t1Bound.isSameType(bar)).isTrue()
 
             assertThat(t2.bounds).hasSize(1)
             val t2Bound = t2.bounds[0]
-            assertThat(t2Bound.typeName.toString()).isEqualTo("Baz")
+            assertThat(t2Bound.asTypeName().java.toString()).isEqualTo("Baz")
+            if (invocation.isKsp) {
+                assertThat(t2Bound.asTypeName().kotlin.toString()).isEqualTo("Baz?")
+            }
             val nullableBar = invocation.processingEnv.requireType("Baz").makeNullable()
             assertThat(t2Bound.isSameType(nullableBar)).isTrue()
         }
@@ -295,13 +331,19 @@
             assertThat(t.bounds).hasSize(2)
 
             val bound0 = t.bounds[0]
-            assertThat(bound0.typeName.toString()).isEqualTo("Bar")
+            assertThat(bound0.asTypeName().java.toString()).isEqualTo("Bar")
+            if (invocation.isKsp) {
+                assertThat(bound0.asTypeName().kotlin.toString()).isEqualTo("Bar")
+            }
             val bar = invocation.processingEnv.requireType("Bar")
             assertThat(bound0.isSameType(bar)).isTrue()
             assertThat(bound0.nullability).isEqualTo(XNullability.UNKNOWN)
 
             val bound1 = t.bounds[1]
-            assertThat(bound1.typeName.toString()).isEqualTo("Baz")
+            assertThat(bound1.asTypeName().java.toString()).isEqualTo("Baz")
+            if (invocation.isKsp) {
+                assertThat(bound1.asTypeName().kotlin.toString()).isEqualTo("Baz")
+            }
             val baz = invocation.processingEnv.requireType("Baz")
             assertThat(bound1.isSameType(baz)).isTrue()
             assertThat(bound1.nullability).isEqualTo(XNullability.UNKNOWN)
@@ -337,13 +379,19 @@
             assertThat(t.bounds).hasSize(2)
 
             val bound0 = t.bounds[0]
-            assertThat(bound0.typeName.toString()).isEqualTo("Bar")
+            assertThat(bound0.asTypeName().java.toString()).isEqualTo("Bar")
+            if (invocation.isKsp) {
+                assertThat(bound0.asTypeName().kotlin.toString()).isEqualTo("Bar")
+            }
             val bar = invocation.processingEnv.requireType("Bar")
             assertThat(bound0.isSameType(bar)).isTrue()
             assertThat(bound0.nullability).isEqualTo(XNullability.UNKNOWN)
 
             val bound1 = t.bounds[1]
-            assertThat(bound1.typeName.toString()).isEqualTo("Baz")
+            assertThat(bound1.asTypeName().java.toString()).isEqualTo("Baz")
+            if (invocation.isKsp) {
+                assertThat(bound1.asTypeName().kotlin.toString()).isEqualTo("Baz")
+            }
             val baz = invocation.processingEnv.requireType("Baz")
             assertThat(bound1.isSameType(baz)).isTrue()
             assertThat(bound1.nullability).isEqualTo(XNullability.UNKNOWN)
@@ -351,7 +399,10 @@
             assertThat(constructor.parameters).hasSize(1)
             val parameter = constructor.parameters[0]
             assertThat(parameter.name).isEqualTo("t")
-            assertThat(parameter.type.typeName.toString()).isEqualTo("T")
+            assertThat(parameter.type.asTypeName().java.toString()).isEqualTo("T")
+            if (invocation.isKsp) {
+                assertThat(parameter.type.asTypeName().kotlin.toString()).isEqualTo("T")
+            }
         }
     }
 }
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XTypeTest.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XTypeTest.kt
index c1ebb8e..b42a29c 100644
--- a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XTypeTest.kt
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/XTypeTest.kt
@@ -16,10 +16,14 @@
 
 package androidx.room.compiler.processing
 
-import androidx.room.compiler.processing.ksp.ERROR_TYPE_NAME
+import androidx.room.compiler.codegen.XTypeName.Companion.UNAVAILABLE_KTYPE_NAME
+import androidx.room.compiler.processing.ksp.ERROR_JTYPE_NAME
+import androidx.room.compiler.processing.ksp.ERROR_KTYPE_NAME
 import androidx.room.compiler.processing.util.Source
 import androidx.room.compiler.processing.util.XTestInvocation
-import androidx.room.compiler.processing.util.className
+import androidx.room.compiler.processing.util.asJClassName
+import androidx.room.compiler.processing.util.asKClassName
+import androidx.room.compiler.processing.util.dumpToString
 import androidx.room.compiler.processing.util.getDeclaredMethodByJvmName
 import androidx.room.compiler.processing.util.getField
 import androidx.room.compiler.processing.util.getMethodByJvmName
@@ -27,14 +31,23 @@
 import androidx.room.compiler.processing.util.kspResolver
 import androidx.room.compiler.processing.util.runKspTest
 import androidx.room.compiler.processing.util.runProcessorTest
-import androidx.room.compiler.processing.util.typeName
-import com.google.common.truth.Truth
 import com.google.common.truth.Truth.assertThat
+import com.google.common.truth.Truth.assertWithMessage
 import com.google.devtools.ksp.getClassDeclarationByName
 import com.squareup.javapoet.ClassName
 import com.squareup.javapoet.ParameterizedTypeName
-import com.squareup.javapoet.TypeName
 import com.squareup.javapoet.TypeVariableName
+import com.squareup.kotlinpoet.INT
+import com.squareup.kotlinpoet.MUTABLE_SET
+import com.squareup.kotlinpoet.ParameterizedTypeName.Companion.parameterizedBy
+import com.squareup.kotlinpoet.STAR
+import com.squareup.kotlinpoet.javapoet.JClassName
+import com.squareup.kotlinpoet.javapoet.JParameterizedTypeName
+import com.squareup.kotlinpoet.javapoet.JTypeName
+import com.squareup.kotlinpoet.javapoet.JTypeVariableName
+import com.squareup.kotlinpoet.javapoet.JWildcardTypeName
+import com.squareup.kotlinpoet.javapoet.KClassName
+import com.squareup.kotlinpoet.javapoet.KTypeVariableName
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
@@ -59,39 +72,73 @@
             sources = listOf(parent)
         ) {
             val type = it.processingEnv.requireType("foo.bar.Parent")
-            val className = ClassName.get("foo.bar", "Parent")
-            assertThat(type.typeName).isEqualTo(
-                ParameterizedTypeName.get(
-                    className,
-                    ClassName.get("", "InputStreamType")
+            assertThat(type.asTypeName().java).isEqualTo(
+                JParameterizedTypeName.get(
+                    JClassName.get("foo.bar", "Parent"),
+                    JClassName.get("", "InputStreamType")
                 )
             )
+            if (it.isKsp) {
+                assertThat(type.asTypeName().kotlin).isEqualTo(
+                    KClassName("foo.bar", "Parent")
+                        .parameterizedBy(KClassName("", "InputStreamType"))
+                )
+            }
 
             val typeArguments = type.typeArguments
             assertThat(typeArguments).hasSize(1)
-            val inputStreamClassName = ClassName.get("java.io", "InputStream")
             typeArguments.first().let { firstType ->
                 val expected = TypeVariableName.get(
                     "InputStreamType",
-                    inputStreamClassName
+                    JClassName.get("java.io", "InputStream")
                 )
-                assertThat(firstType.typeName).isEqualTo(expected)
+                assertThat(firstType.asTypeName().java).isEqualTo(expected)
                 // equals in TypeVariableName just checks the string representation but we want
                 // to assert the upper bound as well
                 assertThat(
-                    (firstType.typeName as TypeVariableName).bounds
+                    (firstType.asTypeName().java as JTypeVariableName).bounds
                 ).containsExactly(
-                    inputStreamClassName
+                    JClassName.get("java.io", "InputStream")
                 )
             }
+            if (it.isKsp) {
+                typeArguments.first().let { firstType ->
+                    val expected = KTypeVariableName(
+                        "InputStreamType",
+                        KClassName("java.io", "InputStream")
+                    )
+                    assertThat(firstType.asTypeName().kotlin).isEqualTo(expected)
+                    assertThat(
+                        (firstType.asTypeName().kotlin as KTypeVariableName).bounds
+                    ).containsExactly(
+                        KClassName("java.io", "InputStream")
+                    )
+                }
+            }
 
             type.typeElement!!.getMethodByJvmName("wildcardParam").let { method ->
                 val wildcardParam = method.parameters.first()
                 val extendsBoundOrSelf = wildcardParam.type.extendsBoundOrSelf()
-                assertThat(extendsBoundOrSelf.rawType)
-                    .isEqualTo(
-                        it.processingEnv.requireType(Set::class).rawType
+                assertThat(wildcardParam.type.asTypeName().java).isEqualTo(
+                    JParameterizedTypeName.get(
+                        JClassName.get("java.util", "Set"),
+                        JWildcardTypeName.subtypeOf(Any::class.java)
                     )
+                )
+                if (it.isKsp) {
+                    assertThat(wildcardParam.type.asTypeName().kotlin).isEqualTo(
+                        MUTABLE_SET.parameterizedBy(STAR)
+                    )
+                    assertThat(extendsBoundOrSelf.rawType)
+                        .isEqualTo(
+                            it.processingEnv.requireType("kotlin.collections.MutableSet").rawType
+                        )
+                } else {
+                    assertThat(extendsBoundOrSelf.rawType)
+                        .isEqualTo(
+                            it.processingEnv.requireType("java.util.Set").rawType
+                        )
+                }
             }
             type.typeElement!!.getMethodByJvmName("rawTypeParam").let { method ->
                 val rawTypeParam = method.parameters.first()
@@ -118,21 +165,29 @@
         runProcessorTest(
             sources = listOf(missingTypeRef)
         ) {
-            val errorTypeName = if (it.isKsp) {
-                // in ksp, we lose the name when resolving the type.
-                // b/175246617
-                ERROR_TYPE_NAME
+            val errorJTypeName = if (it.isKsp) {
+                // In ksp, we lose the name when resolving the type. b/175246617
+                ERROR_JTYPE_NAME
             } else {
                 ClassName.get("", "NotExistingType")
             }
+            val errorKTypeName = if (it.isKsp) {
+                // In ksp, we lose the name when resolving the type. b/175246617
+                // But otherwise the name is not available in javac / kapt
+                ERROR_KTYPE_NAME
+            } else {
+                UNAVAILABLE_KTYPE_NAME
+            }
             val element = it.processingEnv.requireTypeElement("foo.bar.Baz")
             element.getField("badField").let { field ->
                 assertThat(field.type.isError()).isTrue()
-                assertThat(field.type.typeName).isEqualTo(errorTypeName)
+                assertThat(field.type.asTypeName().java).isEqualTo(errorJTypeName)
+                assertThat(field.type.asTypeName().kotlin).isEqualTo(errorKTypeName)
             }
             element.getDeclaredMethodByJvmName("badMethod").let { method ->
                 assertThat(method.returnType.isError()).isTrue()
-                assertThat(method.returnType.typeName).isEqualTo(errorTypeName)
+                assertThat(method.returnType.asTypeName().java).isEqualTo(errorJTypeName)
+                assertThat(method.returnType.asTypeName().kotlin).isEqualTo(errorKTypeName)
             }
             it.assertCompilationResult {
                 compilationDidFail()
@@ -235,11 +290,19 @@
     @Test
     fun isCollection_kotlin() {
         runKspTest(sources = emptyList()) { invocation ->
-            val subjects = listOf("Map" to false, "List" to true, "Set" to true)
+            val subjects = listOf(
+                "Map" to false,
+                "List" to true,
+                "Set" to true
+            )
             subjects.forEach { (subject, expected) ->
                 invocation.processingEnv.requireType("kotlin.collections.$subject").let { type ->
-                    Truth.assertWithMessage(type.typeName.toString())
+                    assertWithMessage(type.asTypeName().java.toString())
                         .that(type.isCollection()).isEqualTo(expected)
+                    if (invocation.isKsp) {
+                        assertWithMessage(type.asTypeName().kotlin.toString())
+                            .that(type.isCollection()).isEqualTo(expected)
+                    }
                 }
             }
         }
@@ -310,12 +373,18 @@
     @Test
     fun boxed() {
         runProcessorTest {
-            assertThat(
-                it.processingEnv.requireType("int").boxed().typeName
-            ).isEqualTo(java.lang.Integer::class.className())
-            assertThat(
-                it.processingEnv.requireType("java.lang.String").boxed().typeName
-            ).isEqualTo(String::class.className())
+            val intBoxed = it.processingEnv.requireType("int").boxed()
+            val stringBoxed = it.processingEnv.requireType("java.lang.String").boxed()
+            assertThat(intBoxed.asTypeName().java)
+                .isEqualTo(java.lang.Integer::class.asJClassName())
+            assertThat(stringBoxed.asTypeName().java)
+                .isEqualTo(String::class.asJClassName())
+            if (it.isKsp) {
+                assertThat(intBoxed.asTypeName().kotlin)
+                    .isEqualTo(Integer::class.asKClassName())
+                assertThat(stringBoxed.asTypeName().kotlin)
+                    .isEqualTo(String::class.asKClassName())
+            }
         }
     }
 
@@ -326,11 +395,21 @@
                 it.processingEnv.requireTypeElement(List::class),
                 it.processingEnv.requireType(String::class)
             )
-            val listClassName = List::class.className()
-            assertThat(subject.typeName).isEqualTo(
-                ParameterizedTypeName.get(listClassName, String::class.typeName())
+            assertThat(subject.asTypeName().java).isEqualTo(
+                ParameterizedTypeName.get(List::class.asJClassName(), String::class.asJClassName())
             )
-            assertThat(subject.rawType.typeName).isEqualTo(listClassName)
+            assertThat(subject.rawType.asTypeName().java)
+                .isEqualTo(List::class.asJClassName())
+            if (it.isKsp) {
+                assertThat(subject.asTypeName().kotlin).isEqualTo(
+                    KClassName(
+                        "kotlin.collections",
+                        "MutableList"
+                    ).parameterizedBy(String::class.asKClassName())
+                )
+                assertThat(subject.rawType.asTypeName().kotlin)
+                    .isEqualTo(KClassName("kotlin.collections", "MutableList"))
+            }
 
             val listOfInts = it.processingEnv.getDeclaredType(
                 it.processingEnv.requireTypeElement(List::class),
@@ -437,8 +516,7 @@
         ) { invocation ->
             val typeElement = invocation.processingEnv.requireTypeElement("SelfReferencing")
             val parameter = typeElement.getMethodByJvmName("method").parameters.single()
-            assertThat(typeElement.type.typeName.dumpToString(5)).isEqualTo(
-                """
+            val expectedTypeStringDump = """
                 SelfReferencing<T>
                 | T
                 | > SelfReferencing<T>
@@ -446,13 +524,28 @@
                 | > | > SelfReferencing<T>
                 | > | > | T
                 """.trimIndent()
-            )
-            assertThat(parameter.type.typeName.dumpToString(5)).isEqualTo(
-                """
+            assertThat(typeElement.type.asTypeName().java.dumpToString(5))
+                .isEqualTo(expectedTypeStringDump)
+            if (invocation.isKsp) {
+                assertThat(typeElement.type.asTypeName().kotlin.dumpToString(5))
+                    .isEqualTo(expectedTypeStringDump)
+            }
+            assertThat(parameter.type.asTypeName().java.dumpToString(5))
+                .isEqualTo(
+                    """
                 SelfReferencing<?>
                 | ?
                 """.trimIndent()
-            )
+                )
+            if (invocation.isKsp) {
+                assertThat(parameter.type.asTypeName().kotlin.dumpToString(5))
+                    .isEqualTo(
+                        """
+                    SelfReferencing<*>
+                    | *
+                    """.trimIndent()
+                    )
+            }
         }
     }
 
@@ -471,8 +564,7 @@
         ) { invocation ->
             val typeElement = invocation.processingEnv.requireTypeElement("SelfReferencing")
             val parameter = typeElement.getMethodByJvmName("method").parameters.single()
-            assertThat(typeElement.type.typeName.dumpToString(5)).isEqualTo(
-                """
+            val expectedTypeStringDump = """
                 SelfReferencing<T>
                 | T
                 | > SelfReferencing<T>
@@ -480,12 +572,21 @@
                 | > | > SelfReferencing<T>
                 | > | > | T
                 """.trimIndent()
-            )
-            assertThat(parameter.type.typeName.dumpToString(5)).isEqualTo(
-                """
+            assertThat(typeElement.type.asTypeName().java.dumpToString(5))
+                .isEqualTo(expectedTypeStringDump)
+            if (invocation.isKsp) {
+                assertThat(typeElement.type.asTypeName().kotlin.dumpToString(5))
+                    .isEqualTo(expectedTypeStringDump)
+            }
+            val expectedParamStringDump = """
                 SelfReferencing
                 """.trimIndent()
-            )
+            assertThat(parameter.type.asTypeName().java.dumpToString(5))
+                .isEqualTo(expectedParamStringDump)
+            if (invocation.isKsp) {
+                assertThat(parameter.type.asTypeName().kotlin.dumpToString(5))
+                    .isEqualTo(expectedParamStringDump)
+            }
         }
     }
 
@@ -506,9 +607,7 @@
             sources = listOf(src)
         ) { invocation ->
             val nodeElm = invocation.processingEnv.requireTypeElement("Node")
-            val nodeTypeName = nodeElm.type.typeName
-            assertThat(nodeTypeName.dumpToString(5)).isEqualTo(
-                """
+            val expectedStringDump = """
                 Node<TX, RX>
                 | TX
                 | > Node<TX, RX>
@@ -531,18 +630,19 @@
                 | > | > | TX
                 | > | > | RX
                 """.trimIndent()
-            )
-            val paramTypeNames = nodeElm.getDeclaredMethods().associate {
-                it.name to it.parameters.single().type.typeName.dumpToString(5)
+            assertThat(nodeElm.type.asTypeName().java.dumpToString(5))
+                .isEqualTo(expectedStringDump)
+            if (invocation.isKsp) {
+                assertThat(nodeElm.type.asTypeName().kotlin.dumpToString(5))
+                    .isEqualTo(expectedStringDump)
             }
-            assertThat(paramTypeNames).containsExactlyEntriesIn(
-                mapOf(
-                    "allStar" to """
+            val expectedStringDumps = mapOf(
+                "allStar" to """
                         Node<?, ?>
                         | ?
                         | ?
                         """.trimIndent(),
-                    "firstStar" to """
+                "firstStar" to """
                         Node<?, RX>
                         | ?
                         | RX
@@ -556,7 +656,7 @@
                         | > | > | TX
                         | > | > | RX
                     """.trimIndent(),
-                    "secondStar" to """
+                "secondStar" to """
                         Node<TX, ?>
                         | TX
                         | > Node<TX, RX>
@@ -570,7 +670,7 @@
                         | > | > | TX
                         | ?
                     """.trimIndent(),
-                    "noStar" to """
+                "noStar" to """
                         Node<TX, RX>
                         | TX
                         | > Node<TX, RX>
@@ -593,8 +693,22 @@
                         | > | > | TX
                         | > | > | RX
                     """.trimIndent()
-                )
             )
+            nodeElm.getDeclaredMethods().associate {
+                it.name to it.parameters.single().type.asTypeName()
+            }.let {
+                assertThat(it.mapValues { entry -> entry.value.java.dumpToString(5) })
+                    .containsExactlyEntriesIn(expectedStringDumps)
+                if (invocation.isKsp) {
+                    assertThat(it.mapValues { entry -> entry.value.kotlin.dumpToString(5) })
+                        .containsExactlyEntriesIn(
+                            // Quick replace ? to * to correctly compare with KotlinPoet
+                            expectedStringDumps.mapValues { entry ->
+                                entry.value.replace('?', '*')
+                            }
+                        )
+                }
+            }
         }
     }
 
@@ -675,9 +789,7 @@
             sources = listOf(src)
         ) { invocation ->
             val elm = invocation.processingEnv.requireTypeElement("SelfReferencing")
-            val typeName = elm.type.typeName
-            assertThat(typeName.dumpToString(5)).isEqualTo(
-                """
+            val expected = """
                 SelfReferencing<TX, RX>
                 | TX
                 | > SelfReferencing<TX, RX>
@@ -695,7 +807,12 @@
                 | > | > | TX
                 | > | > | RX
                 """.trimIndent()
-            )
+            assertThat(elm.type.asTypeName().java.dumpToString(5))
+                .isEqualTo(expected)
+            if (invocation.isKsp) {
+                assertThat(elm.type.asTypeName().kotlin.dumpToString(5))
+                    .isEqualTo(expected)
+            }
         }
     }
 
@@ -801,10 +918,18 @@
         runProcessorTest(listOf(libSource)) { invocation ->
             val actual = invocation.processingEnv.requireTypeElement("MyClass")
                 .getDeclaredMethodByJvmName("setLists").parameters.associate {
-                    it.name to it.type.typeName.toString()
+                    it.name to it.type.asTypeName()
                 }
-            assertThat(actual["starList"]).isEqualTo("java.util.List<?>")
-            assertThat(actual["rList"]).isEqualTo("java.util.List<? extends R>")
+            assertThat(actual["starList"]?.java.toString())
+                .isEqualTo("java.util.List<?>")
+            assertThat(actual["rList"]?.java.toString())
+                .isEqualTo("java.util.List<? extends R>")
+            if (invocation.isKsp) {
+                assertThat(actual["starList"]?.kotlin.toString())
+                    .isEqualTo("kotlin.collections.List<*>")
+                assertThat(actual["rList"]?.kotlin.toString())
+                    .isEqualTo("kotlin.collections.List<out R>")
+            }
         }
     }
 
@@ -829,8 +954,12 @@
                 val superInterface =
                     superTypes.first { type -> type.rawType.toString() == "foo.bar.MyInterface" }
                 assertThat(superClass.typeArguments).hasSize(1)
-                assertThat(superClass.typeArguments[0].typeName)
-                    .isEqualTo(ClassName.get("java.lang", "String"))
+                assertThat(superClass.typeArguments[0].asTypeName().java)
+                    .isEqualTo(JClassName.get("java.lang", "String"))
+                if (invocation.isKsp) {
+                    assertThat(superClass.typeArguments[0].asTypeName().kotlin)
+                        .isEqualTo(KClassName("kotlin", "String"))
+                }
                 assertThat(superInterface.typeArguments).isEmpty()
             }
         }
@@ -881,7 +1010,10 @@
         fun XTestInvocation.checkPrimitiveType() {
             val fooElement = processingEnv.requireTypeElement("foo.bar.Foo")
             val primitiveType = fooElement.getField("i").type
-            assertThat(primitiveType.typeName).isEqualTo(TypeName.INT)
+            assertThat(primitiveType.asTypeName().java).isEqualTo(JTypeName.INT)
+            if (isKsp) {
+                assertThat(primitiveType.asTypeName().kotlin).isEqualTo(INT)
+            }
             assertThat(primitiveType.typeElement).isNull()
         }
 
@@ -905,45 +1037,4 @@
             """.trimIndent()
         ))) { it.checkPrimitiveType() }
     }
-
-    /**
-     * Dumps the typename with its bounds in a given depth.
-     * This makes tests more readable.
-     */
-    private fun TypeName.dumpToString(depth: Int): String {
-        return dump(depth).toString()
-    }
-
-    private fun TypeName.dump(depth: Int): TypeNameNode? {
-        if (depth < 0) return null
-        return when (this) {
-            is ParameterizedTypeName -> TypeNameNode(
-                text = this.toString(),
-                typeArgs = this.typeArguments.mapNotNull { it.dump(depth - 1) }
-            )
-            is TypeVariableName -> TypeNameNode(
-                text = this.toString(),
-                bounds = bounds.map { it.dump(depth - 1) }.filterNotNull()
-            )
-            else -> TypeNameNode(text = toString())
-        }
-    }
-
-    private data class TypeNameNode(
-        val text: String,
-        val bounds: List<TypeNameNode> = emptyList(),
-        val typeArgs: List<TypeNameNode> = emptyList()
-    ) {
-        override fun toString(): String {
-            return buildString {
-                appendLine(text)
-                bounds.forEach {
-                    appendLine(it.toString().prependIndent("> "))
-                }
-                typeArgs.forEach {
-                    appendLine(it.toString().prependIndent("| "))
-                }
-            }.trim()
-        }
-    }
 }
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/compat/XConvertersTest.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/compat/XConvertersTest.kt
index fc35d13..a55e28f 100644
--- a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/compat/XConvertersTest.kt
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/compat/XConvertersTest.kt
@@ -39,13 +39,12 @@
 import com.squareup.javapoet.ClassName
 import com.squareup.javapoet.JavaFile
 import com.squareup.javapoet.TypeSpec
-import org.junit.Test
-import java.lang.IllegalStateException
 import javax.annotation.processing.Filer
 import javax.annotation.processing.Messager
 import javax.lang.model.type.TypeMirror
 import javax.lang.model.util.ElementFilter
 import javax.tools.Diagnostic
+import org.junit.Test
 
 class XConvertersTest {
 
@@ -113,9 +112,9 @@
                     assertThat(tFromXConverters).isNull()
                     return
                 }
-                assertThat(t.typeName).isEqualTo(tFromXConverters.typeName)
+                assertThat(t.asTypeName()).isEqualTo(tFromXConverters.asTypeName())
                 assertThat(t.typeElement).isEqualTo(tFromXConverters.typeElement)
-                assertThat(t.rawType.typeName).isEqualTo(tFromXConverters.rawType.typeName)
+                assertThat(t.rawType.asTypeName()).isEqualTo(tFromXConverters.rawType.asTypeName())
                 assertThat(t.typeArguments.size).isEqualTo(tFromXConverters.typeArguments.size)
                 for (i in 0..t.typeArguments.size) {
                     assertEqualTypes(t.typeArguments[i], tFromXConverters.typeArguments[i])
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/ksp/KSTypeExtTest.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/ksp/KSTypeExtTest.kt
index ad531fd..61eee03 100644
--- a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/ksp/KSTypeExtTest.kt
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/ksp/KSTypeExtTest.kt
@@ -60,16 +60,18 @@
             listOf("main", "lib").map {
                 it to invocation.kspResolver.requireClass("$it.Baz")
             }.forEach { (pkg, subject) ->
-                assertThat(subject.propertyType("intField").typeName(invocation.kspResolver))
+                assertThat(subject.propertyType("intField").asJTypeName(invocation.kspResolver))
                     .isEqualTo(TypeName.INT)
-                assertThat(subject.propertyType("listOfInts").typeName(invocation.kspResolver))
+                assertThat(subject.propertyType("listOfInts").asJTypeName(invocation.kspResolver))
                     .isEqualTo(
                         ParameterizedTypeName.get(
                             List::class.className(),
                             TypeName.INT.box()
                         )
                     )
-                assertThat(subject.propertyType("mutableMapOfAny").typeName(invocation.kspResolver))
+                assertThat(
+                    subject.propertyType("mutableMapOfAny").asJTypeName(invocation.kspResolver)
+                )
                     .isEqualTo(
                         ParameterizedTypeName.get(
                             Map::class.className(),
@@ -77,7 +79,7 @@
                             TypeName.OBJECT,
                         )
                     )
-                val typeName = subject.propertyType("nested").typeName(invocation.kspResolver)
+                val typeName = subject.propertyType("nested").asJTypeName(invocation.kspResolver)
                 check(typeName is ClassName)
                 assertThat(typeName.packageName()).isEqualTo(pkg)
                 assertThat(typeName.simpleNames()).containsExactly("Baz", "Nested")
@@ -114,11 +116,11 @@
             }.forEach { subject ->
                 assertWithMessage(subject.qualifiedName!!.asString())
                     .that(
-                        subject.propertyType("intField").typeName(invocation.kspResolver)
+                        subject.propertyType("intField").asJTypeName(invocation.kspResolver)
                     ).isEqualTo(TypeName.INT)
                 assertWithMessage(subject.qualifiedName!!.asString())
                     .that(
-                        subject.propertyType("listOfInts").typeName(invocation.kspResolver)
+                        subject.propertyType("listOfInts").asJTypeName(invocation.kspResolver)
                     ).isEqualTo(
                         ParameterizedTypeName.get(
                             List::class.className(),
@@ -126,14 +128,15 @@
                         )
                     )
                 val propertyType = subject.propertyType("incompleteGeneric")
-                val typeName = propertyType.typeName(invocation.kspResolver)
+                val typeName = propertyType.asJTypeName(invocation.kspResolver)
                 assertWithMessage(subject.qualifiedName!!.asString())
                     .that(
                         typeName
                     ).isEqualTo(
                         ClassName.get(List::class.java)
                     )
-                val nestedTypeName = subject.propertyType("nested").typeName(invocation.kspResolver)
+                val nestedTypeName =
+                    subject.propertyType("nested").asJTypeName(invocation.kspResolver)
                 assertWithMessage(subject.qualifiedName!!.asString())
                     .that(nestedTypeName)
                     .isEqualTo(
@@ -159,23 +162,23 @@
         runKspTest(sources = listOf(subjectSrc)) { invocation ->
             val subject = invocation.kspResolver.requireClass("Foo")
             assertThat(
-                subject.propertyType("errorField").typeName(invocation.kspResolver)
-            ).isEqualTo(ERROR_TYPE_NAME)
+                subject.propertyType("errorField").asJTypeName(invocation.kspResolver)
+            ).isEqualTo(ERROR_JTYPE_NAME)
             assertThat(
-                subject.propertyType("listOfError").typeName(invocation.kspResolver)
+                subject.propertyType("listOfError").asJTypeName(invocation.kspResolver)
             ).isEqualTo(
                 ParameterizedTypeName.get(
                     List::class.className(),
-                    ERROR_TYPE_NAME
+                    ERROR_JTYPE_NAME
                 )
             )
             assertThat(
-                subject.propertyType("mutableMapOfDontExist").typeName(invocation.kspResolver)
+                subject.propertyType("mutableMapOfDontExist").asJTypeName(invocation.kspResolver)
             ).isEqualTo(
                 ParameterizedTypeName.get(
                     Map::class.className(),
                     String::class.className(),
-                    ERROR_TYPE_NAME
+                    ERROR_JTYPE_NAME
                 )
             )
             invocation.assertCompilationResult {
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/ksp/KspTypeTest.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/ksp/KspTypeTest.kt
index 9eb4b0d..ef0ec14 100644
--- a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/ksp/KspTypeTest.kt
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/ksp/KspTypeTest.kt
@@ -16,6 +16,9 @@
 
 package androidx.room.compiler.processing.ksp
 
+import androidx.room.compiler.codegen.XClassName
+import androidx.room.compiler.codegen.XTypeName
+import androidx.room.compiler.codegen.asClassName
 import androidx.room.compiler.processing.XNullability.NONNULL
 import androidx.room.compiler.processing.XNullability.NULLABLE
 import androidx.room.compiler.processing.XType
@@ -24,17 +27,19 @@
 import androidx.room.compiler.processing.isLong
 import androidx.room.compiler.processing.isVoid
 import androidx.room.compiler.processing.util.Source
-import androidx.room.compiler.processing.util.className
 import androidx.room.compiler.processing.util.getField
 import androidx.room.compiler.processing.util.getMethodByJvmName
 import androidx.room.compiler.processing.util.runKspTest
 import androidx.room.compiler.processing.util.runProcessorTest
-import androidx.room.compiler.processing.util.typeName
 import com.google.common.truth.Truth.assertThat
-import com.squareup.javapoet.ClassName
-import com.squareup.javapoet.TypeName
-import com.squareup.javapoet.TypeVariableName
-import com.squareup.javapoet.WildcardTypeName
+import com.squareup.kotlinpoet.UNIT
+import com.squareup.kotlinpoet.javapoet.JClassName
+import com.squareup.kotlinpoet.javapoet.JTypeName
+import com.squareup.kotlinpoet.javapoet.JTypeVariableName
+import com.squareup.kotlinpoet.javapoet.JWildcardTypeName
+import com.squareup.kotlinpoet.javapoet.KClassName
+import com.squareup.kotlinpoet.javapoet.KTypeVariableName
+import com.squareup.kotlinpoet.javapoet.KWildcardTypeName
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
@@ -46,7 +51,7 @@
         val src = Source.kotlin(
             "foo.kt",
             """
-            package foo.bar;
+            package foo.bar
             class Baz : AbstractClass(), MyInterface {
             }
             abstract class AbstractClass {}
@@ -55,8 +60,8 @@
         )
         runProcessorTest(listOf(src)) {
             val subject = it.processingEnv.requireType("foo.bar.Baz")
-            assertThat(subject.typeName).isEqualTo(
-                ClassName.get("foo.bar", "Baz")
+            assertThat(subject.asTypeName()).isEqualTo(
+                XClassName.get("foo.bar", "Baz")
             )
             // basic assertions for abstract class
             val abstractSubject = it.processingEnv.requireType("foo.bar.AbstractClass")
@@ -99,8 +104,12 @@
             subject.getField("errorType").type.let { type ->
                 assertThat(type.isError()).isTrue()
                 assertThat(type.typeArguments).isEmpty()
-                assertThat(type.typeName).isEqualTo(ERROR_TYPE_NAME)
-                assertThat(type.typeElement!!.className).isEqualTo(ERROR_TYPE_NAME)
+                assertThat(type.asTypeName().java).isEqualTo(ERROR_JTYPE_NAME)
+                assertThat(type.typeElement!!.asClassName().java).isEqualTo(ERROR_JTYPE_NAME)
+                if (invocation.isKsp) {
+                    assertThat(type.asTypeName().kotlin).isEqualTo(ERROR_KTYPE_NAME)
+                    assertThat(type.typeElement!!.asClassName().kotlin).isEqualTo(ERROR_KTYPE_NAME)
+                }
             }
 
             subject.getField("listOfErrorType").type.let { type ->
@@ -108,7 +117,10 @@
                 assertThat(type.typeArguments).hasSize(1)
                 type.typeArguments.single().let { typeArg ->
                     assertThat(typeArg.isError()).isTrue()
-                    assertThat(typeArg.typeName).isEqualTo(ERROR_TYPE_NAME)
+                    assertThat(typeArg.asTypeName().java).isEqualTo(ERROR_JTYPE_NAME)
+                    if (invocation.isKsp) {
+                        assertThat(typeArg.asTypeName().kotlin).isEqualTo(ERROR_KTYPE_NAME)
+                    }
                 }
             }
             invocation.assertCompilationResult {
@@ -135,8 +147,8 @@
             subject.getField("listOfNullableStrings").type.let { type ->
                 assertThat(type.nullability).isEqualTo(NONNULL)
                 assertThat(type.typeArguments).hasSize(1)
-                assertThat(type.typeElement!!.className).isEqualTo(
-                    List::class.typeName()
+                assertThat(type.typeElement!!.asClassName()).isEqualTo(
+                    List::class.asClassName()
                 )
                 type.typeArguments.single().let { typeArg ->
                     assertThat(typeArg.nullability).isEqualTo(NULLABLE)
@@ -160,8 +172,8 @@
                         )
                     ).isTrue()
                 }
-                assertThat(type.typeElement!!.className).isEqualTo(
-                    List::class.className()
+                assertThat(type.typeElement!!.asClassName()).isEqualTo(
+                    List::class.asClassName()
                 )
             }
         }
@@ -238,19 +250,18 @@
         ) { invocation ->
             val subject = invocation.processingEnv.requireTypeElement("Subject")
             subject.getField("simple").type.let {
-                assertThat(it.rawType.typeName).isEqualTo(TypeName.INT)
+                assertThat(it.rawType.asTypeName()).isEqualTo(XTypeName.PRIMITIVE_INT)
             }
             subject.getField("list").type.let { list ->
                 assertThat(list.rawType).isNotEqualTo(list)
                 assertThat(list.typeArguments).isNotEmpty()
-                assertThat(list.rawType.typeName)
-                    .isEqualTo(ClassName.get("java.util", "List"))
+                assertThat(list.rawType.asTypeName()).isEqualTo(List::class.asClassName())
             }
             subject.getField("map").type.let { map ->
                 assertThat(map.rawType).isNotEqualTo(map)
                 assertThat(map.typeArguments).hasSize(2)
-                assertThat(map.rawType.typeName)
-                    .isEqualTo(ClassName.get("java.util", "Map"))
+                assertThat(map.rawType.asTypeName())
+                    .isEqualTo(Map::class.asClassName())
             }
             subject.getField("listOfMaps").type.let { listOfMaps ->
                 assertThat(listOfMaps.rawType).isNotEqualTo(listOfMaps)
@@ -275,11 +286,12 @@
             val voidMethod = invocation.processingEnv.requireTypeElement("foo.bar.Baz")
                 .getMethodByJvmName("voidMethod")
             val returnType = voidMethod.returnType
-            assertThat(
-                returnType.typeName
-            ).isEqualTo(
-                TypeName.VOID
-            )
+            assertThat(returnType.asTypeName().java)
+                .isEqualTo(JTypeName.VOID)
+            if (invocation.isKsp) {
+                assertThat(returnType.asTypeName().kotlin)
+                    .isEqualTo(UNIT)
+            }
             assertThat(returnType.isVoid()).isTrue()
         }
     }
@@ -469,7 +481,7 @@
         val src = Source.kotlin(
             "foo.kt",
             """
-            open class Foo;
+            open class Foo
             class Bar<T : Foo> {
             }
             class Bar_NullableFoo<T : Foo?>
@@ -485,16 +497,29 @@
                     .typeArguments
                     .single()
             }
-            val typeName = typeArgs["Bar"]!!.typeName
-            assertThat(typeName)
+            assertThat(typeArgs["Bar"]!!.asTypeName().java)
                 .isEqualTo(
-                    TypeVariableName.get("T", ClassName.get("", "Foo"))
+                    JTypeVariableName.get("T", JClassName.get("", "Foo"))
                 )
+            if (invocation.isKsp) {
+                assertThat(typeArgs["Bar"]!!.asTypeName().kotlin)
+                    .isEqualTo(
+                        KTypeVariableName("T", KClassName("", "Foo"))
+                    )
+            }
             assertThat(typeArgs["Bar"]!!.nullability).isEqualTo(NONNULL)
-            assertThat(typeArgs["Bar_NullableFoo"]!!.typeName)
+            assertThat(typeArgs["Bar_NullableFoo"]!!.asTypeName().java)
                 .isEqualTo(
-                    TypeVariableName.get("T", ClassName.get("", "Foo"))
+                    JTypeVariableName.get("T", JClassName.get("", "Foo"))
                 )
+            if (invocation.isKsp) {
+                assertThat(typeArgs["Bar_NullableFoo"]!!.asTypeName().kotlin)
+                    .isEqualTo(
+                        KTypeVariableName(
+                            "T", KClassName("", "Foo").copy(nullable = true)
+                        )
+                    )
+            }
             assertThat(typeArgs["Bar_NullableFoo"]!!.nullability).isEqualTo(NULLABLE)
         }
     }
@@ -515,21 +540,27 @@
         runProcessorTest(
             listOf(src)
         ) { invocation ->
-
             val typeElement = invocation.processingEnv.requireTypeElement("foo.bar.Baz")
             val method = typeElement.getMethodByJvmName("wildcardMethod")
             val asMember = method.asMemberOf(typeElement.type)
             fun assertParamType(paramType: XType) {
                 val arg1 = paramType.typeArguments.single()
-                assertThat(arg1.typeName)
+                assertThat(arg1.asTypeName().java)
                     .isEqualTo(
-                        WildcardTypeName.subtypeOf(
-                            Number::class.java
-                        )
+                        JWildcardTypeName.subtypeOf(Number::class.java)
                     )
-                assertThat(arg1.extendsBound()?.typeName).isEqualTo(
-                    ClassName.get("java.lang", "Number")
+                assertThat(arg1.extendsBound()?.asTypeName()?.java).isEqualTo(
+                    JClassName.get("java.lang", "Number")
                 )
+                if (invocation.isKsp) {
+                    assertThat(arg1.asTypeName().kotlin)
+                        .isEqualTo(
+                            KWildcardTypeName.producerOf(Number::class)
+                        )
+                    assertThat(arg1.extendsBound()?.asTypeName()?.kotlin).isEqualTo(
+                        KClassName("kotlin", "Number")
+                    )
+                }
                 assertThat(
                     arg1.extendsBound()?.extendsBound()
                 ).isNull()
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/ksp/synthetic/KspSyntheticFileMemberContainerTest.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/ksp/synthetic/KspSyntheticFileMemberContainerTest.kt
index 1ef355a..7ff027c 100644
--- a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/ksp/synthetic/KspSyntheticFileMemberContainerTest.kt
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/ksp/synthetic/KspSyntheticFileMemberContainerTest.kt
@@ -136,7 +136,8 @@
                     val owner = invocation.kspResolver.getOwnerJvmClassName(field.declaration)
                     assertWithMessage(qName).that(owner).isNotNull()
                     val synthetic = KspSyntheticFileMemberContainer(owner!!)
-                    assertWithMessage(qName).that(target.className).isEqualTo(synthetic.className)
+                    assertWithMessage(qName).that(target.asClassName())
+                        .isEqualTo(synthetic.asClassName())
                 }
             }
             listOf("lib", "app").forEach { pkg ->
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/util/JavaPoetTestExt.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/util/JavaPoetTestExt.kt
deleted file mode 100644
index 8f7be96..0000000
--- a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/util/JavaPoetTestExt.kt
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright 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 androidx.room.compiler.processing.util
-
-import com.squareup.javapoet.ClassName
-import com.squareup.javapoet.TypeName
-import kotlin.reflect.KClass
-
-val UNIT_CLASS_NAME = ClassName.get("kotlin", "Unit")
-val CONTINUATION_CLASS_NAME = ClassName.get("kotlin.coroutines", "Continuation")
-
-fun KClass<*>.typeName() = TypeName.get(this.java)
-fun KClass<*>.className() = ClassName.get(this.java)
diff --git a/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/util/PoetTestExt.kt b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/util/PoetTestExt.kt
new file mode 100644
index 0000000..86942af
--- /dev/null
+++ b/room/room-compiler-processing/src/test/java/androidx/room/compiler/processing/util/PoetTestExt.kt
@@ -0,0 +1,137 @@
+/*
+ * Copyright 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 androidx.room.compiler.processing.util
+
+import androidx.room.compiler.codegen.XTypeName
+import com.squareup.kotlinpoet.MUTABLE_COLLECTION
+import com.squareup.kotlinpoet.MUTABLE_ITERABLE
+import com.squareup.kotlinpoet.MUTABLE_LIST
+import com.squareup.kotlinpoet.MUTABLE_MAP
+import com.squareup.kotlinpoet.MUTABLE_MAP_ENTRY
+import com.squareup.kotlinpoet.MUTABLE_SET
+import com.squareup.kotlinpoet.asClassName
+import com.squareup.kotlinpoet.asTypeName
+import com.squareup.kotlinpoet.javapoet.JClassName
+import com.squareup.kotlinpoet.javapoet.JParameterizedTypeName
+import com.squareup.kotlinpoet.javapoet.JTypeName
+import com.squareup.kotlinpoet.javapoet.JTypeVariableName
+import com.squareup.kotlinpoet.javapoet.KClassName
+import com.squareup.kotlinpoet.javapoet.KParameterizedTypeName
+import com.squareup.kotlinpoet.javapoet.KTypeName
+import com.squareup.kotlinpoet.javapoet.KTypeVariableName
+import kotlin.reflect.KClass
+
+val UNIT_JCLASS_NAME = JClassName.get("kotlin", "Unit")
+val CONTINUATION_JCLASS_NAME = JClassName.get("kotlin.coroutines", "Continuation")
+
+// TODO(b/247242378): Migrate usages to asJTypeName() and asJClassName()
+// @Deprecated(
+//     message = "Use asJTypeName() to be clear it's a JavaPoet converter",
+//     replaceWith = ReplaceWith("asJTypeName()")
+// )
+fun KClass<*>.typeName() = JTypeName.get(this.java)
+
+// TODO(b/247242378): Migrate usages to asJTypeName() and asJClassName()
+// @Deprecated(
+//     message = "Use asJClassName() to be clear it's a JavaPoet converter",
+//     replaceWith = ReplaceWith("asJClassName()")
+// )
+fun KClass<*>.className() = JClassName.get(this.java)
+
+fun KClass<*>.asJTypeName() = JTypeName.get(this.java)
+fun KClass<*>.asJClassName() = JClassName.get(this.java)
+
+fun KClass<*>.asKTypeName() = this.asTypeName()
+fun KClass<*>.asKClassName() = this.asClassName()
+
+/**
+ * Workaround for:
+ * https://github.com/square/kotlinpoet/issues/279
+ * https://youtrack.jetbrains.com/issue/KT-11754
+ */
+fun KClass<*>.asMutableKClassName(): KClassName = when (this) {
+    Iterator::class -> MUTABLE_ITERABLE
+    Collection::class -> MUTABLE_COLLECTION
+    List::class -> MUTABLE_LIST
+    Set::class -> MUTABLE_SET
+    Map::class -> MUTABLE_MAP
+    Map.Entry::class -> MUTABLE_MAP_ENTRY
+    else -> this.asKClassName()
+}
+
+// Creates a simple XTypeName wrapping JTypeVariableName and KTypeVariableName without bounds.
+fun createXTypeVariableName(name: String): XTypeName {
+    return XTypeName(
+        java = JTypeVariableName.get(name),
+        kotlin = KTypeVariableName(name)
+    )
+}
+
+/**
+ * Dumps the typename with its bounds in a given depth, making tests more readable.
+ */
+fun JTypeName.dumpToString(depth: Int): String {
+    return dump(this, depth).toString()
+}
+
+/**
+ * Dumps the typename with its bounds in a given depth, making tests more readable.
+ */
+fun KTypeName.dumpToString(depth: Int): String {
+    return dump(this, depth).toString()
+}
+
+private fun dump(typeName: Any, depth: Int): TypeNameNode? {
+    if (depth < 0) return null
+    return when (typeName) {
+        is JParameterizedTypeName -> TypeNameNode(
+            text = typeName.toString(),
+            typeArgs = typeName.typeArguments.mapNotNull { dump(it, depth - 1) }
+        )
+        is KParameterizedTypeName -> TypeNameNode(
+            text = typeName.toString(),
+            typeArgs = typeName.typeArguments.mapNotNull { dump(it, depth - 1) }
+        )
+        is JTypeVariableName -> TypeNameNode(
+            text = typeName.toString(),
+            bounds = typeName.bounds.mapNotNull { dump(it, depth - 1) }
+        )
+        is KTypeVariableName -> TypeNameNode(
+            text = typeName.toString(),
+            bounds = typeName.bounds.mapNotNull { dump(it, depth - 1) }
+        )
+        else -> TypeNameNode(text = typeName.toString())
+    }
+}
+
+private data class TypeNameNode(
+    val text: String,
+    val bounds: List<TypeNameNode> = emptyList(),
+    val typeArgs: List<TypeNameNode> = emptyList()
+) {
+    override fun toString(): String {
+        return buildString {
+            appendLine(text)
+            bounds.forEach {
+                appendLine(it.toString().prependIndent("> "))
+            }
+            typeArgs.forEach {
+                appendLine(it.toString().prependIndent("| "))
+            }
+        }.trim()
+    }
+}
diff --git a/room/room-compiler/lint-baseline.xml b/room/room-compiler/lint-baseline.xml
new file mode 100644
index 0000000..0b7f2c4
--- /dev/null
+++ b/room/room-compiler/lint-baseline.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
+
+    <issue
+        id="SupportAnnotationUsage"
+        message="Did you mean `@get:VisibleForTesting`? Without `get:` this annotates the constructor parameter itself instead of the associated getter."
+        errorLine1="    @VisibleForTesting"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/kotlin/androidx/room/solver/types/NullAwareTypeConverters.kt"/>
+    </issue>
+
+</issues>
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/DatabaseProcessingStep.kt b/room/room-compiler/src/main/kotlin/androidx/room/DatabaseProcessingStep.kt
index dc5b05f..ba54bdb 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/DatabaseProcessingStep.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/DatabaseProcessingStep.kt
@@ -16,6 +16,7 @@
 
 package androidx.room
 
+import androidx.room.compiler.codegen.CodeLanguage
 import androidx.room.compiler.processing.XElement
 import androidx.room.compiler.processing.XProcessingEnv
 import androidx.room.compiler.processing.XProcessingEnvConfig
@@ -93,14 +94,13 @@
                 DaoWriter(
                     daoMethod.dao,
                     db.element,
-                    context.processingEnv
-                )
-                    .write(context.processingEnv)
+                    CodeLanguage.JAVA
+                ).write(context.processingEnv)
             }
         }
 
         databases?.forEach { db ->
-            DatabaseWriter(db).write(context.processingEnv)
+            DatabaseWriter(db, CodeLanguage.JAVA).write(context.processingEnv)
             if (db.exportSchema) {
                 val schemaOutFolderPath = context.schemaOutFolderPath
                 if (schemaOutFolderPath == null) {
@@ -151,7 +151,7 @@
                 entry.value.groupBy { daoMethod ->
                     // first suffix guess: Database's simple name
                     val db = databases.first { db -> db.daoMethods.contains(daoMethod) }
-                    db.typeName.simpleName()
+                    db.typeName.simpleNames.last()
                 }.forEach { (dbName, methods) ->
                     if (methods.size == 1) {
                         // good, db names do not clash, use db name as suffix
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/processor/DatabaseProcessor.kt b/room/room-compiler/src/main/kotlin/androidx/room/processor/DatabaseProcessor.kt
index 5acd990..473928d 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/processor/DatabaseProcessor.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/processor/DatabaseProcessor.kt
@@ -18,6 +18,7 @@
 
 import androidx.room.AutoMigration
 import androidx.room.SkipQueryVerification
+import androidx.room.compiler.codegen.toJavaPoet
 import androidx.room.compiler.processing.XAnnotationBox
 import androidx.room.compiler.processing.XElement
 import androidx.room.compiler.processing.XType
@@ -339,7 +340,7 @@
         daoMethods.groupBy { it.dao.typeName }
             .forEach {
                 if (it.value.size > 1) {
-                    val error = ProcessorErrors.duplicateDao(it.key,
+                    val error = ProcessorErrors.duplicateDao(it.key.toJavaPoet(),
                         it.value.map { it.element.jvmName }
                     )
                     it.value.forEach { daoMethod ->
@@ -363,7 +364,7 @@
                         element,
                         ProcessorErrors.shortcutEntityIsNotInDatabase(
                             database = dbElement.qualifiedName,
-                            dao = dao.typeName.toString(),
+                            dao = dao.typeName.toJavaPoet().toString(),
                             entity = typeName.toString()
                         )
                     )
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/solver/CodeGenScope.kt b/room/room-compiler/src/main/kotlin/androidx/room/solver/CodeGenScope.kt
index ff8021f..0bf6717 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/solver/CodeGenScope.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/solver/CodeGenScope.kt
@@ -16,29 +16,42 @@
 
 package androidx.room.solver
 
-import androidx.room.writer.ClassWriter
+import androidx.room.compiler.codegen.JCodeBlockBuilder
+import androidx.room.compiler.codegen.XCodeBlock
+import androidx.room.compiler.codegen.XCodeBlock.Builder.Companion.apply
+import androidx.room.writer.TypeWriter
 import com.google.common.annotations.VisibleForTesting
-import com.squareup.javapoet.CodeBlock
 
 /**
  * Defines a code generation scope where we can provide temporary variables, global variables etc
  */
-class CodeGenScope(val writer: ClassWriter) {
-    private var tmpVarIndices = mutableMapOf<String, Int>()
-    private var builder: CodeBlock.Builder? = null
+class CodeGenScope(
+    val writer: TypeWriter
+) {
+    val builder by lazy { XCodeBlock.builder(writer.codeLanguage) }
+    private val tmpVarIndices = mutableMapOf<String, Int>()
+
     companion object {
         const val TMP_VAR_DEFAULT_PREFIX = "_tmp"
         const val CLASS_PROPERTY_PREFIX = "__"
+
         @VisibleForTesting
-        fun _tmpVar(index: Int) = _tmpVar(TMP_VAR_DEFAULT_PREFIX, index)
-        fun _tmpVar(prefix: String, index: Int) = "$prefix${if (index == 0) "" else "_$index"}"
+        fun getTmpVarString(index: Int) =
+            getTmpVarString(TMP_VAR_DEFAULT_PREFIX, index)
+
+        private fun getTmpVarString(prefix: String, index: Int) =
+            "$prefix${if (index == 0) "" else "_$index"}"
     }
 
-    fun builder(): CodeBlock.Builder {
-        if (builder == null) {
-            builder = CodeBlock.builder()
-        }
-        return builder!!
+    // TODO(b/248383583): Remove once XPoet is more widely adopted.
+    // @Deprecated("Use property, will be removed once more writers are migrated to XPoet")
+    fun builder(): JCodeBlockBuilder {
+        lateinit var leakJavaBuilder: JCodeBlockBuilder
+        builder.apply(
+            javaCodeBuilder = { leakJavaBuilder = this },
+            kotlinCodeBuilder = { error("KotlinPoet code builder should have not been invoked!") }
+        )
+        return leakJavaBuilder
     }
 
     fun getTmpVar(): String {
@@ -46,22 +59,20 @@
     }
 
     fun getTmpVar(prefix: String): String {
-        if (!prefix.startsWith("_")) {
-            throw IllegalArgumentException("tmp variable prefixes should start with _")
-        }
-        if (prefix.startsWith(CLASS_PROPERTY_PREFIX)) {
-            throw IllegalArgumentException("cannot use $CLASS_PROPERTY_PREFIX for tmp variables")
+        require(prefix.startsWith("_")) { "Tmp variable prefixes should start with '_'." }
+        require(!prefix.startsWith(CLASS_PROPERTY_PREFIX)) {
+            "Cannot use '$CLASS_PROPERTY_PREFIX' for tmp variables."
         }
         val index = tmpVarIndices.getOrElse(prefix) { 0 }
-        val result = _tmpVar(prefix, index)
-        tmpVarIndices.put(prefix, index + 1)
+        val result = getTmpVarString(prefix, index)
+        tmpVarIndices[prefix] = index + 1
         return result
     }
 
-    fun generate(): CodeBlock = builder().build()
+    fun generate(): XCodeBlock = builder.build()
 
     /**
-     * copies all variable indices but excludes generated code.
+     * Copies all variable indices but excludes generated code.
      */
     fun fork(): CodeGenScope {
         val forked = CodeGenScope(writer)
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/solver/prepared/binder/CallablePreparedQueryResultBinder.kt b/room/room-compiler/src/main/kotlin/androidx/room/solver/prepared/binder/CallablePreparedQueryResultBinder.kt
index 3e44550..f5e5b06 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/solver/prepared/binder/CallablePreparedQueryResultBinder.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/solver/prepared/binder/CallablePreparedQueryResultBinder.kt
@@ -16,8 +16,8 @@
 
 package androidx.room.solver.prepared.binder
 
-import androidx.room.ext.CallableTypeSpecBuilder
 import androidx.room.compiler.processing.XType
+import androidx.room.ext.CallableTypeSpecBuilder
 import androidx.room.solver.CodeGenScope
 import androidx.room.solver.prepared.result.PreparedQueryResultAdapter
 import com.squareup.javapoet.CodeBlock
@@ -59,7 +59,7 @@
                 dbField,
                 binderScope
             )
-            addCode(binderScope.generate())
+            addCode(binderScope.builder().build())
         }.build()
 
         scope.builder().apply {
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/solver/query/result/RxCallableQueryResultBinder.kt b/room/room-compiler/src/main/kotlin/androidx/room/solver/query/result/RxCallableQueryResultBinder.kt
index d486787..5d96bb9 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/solver/query/result/RxCallableQueryResultBinder.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/solver/query/result/RxCallableQueryResultBinder.kt
@@ -94,7 +94,7 @@
         )
         beginControlFlow("try").apply {
             adapter?.convert(outVar, cursorVar, adapterScope)
-            addCode(adapterScope.generate())
+            addCode(adapterScope.builder().build())
             if (!rxType.canBeNull) {
                 beginControlFlow("if($L == null)", outVar).apply {
                     addStatement(
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/CallableDeleteOrUpdateMethodBinder.kt b/room/room-compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/CallableDeleteOrUpdateMethodBinder.kt
index f7f701e..166a74d 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/CallableDeleteOrUpdateMethodBinder.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/CallableDeleteOrUpdateMethodBinder.kt
@@ -16,8 +16,8 @@
 
 package androidx.room.solver.shortcut.binder
 
-import androidx.room.ext.CallableTypeSpecBuilder
 import androidx.room.compiler.processing.XType
+import androidx.room.ext.CallableTypeSpecBuilder
 import androidx.room.solver.CodeGenScope
 import androidx.room.solver.shortcut.result.DeleteOrUpdateMethodAdapter
 import androidx.room.vo.ShortcutQueryParameter
@@ -60,7 +60,7 @@
                 dbField = dbField,
                 scope = adapterScope
             )
-            addCode(adapterScope.generate())
+            addCode(adapterScope.builder().build())
         }.build()
 
         scope.builder().apply {
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/CallableInsertMethodBinder.kt b/room/room-compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/CallableInsertMethodBinder.kt
index a4601ad..7aa6c6c 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/CallableInsertMethodBinder.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/CallableInsertMethodBinder.kt
@@ -16,8 +16,8 @@
 
 package androidx.room.solver.shortcut.binder
 
-import androidx.room.ext.CallableTypeSpecBuilder
 import androidx.room.compiler.processing.XType
+import androidx.room.ext.CallableTypeSpecBuilder
 import androidx.room.solver.CodeGenScope
 import androidx.room.solver.shortcut.result.InsertOrUpsertMethodAdapter
 import androidx.room.vo.ShortcutQueryParameter
@@ -60,7 +60,7 @@
                 dbField = dbField,
                 scope = adapterScope
             )
-            addCode(adapterScope.generate())
+            addCode(adapterScope.builder().build())
         }.build()
 
         scope.builder().apply {
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/CallableUpsertMethodBinder.kt b/room/room-compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/CallableUpsertMethodBinder.kt
index b579df0..0f452e07 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/CallableUpsertMethodBinder.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/solver/shortcut/binder/CallableUpsertMethodBinder.kt
@@ -16,8 +16,8 @@
 
 package androidx.room.solver.shortcut.binder
 
-import androidx.room.ext.CallableTypeSpecBuilder
 import androidx.room.compiler.processing.XType
+import androidx.room.ext.CallableTypeSpecBuilder
 import androidx.room.solver.CodeGenScope
 import androidx.room.solver.shortcut.result.InsertOrUpsertMethodAdapter
 import androidx.room.vo.ShortcutQueryParameter
@@ -60,7 +60,7 @@
                 dbField = dbField,
                 scope = adapterScope
             )
-            addCode(adapterScope.generate())
+            addCode(adapterScope.builder().build())
         }.build()
 
         scope.builder().apply {
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/solver/transaction/binder/CoroutineTransactionMethodBinder.kt b/room/room-compiler/src/main/kotlin/androidx/room/solver/transaction/binder/CoroutineTransactionMethodBinder.kt
index 1d409be..9d44ef0 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/solver/transaction/binder/CoroutineTransactionMethodBinder.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/solver/transaction/binder/CoroutineTransactionMethodBinder.kt
@@ -16,13 +16,13 @@
 
 package androidx.room.solver.transaction.binder
 
+import androidx.room.compiler.processing.XType
 import androidx.room.ext.Function1TypeSpecBuilder
 import androidx.room.ext.KotlinTypeNames.CONTINUATION
 import androidx.room.ext.L
 import androidx.room.ext.N
 import androidx.room.ext.RoomTypeNames.ROOM_DB_KT
 import androidx.room.ext.T
-import androidx.room.compiler.processing.XType
 import androidx.room.solver.CodeGenScope
 import androidx.room.solver.transaction.result.TransactionMethodAdapter
 import com.squareup.javapoet.ClassName
@@ -58,7 +58,7 @@
             scope = adapterScope
         )
         val functionImpl: Any = if (useLambdaSyntax) {
-            CodeBlock.of("($L) -> $L", innerContinuationParamName, adapterScope.generate())
+            CodeBlock.of("($L) -> $L", innerContinuationParamName, adapterScope.builder().build())
         } else {
             Function1TypeSpecBuilder(
                 parameterTypeName = ParameterizedTypeName.get(
@@ -67,7 +67,7 @@
                 parameterName = innerContinuationParamName,
                 returnTypeName = ClassName.OBJECT
             ) {
-                addStatement(adapterScope.generate())
+                addStatement(adapterScope.builder().build())
             }.build()
         }
 
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/solver/transaction/binder/InstantTransactionMethodBinder.kt b/room/room-compiler/src/main/kotlin/androidx/room/solver/transaction/binder/InstantTransactionMethodBinder.kt
index 9fb94f53..4e41b81 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/solver/transaction/binder/InstantTransactionMethodBinder.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/solver/transaction/binder/InstantTransactionMethodBinder.kt
@@ -16,8 +16,8 @@
 
 package androidx.room.solver.transaction.binder
 
-import androidx.room.ext.N
 import androidx.room.compiler.processing.XType
+import androidx.room.ext.N
 import androidx.room.ext.isNotVoid
 import androidx.room.solver.CodeGenScope
 import androidx.room.solver.transaction.result.TransactionMethodAdapter
@@ -57,7 +57,7 @@
                     resultVar = resultVar,
                     scope = adapterScope
                 )
-                addStatement(adapterScope.generate())
+                addStatement(adapterScope.builder().build())
 
                 addStatement("$N.setTransactionSuccessful()", dbField)
                 if (returnsValue) {
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/solver/types/CustomTypeConverterWrapper.kt b/room/room-compiler/src/main/kotlin/androidx/room/solver/types/CustomTypeConverterWrapper.kt
index 07ae73c..e17cad7 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/solver/types/CustomTypeConverterWrapper.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/solver/types/CustomTypeConverterWrapper.kt
@@ -23,8 +23,8 @@
 import androidx.room.ext.decapitalize
 import androidx.room.solver.CodeGenScope
 import androidx.room.vo.CustomTypeConverter
-import androidx.room.writer.ClassWriter
 import androidx.room.writer.DaoWriter
+import androidx.room.writer.TypeWriter
 import com.squareup.javapoet.ClassName
 import com.squareup.javapoet.CodeBlock
 import com.squareup.javapoet.FieldSpec
@@ -35,8 +35,9 @@
 /**
  * Wraps a type converter specified by the developer and forwards calls to it.
  */
-class CustomTypeConverterWrapper(val custom: CustomTypeConverter) :
-    SingleStatementTypeConverter(custom.from, custom.to) {
+class CustomTypeConverterWrapper(
+    val custom: CustomTypeConverter
+) : SingleStatementTypeConverter(custom.from, custom.to) {
     override fun buildStatement(inputVarName: String, scope: CodeGenScope): CodeBlock {
         return if (custom.isEnclosingClassKotlinObject) {
             CodeBlock.of(
@@ -73,26 +74,28 @@
 
         val converterClassName = custom.typeName as ClassName
         scope.writer.addRequiredTypeConverter(converterClassName)
-        val converterField = scope.writer.getOrCreateField(object : ClassWriter.SharedFieldSpec(
-            baseName, custom.typeName
-        ) {
+        val converterField = scope.writer.getOrCreateField(
+            object : TypeWriter.SharedFieldSpec(
+                baseName, custom.typeName
+            ) {
                 override fun getUniqueKey(): String {
                     return "converter_${custom.typeName}"
                 }
 
-                override fun prepare(writer: ClassWriter, builder: FieldSpec.Builder) {
+                override fun prepare(writer: TypeWriter, builder: FieldSpec.Builder) {
                     builder.addModifiers(Modifier.PRIVATE)
                 }
-            })
+            }
+        )
 
-        return scope.writer.getOrCreateMethod(object : ClassWriter.SharedMethodSpec(baseName) {
+        return scope.writer.getOrCreateMethod(object : TypeWriter.SharedMethodSpec(baseName) {
             override fun getUniqueKey(): String {
                 return "converterMethod_${custom.typeName}"
             }
 
             override fun prepare(
                 methodName: String,
-                writer: ClassWriter,
+                writer: TypeWriter,
                 builder: MethodSpec.Builder
             ) {
                 builder.apply {
@@ -104,7 +107,7 @@
             }
 
             private fun buildConvertMethodBody(
-                writer: ClassWriter
+                writer: TypeWriter
             ): CodeBlock {
                 val methodScope = CodeGenScope(writer)
                 methodScope.builder().apply {
@@ -125,26 +128,28 @@
 
     fun typeConverter(scope: CodeGenScope): FieldSpec {
         val baseName = (custom.typeName as ClassName).simpleName().decapitalize(Locale.US)
-        return scope.writer.getOrCreateField(object : ClassWriter.SharedFieldSpec(
-            baseName, custom.typeName
-        ) {
+        return scope.writer.getOrCreateField(
+            object : TypeWriter.SharedFieldSpec(
+                baseName, custom.typeName
+            ) {
                 override fun getUniqueKey(): String {
                     return "converter_${custom.typeName}"
                 }
 
-                override fun prepare(writer: ClassWriter, builder: FieldSpec.Builder) {
+                override fun prepare(writer: TypeWriter, builder: FieldSpec.Builder) {
                     builder.addModifiers(Modifier.PRIVATE)
                     builder.addModifiers(Modifier.FINAL)
                     builder.initializer("new $T()", custom.typeName)
                 }
-            })
+            }
+        )
     }
 }
 
-fun ClassWriter.addRequiredTypeConverter(className: ClassName) {
+fun TypeWriter.addRequiredTypeConverter(className: ClassName) {
     this[ProvidedTypeConverter::class] = getRequiredTypeConverters() + setOf(className)
 }
 
-fun ClassWriter.getRequiredTypeConverters(): Set<ClassName> {
+fun TypeWriter.getRequiredTypeConverters(): Set<ClassName> {
     return this.get<Set<ClassName>>(ProvidedTypeConverter::class) ?: emptySet()
 }
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/solver/types/EnumColumnTypeAdapter.kt b/room/room-compiler/src/main/kotlin/androidx/room/solver/types/EnumColumnTypeAdapter.kt
index 74cdaf9..3820397 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/solver/types/EnumColumnTypeAdapter.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/solver/types/EnumColumnTypeAdapter.kt
@@ -24,7 +24,7 @@
 import androidx.room.ext.T
 import androidx.room.parser.SQLTypeAffinity.TEXT
 import androidx.room.solver.CodeGenScope
-import androidx.room.writer.ClassWriter
+import androidx.room.writer.TypeWriter
 import com.squareup.javapoet.MethodSpec
 import com.squareup.javapoet.ParameterSpec
 import javax.lang.model.element.Modifier
@@ -70,17 +70,17 @@
 
     private fun enumToStringMethod(scope: CodeGenScope): MethodSpec {
         return scope.writer.getOrCreateMethod(object :
-                ClassWriter.SharedMethodSpec(out.typeElement!!.name + "_enumToString") {
-                override fun getUniqueKey(): String {
-                    return "enumToString_" + out.typeName.toString()
-                }
+            TypeWriter.SharedMethodSpec(out.typeElement!!.name + "_enumToString") {
+            override fun getUniqueKey(): String {
+                return "enumToString_" + out.typeName.toString()
+            }
 
-                override fun prepare(
-                    methodName: String,
-                    writer: ClassWriter,
-                    builder: MethodSpec.Builder
-                ) {
-                    builder.apply {
+            override fun prepare(
+                methodName: String,
+                writer: TypeWriter,
+                builder: MethodSpec.Builder
+            ) {
+                builder.apply {
                         addModifiers(Modifier.PRIVATE)
                         returns(String::class.java)
                         val param = ParameterSpec.builder(
@@ -107,17 +107,17 @@
 
     private fun stringToEnumMethod(scope: CodeGenScope): MethodSpec {
         return scope.writer.getOrCreateMethod(object :
-                ClassWriter.SharedMethodSpec(out.typeElement!!.name + "_stringToEnum") {
-                override fun getUniqueKey(): String {
-                    return out.typeName.toString()
-                }
+            TypeWriter.SharedMethodSpec(out.typeElement!!.name + "_stringToEnum") {
+            override fun getUniqueKey(): String {
+                return out.typeName.toString()
+            }
 
-                override fun prepare(
-                    methodName: String,
-                    writer: ClassWriter,
-                    builder: MethodSpec.Builder
-                ) {
-                    builder.apply {
+            override fun prepare(
+                methodName: String,
+                writer: TypeWriter,
+                builder: MethodSpec.Builder
+            ) {
+                builder.apply {
                         addModifiers(Modifier.PRIVATE)
                         returns(out.typeName)
                         val param = ParameterSpec.builder(
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/vo/AutoMigration.kt b/room/room-compiler/src/main/kotlin/androidx/room/vo/AutoMigration.kt
index 4cbf4637..3e60540 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/vo/AutoMigration.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/vo/AutoMigration.kt
@@ -16,11 +16,11 @@
 
 package androidx.room.vo
 
+import androidx.room.compiler.codegen.XClassName
 import androidx.room.compiler.processing.XTypeElement
 import androidx.room.migration.bundle.EntityBundle
 import androidx.room.migration.bundle.FieldBundle
 import androidx.room.util.SchemaDiffResult
-import com.squareup.javapoet.ClassName
 
 /**
  * Stores the changes detected in a database schema between the old and new versions.
@@ -34,10 +34,10 @@
 ) {
     val specClassName = specElement?.className
 
-    fun getImplTypeName(databaseClassName: ClassName): ClassName {
-        return ClassName.get(
-            databaseClassName.packageName(),
-            "${databaseClassName.simpleNames().joinToString("_")}_AutoMigration_${from}_${to}_Impl"
+    fun getImplTypeName(databaseClassName: XClassName): XClassName {
+        return XClassName.get(
+            databaseClassName.packageName,
+            "${databaseClassName.simpleNames.joinToString("_")}_AutoMigration_${from}_${to}_Impl"
         )
     }
 
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/vo/Dao.kt b/room/room-compiler/src/main/kotlin/androidx/room/vo/Dao.kt
index aec2802..94f9283 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/vo/Dao.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/vo/Dao.kt
@@ -16,10 +16,9 @@
 
 package androidx.room.vo
 
+import androidx.room.compiler.codegen.XClassName
 import androidx.room.compiler.processing.XType
 import androidx.room.compiler.processing.XTypeElement
-import androidx.room.compiler.processing.isTypeElement
-import com.squareup.javapoet.ClassName
 import com.squareup.javapoet.TypeName
 
 data class Dao(
@@ -40,13 +39,12 @@
     private var suffix: String? = null
 
     fun setSuffix(newSuffix: String) {
-        if (this.suffix != null) {
-            throw IllegalStateException("cannot set suffix twice")
-        }
-        this.suffix = if (newSuffix == "") "" else "_$newSuffix"
+        check(this.suffix == null) { "cannot set suffix twice" }
+        require(newSuffix.isNotEmpty()) { "suffix can't be empty" }
+        this.suffix = "_$newSuffix"
     }
 
-    val typeName: ClassName by lazy { element.className }
+    val typeName: XClassName by lazy { element.asClassName() }
 
     val deleteOrUpdateShortcutMethods: List<DeleteOrUpdateShortcutMethod> by lazy {
         deletionMethods + updateMethods
@@ -56,20 +54,10 @@
         insertionMethods + upsertionMethods
     }
 
-    private val implClassName by lazy {
-        if (suffix == null) {
-            suffix = ""
-        }
-        val path = arrayListOf<String>()
-        var enclosing = element.enclosingTypeElement
-        while (enclosing?.isTypeElement() == true) {
-            path.add(enclosing!!.name)
-            enclosing = enclosing!!.enclosingTypeElement
-        }
-        path.reversed().joinToString("_") + "${typeName.simpleName()}${suffix}_Impl"
-    }
-
-    val implTypeName: ClassName by lazy {
-        ClassName.get(typeName.packageName(), implClassName)
+    val implTypeName: XClassName by lazy {
+        XClassName.get(
+            typeName.packageName,
+            typeName.simpleNames.joinToString("_") + (suffix ?: "") + "_Impl"
+        )
     }
 }
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/vo/Database.kt b/room/room-compiler/src/main/kotlin/androidx/room/vo/Database.kt
index 8afced46d..d65aedb 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/vo/Database.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/vo/Database.kt
@@ -17,13 +17,13 @@
 package androidx.room.vo
 
 import androidx.room.RoomMasterTable
+import androidx.room.compiler.codegen.XClassName
 import androidx.room.compiler.processing.XType
 import androidx.room.compiler.processing.XTypeElement
 import androidx.room.migration.bundle.DatabaseBundle
 import androidx.room.migration.bundle.SchemaBundle
-import com.squareup.javapoet.ClassName
-import org.apache.commons.codec.digest.DigestUtils
 import java.io.File
+import org.apache.commons.codec.digest.DigestUtils
 
 /**
  * Holds information about a class annotated with Database.
@@ -41,14 +41,14 @@
     // This variable will be set once auto-migrations are processed given the DatabaseBundle from
     // this object. This is necessary for tracking the versions involved in the auto-migration.
     lateinit var autoMigrations: List<AutoMigration>
-    val typeName: ClassName by lazy { element.className }
+    val typeName: XClassName by lazy { element.asClassName() }
 
     private val implClassName by lazy {
-        "${typeName.simpleNames().joinToString("_")}_Impl"
+        "${typeName.simpleNames.joinToString("_")}_Impl"
     }
 
-    val implTypeName: ClassName by lazy {
-        ClassName.get(typeName.packageName(), implClassName)
+    val implTypeName: XClassName by lazy {
+        XClassName.get(typeName.packageName, implClassName)
     }
 
     val bundle by lazy {
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/writer/AutoMigrationWriter.kt b/room/room-compiler/src/main/kotlin/androidx/room/writer/AutoMigrationWriter.kt
index c6cdbe8..db75984 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/writer/AutoMigrationWriter.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/writer/AutoMigrationWriter.kt
@@ -24,7 +24,7 @@
 import androidx.room.compiler.codegen.XFunSpec.Builder.Companion.addStatement
 import androidx.room.compiler.codegen.XTypeSpec
 import androidx.room.compiler.codegen.addOriginatingElement
-import androidx.room.compiler.processing.XNullability
+import androidx.room.compiler.codegen.toXClassName
 import androidx.room.compiler.processing.XTypeElement
 import androidx.room.ext.RoomTypeNames
 import androidx.room.ext.SupportDbTypeNames
@@ -32,7 +32,6 @@
 import androidx.room.migration.bundle.EntityBundle
 import androidx.room.migration.bundle.FtsEntityBundle
 import androidx.room.vo.AutoMigration
-import com.squareup.javapoet.TypeName
 import com.squareup.kotlinpoet.javapoet.toKClassName
 
 /**
@@ -41,8 +40,8 @@
 class AutoMigrationWriter(
     private val dbElement: XTypeElement,
     val autoMigration: AutoMigration,
-    private val codeLanguage: CodeLanguage
-) : TypeWriter(autoMigration.getImplTypeName(dbElement.className)) {
+    codeLanguage: CodeLanguage
+) : TypeWriter(codeLanguage) {
     private val addedColumns = autoMigration.schemaDiff.addedColumns
     private val addedTables = autoMigration.schemaDiff.addedTables
     private val renamedTables = autoMigration.schemaDiff.renamedTables
@@ -52,17 +51,16 @@
     override fun createTypeSpecBuilder(): XTypeSpec.Builder {
         val builder = XTypeSpec.classBuilder(
             codeLanguage,
-            autoMigration.getImplTypeName(dbElement.className)
+            autoMigration.getImplTypeName(dbElement.asClassName())
         )
         builder.apply {
             addOriginatingElement(dbElement)
-            superclass(RoomTypeNames.MIGRATION)
+            superclass(RoomTypeNames.MIGRATION.toXClassName())
 
             if (autoMigration.specClassName != null) {
                 builder.addProperty(
-                    typeName = RoomTypeNames.AUTO_MIGRATION_SPEC,
+                    typeName = RoomTypeNames.AUTO_MIGRATION_SPEC.toXClassName(),
                     name = "callback",
-                    nullability = XNullability.NONNULL,
                     visibility = VisibilityModifier.PRIVATE,
                     initExpr = if (!autoMigration.isSpecProvided) {
                         XCodeBlock.builder(codeLanguage).apply(
@@ -97,9 +95,8 @@
             )
             if (autoMigration.isSpecProvided) {
                 addParameter(
-                    typeName = RoomTypeNames.AUTO_MIGRATION_SPEC,
+                    typeName = RoomTypeNames.AUTO_MIGRATION_SPEC.toXClassName(),
                     name = "callback",
-                    nullability = XNullability.NONNULL
                 )
                 addStatement("this.callback = callback")
             }
@@ -114,11 +111,9 @@
             isOverridden = true,
         ).apply {
                 addParameter(
-                    typeName = SupportDbTypeNames.DB,
+                    typeName = SupportDbTypeNames.DB.toXClassName(),
                     name = "database",
-                    nullability = XNullability.NONNULL
                 )
-                returns(TypeName.VOID, XNullability.NONNULL)
                 addMigrationStatements(this)
                 if (autoMigration.specClassName != null) {
                     addStatement("callback.onPostMigrate(database)")
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/writer/ClassWriter.kt b/room/room-compiler/src/main/kotlin/androidx/room/writer/ClassWriter.kt
deleted file mode 100644
index 23b04c1..0000000
--- a/room/room-compiler/src/main/kotlin/androidx/room/writer/ClassWriter.kt
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright (C) 2016 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 androidx.room.writer
-
-import androidx.room.RoomProcessor
-import androidx.room.ext.S
-import androidx.room.ext.typeName
-import androidx.room.compiler.processing.XProcessingEnv
-import androidx.room.compiler.processing.writeTo
-import androidx.room.solver.CodeGenScope.Companion.CLASS_PROPERTY_PREFIX
-import com.squareup.javapoet.AnnotationSpec
-import com.squareup.javapoet.ClassName
-import com.squareup.javapoet.FieldSpec
-import com.squareup.javapoet.JavaFile
-import com.squareup.javapoet.MethodSpec
-import com.squareup.javapoet.TypeName
-import com.squareup.javapoet.TypeSpec
-import kotlin.reflect.KClass
-
-/**
- * Base class for all writers that can produce a class.
- */
-abstract class ClassWriter(private val className: ClassName) {
-    private val sharedFieldSpecs = mutableMapOf<String, FieldSpec>()
-    private val sharedMethodSpecs = mutableMapOf<String, MethodSpec>()
-    private val sharedFieldNames = mutableSetOf<String>()
-    private val sharedMethodNames = mutableSetOf<String>()
-    private val metadata = mutableMapOf<KClass<*>, Any>()
-
-    abstract fun createTypeSpecBuilder(): TypeSpec.Builder
-
-    /**
-     * Read additional metadata that can be put by sub code generators.
-     *
-     * @see set for more details.
-     */
-    operator fun <T> get(key: KClass<*>): T? {
-        @Suppress("UNCHECKED_CAST")
-        return metadata[key] as? T
-    }
-
-    /**
-     * Add additional metadata to the ClassWriter that can be read back later.
-     * This is useful for additional functionality where a sub code generator needs to bubble up
-     * information to the main ClassWriter without copying it in every intermediate step.
-     *
-     * @see get
-     */
-    operator fun set(key: KClass<*>, value: Any) {
-        metadata[key] = value
-    }
-
-    fun write(processingEnv: XProcessingEnv) {
-        val builder = createTypeSpecBuilder()
-        sharedFieldSpecs.values.forEach { builder.addField(it) }
-        sharedMethodSpecs.values.forEach { builder.addMethod(it) }
-        addGeneratedAnnotationIfAvailable(builder, processingEnv)
-        addSuppressWarnings(builder)
-        JavaFile.builder(className.packageName(), builder.build())
-            .build()
-            .writeTo(processingEnv.filer)
-    }
-
-    private fun addSuppressWarnings(builder: TypeSpec.Builder) {
-        val suppressSpec = AnnotationSpec.builder(SuppressWarnings::class.typeName)
-            .addMember(
-                "value",
-                "{$S, $S}",
-                "unchecked", "deprecation"
-            ).build()
-        builder.addAnnotation(suppressSpec)
-    }
-
-    private fun addGeneratedAnnotationIfAvailable(
-        adapterTypeSpecBuilder: TypeSpec.Builder,
-        processingEnv: XProcessingEnv
-    ) {
-        processingEnv.findGeneratedAnnotation()?.let {
-            val generatedAnnotationSpec =
-                AnnotationSpec.builder(it.className)
-                    .addMember("value", S, RoomProcessor::class.java.canonicalName)
-                    .build()
-            adapterTypeSpecBuilder.addAnnotation(generatedAnnotationSpec)
-        }
-    }
-
-    private fun makeUnique(set: MutableSet<String>, value: String): String {
-        if (!value.startsWith(CLASS_PROPERTY_PREFIX)) {
-            return makeUnique(set, "$CLASS_PROPERTY_PREFIX$value")
-        }
-        if (set.add(value)) {
-            return value
-        }
-        var index = 1
-        while (true) {
-            if (set.add("${value}_$index")) {
-                return "${value}_$index"
-            }
-            index++
-        }
-    }
-
-    fun getOrCreateField(sharedField: SharedFieldSpec): FieldSpec {
-        return sharedFieldSpecs.getOrPut(
-            sharedField.getUniqueKey(),
-            {
-                sharedField.build(this, makeUnique(sharedFieldNames, sharedField.baseName))
-            }
-        )
-    }
-
-    fun getOrCreateMethod(sharedMethod: SharedMethodSpec): MethodSpec {
-        return sharedMethodSpecs.getOrPut(
-            sharedMethod.getUniqueKey(),
-            {
-                sharedMethod.build(this, makeUnique(sharedMethodNames, sharedMethod.baseName))
-            }
-        )
-    }
-
-    abstract class SharedFieldSpec(val baseName: String, val type: TypeName) {
-
-        abstract fun getUniqueKey(): String
-
-        abstract fun prepare(writer: ClassWriter, builder: FieldSpec.Builder)
-
-        fun build(classWriter: ClassWriter, name: String): FieldSpec {
-            val builder = FieldSpec.builder(type, name)
-            prepare(classWriter, builder)
-            return builder.build()
-        }
-    }
-
-    abstract class SharedMethodSpec(val baseName: String) {
-
-        abstract fun getUniqueKey(): String
-        abstract fun prepare(methodName: String, writer: ClassWriter, builder: MethodSpec.Builder)
-
-        fun build(writer: ClassWriter, name: String): MethodSpec {
-            val builder = MethodSpec.methodBuilder(name)
-            prepare(name, writer, builder)
-            return builder.build()
-        }
-    }
-}
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/writer/DaoWriter.kt b/room/room-compiler/src/main/kotlin/androidx/room/writer/DaoWriter.kt
index 6d26923..9b465ec 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/writer/DaoWriter.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/writer/DaoWriter.kt
@@ -16,10 +16,13 @@
 
 package androidx.room.writer
 
+import androidx.room.compiler.codegen.CodeLanguage
+import androidx.room.compiler.codegen.XTypeSpec
+import androidx.room.compiler.codegen.XTypeSpec.Builder.Companion.apply
+import androidx.room.compiler.codegen.toJavaPoet
 import androidx.room.compiler.processing.MethodSpecHelper
 import androidx.room.compiler.processing.XElement
 import androidx.room.compiler.processing.XMethodElement
-import androidx.room.compiler.processing.XProcessingEnv
 import androidx.room.compiler.processing.XType
 import androidx.room.compiler.processing.addOriginatingElement
 import androidx.room.compiler.processing.isVoid
@@ -37,17 +40,17 @@
 import androidx.room.solver.KotlinDefaultMethodDelegateBinder
 import androidx.room.solver.types.getRequiredTypeConverters
 import androidx.room.vo.Dao
+import androidx.room.vo.DeleteOrUpdateShortcutMethod
 import androidx.room.vo.InsertionMethod
-import androidx.room.vo.UpsertionMethod
 import androidx.room.vo.KotlinBoxedPrimitiveMethodDelegate
 import androidx.room.vo.KotlinDefaultMethodDelegate
 import androidx.room.vo.QueryMethod
 import androidx.room.vo.RawQueryMethod
 import androidx.room.vo.ReadQueryMethod
 import androidx.room.vo.ShortcutEntity
-import androidx.room.vo.DeleteOrUpdateShortcutMethod
 import androidx.room.vo.TransactionMethod
 import androidx.room.vo.UpdateMethod
+import androidx.room.vo.UpsertionMethod
 import androidx.room.vo.WriteQueryMethod
 import com.squareup.javapoet.ClassName
 import com.squareup.javapoet.CodeBlock
@@ -72,13 +75,13 @@
 class DaoWriter(
     val dao: Dao,
     private val dbElement: XElement,
-    val processingEnv: XProcessingEnv
-) :
-    ClassWriter(dao.typeName) {
+    codeLanguage: CodeLanguage
+) : TypeWriter(codeLanguage) {
     private val declaredDao = dao.element.type
 
     companion object {
         const val GET_LIST_OF_TYPE_CONVERTERS_METHOD = "getRequiredConverters"
+
         // TODO nothing prevents this from conflicting, we should fix.
         val dbField: FieldSpec = FieldSpec
             .builder(RoomTypeNames.ROOM_DB, "__db", PRIVATE, FINAL)
@@ -102,8 +105,9 @@
         }
     }
 
-    override fun createTypeSpecBuilder(): TypeSpec.Builder {
-        val builder = TypeSpec.classBuilder(dao.implTypeName)
+    override fun createTypeSpecBuilder(): XTypeSpec.Builder {
+        val builder = XTypeSpec.classBuilder(codeLanguage, dao.implTypeName)
+
         /**
          * For prepared statements that perform insert/update/delete/upsert,
          * we check if there are any arguments of variable length (e.g. "IN (:var)").
@@ -126,45 +130,57 @@
             addAll(createUpsertMethods())
         }
 
-        builder.apply {
-            addOriginatingElement(dbElement)
-            addModifiers(PUBLIC)
-            addModifiers(FINAL)
-            if (dao.element.isInterface()) {
-                addSuperinterface(dao.typeName)
-            } else {
-                superclass(dao.typeName)
-            }
-            addField(dbField)
-            val dbParam = ParameterSpec
-                .builder(dao.constructorParamType ?: dbField.type, dbField.name).build()
+        builder.apply(
+            javaTypeBuilder = {
+                addOriginatingElement(dbElement)
+                addModifiers(PUBLIC)
+                addModifiers(FINAL)
+                if (dao.element.isInterface()) {
+                    addSuperinterface(dao.typeName.toJavaPoet())
+                } else {
+                    superclass(dao.typeName.toJavaPoet())
+                }
+                addField(dbField)
+                val dbParam = ParameterSpec
+                    .builder(dao.constructorParamType ?: dbField.type, dbField.name).build()
 
-            addMethod(createConstructor(dbParam, shortcutMethods, dao.constructorParamType != null))
+                addMethod(
+                    createConstructor(
+                        dbParam,
+                        shortcutMethods,
+                        dao.constructorParamType != null
+                    )
+                )
 
-            shortcutMethods.forEach {
-                addMethod(it.methodImpl)
-            }
+                shortcutMethods.forEach {
+                    addMethod(it.methodImpl)
+                }
 
-            dao.queryMethods.filterIsInstance<ReadQueryMethod>().forEach { method ->
-                addMethod(createSelectMethod(method))
-            }
-            oneOffPreparedQueries.forEach {
-                addMethod(createPreparedQueryMethod(it))
-            }
-            dao.rawQueryMethods.forEach {
-                addMethod(createRawQueryMethod(it))
-            }
-            dao.kotlinDefaultMethodDelegates.forEach {
-                addMethod(createDefaultMethodDelegate(it))
-            }
+                dao.queryMethods.filterIsInstance<ReadQueryMethod>().forEach { method ->
+                    addMethod(createSelectMethod(method))
+                }
+                oneOffPreparedQueries.forEach {
+                    addMethod(createPreparedQueryMethod(it))
+                }
+                dao.rawQueryMethods.forEach {
+                    addMethod(createRawQueryMethod(it))
+                }
+                dao.kotlinDefaultMethodDelegates.forEach {
+                    addMethod(createDefaultMethodDelegate(it))
+                }
 
-            dao.delegatingMethods.forEach {
-                addMethod(createDelegatingMethod(it))
+                dao.delegatingMethods.forEach {
+                    addMethod(createDelegatingMethod(it))
+                }
+                // keep this the last one to be generated because used custom converters will
+                // register fields with a payload which we collect in dao to report used
+                // Type Converters.
+                addMethod(createConverterListMethod())
+            },
+            kotlinTypeBuilder = {
+                TODO("Kotlin codegen not yet implemented!")
             }
-            // keep this the last one to be generated because used custom converters will register
-            // fields with a payload which we collect in dao to report used Type Converters.
-            addMethod(createConverterListMethod())
-        }
+        )
         return builder
     }
 
@@ -236,7 +252,7 @@
             scope = scope
         )
         return overrideWithoutAnnotations(method.element, declaredDao)
-            .addCode(scope.generate())
+            .addCode(scope.builder().build())
             .build()
     }
 
@@ -251,13 +267,13 @@
         method.methodBinder.executeAndReturn(
             returnType = method.returnType,
             parameterNames = method.parameterNames,
-            daoName = dao.typeName,
-            daoImplName = dao.implTypeName,
+            daoName = dao.typeName.toJavaPoet(),
+            daoImplName = dao.implTypeName.toJavaPoet(),
             dbField = dbField,
             scope = scope
         )
         return overrideWithoutAnnotations(method.element, declaredDao)
-            .addCode(scope.generate())
+            .addCode(scope.builder().build())
             .build()
     }
 
@@ -534,7 +550,7 @@
             dbField = dbField,
             scope = scope
         )
-        return scope.generate()
+        return scope.builder().build()
     }
 
     private fun createQueryMethodBody(method: ReadQueryMethod): CodeBlock {
@@ -557,8 +573,8 @@
         val scope = CodeGenScope(this)
         return overrideWithoutAnnotations(method.element, declaredDao).apply {
             KotlinDefaultMethodDelegateBinder.executeAndReturn(
-                daoName = dao.typeName,
-                daoImplName = dao.implTypeName,
+                daoName = dao.typeName.toJavaPoet(),
+                daoImplName = dao.implTypeName.toJavaPoet(),
                 methodName = method.element.jvmName,
                 returnType = method.element.returnType,
                 parameterNames = method.element.parameters.map { it.name },
@@ -626,7 +642,7 @@
             return "${shortcutEntity.pojo.typeName}-${shortcutEntity.entityTypeName}$onConflictText"
         }
 
-        override fun prepare(writer: ClassWriter, builder: FieldSpec.Builder) {
+        override fun prepare(writer: TypeWriter, builder: FieldSpec.Builder) {
             builder.addModifiers(FINAL, PRIVATE)
         }
     }
@@ -641,7 +657,7 @@
             RoomTypeNames.DELETE_OR_UPDATE_ADAPTER, shortcutEntity.pojo.typeName
         )
     ) {
-        override fun prepare(writer: ClassWriter, builder: FieldSpec.Builder) {
+        override fun prepare(writer: TypeWriter, builder: FieldSpec.Builder) {
             builder.addModifiers(PRIVATE, FINAL)
         }
 
@@ -663,7 +679,7 @@
             return "${shortcutEntity.pojo.typeName}-${shortcutEntity.entityTypeName}"
         }
 
-        override fun prepare(writer: ClassWriter, builder: FieldSpec.Builder) {
+        override fun prepare(writer: TypeWriter, builder: FieldSpec.Builder) {
             builder.addModifiers(PRIVATE, FINAL)
         }
     }
@@ -672,7 +688,7 @@
         "preparedStmtOf${method.element.jvmName.capitalize(Locale.US)}",
         RoomTypeNames.SHARED_SQLITE_STMT
     ) {
-        override fun prepare(writer: ClassWriter, builder: FieldSpec.Builder) {
+        override fun prepare(writer: TypeWriter, builder: FieldSpec.Builder) {
             builder.addModifiers(PRIVATE, FINAL)
         }
 
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/writer/DatabaseWriter.kt b/room/room-compiler/src/main/kotlin/androidx/room/writer/DatabaseWriter.kt
index 6e5db80..fe49b03 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/writer/DatabaseWriter.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/writer/DatabaseWriter.kt
@@ -17,6 +17,10 @@
 package androidx.room.writer
 
 import androidx.annotation.NonNull
+import androidx.room.compiler.codegen.CodeLanguage
+import androidx.room.compiler.codegen.XTypeSpec
+import androidx.room.compiler.codegen.XTypeSpec.Builder.Companion.apply
+import androidx.room.compiler.codegen.toJavaPoet
 import androidx.room.compiler.processing.MethodSpecHelper
 import androidx.room.compiler.processing.addOriginatingElement
 import androidx.room.ext.AndroidTypeNames
@@ -53,22 +57,30 @@
 /**
  * Writes implementation of classes that were annotated with @Database.
  */
-class DatabaseWriter(val database: Database) : ClassWriter(database.implTypeName) {
-    override fun createTypeSpecBuilder(): TypeSpec.Builder {
-        val builder = TypeSpec.classBuilder(database.implTypeName)
-        builder.apply {
-            addOriginatingElement(database.element)
-            addModifiers(PUBLIC)
-            addModifiers(FINAL)
-            superclass(database.typeName)
-            addMethod(createCreateOpenHelper())
-            addMethod(createCreateInvalidationTracker())
-            addMethod(createClearAllTables())
-            addMethod(createCreateTypeConvertersMap())
-            addMethod(createCreateAutoMigrationSpecsSet())
-            addMethod(getAutoMigrations())
-        }
-        addDaoImpls(builder)
+class DatabaseWriter(
+    val database: Database,
+    codeLanguage: CodeLanguage
+) : TypeWriter(codeLanguage) {
+    override fun createTypeSpecBuilder(): XTypeSpec.Builder {
+        val builder = XTypeSpec.classBuilder(codeLanguage, database.implTypeName)
+        builder.apply(
+            javaTypeBuilder = {
+                addOriginatingElement(database.element)
+                addModifiers(PUBLIC)
+                addModifiers(FINAL)
+                superclass(database.typeName.toJavaPoet())
+                addMethod(createCreateOpenHelper())
+                addMethod(createCreateInvalidationTracker())
+                addMethod(createClearAllTables())
+                addMethod(createCreateTypeConvertersMap())
+                addMethod(createCreateAutoMigrationSpecsSet())
+                addMethod(getAutoMigrations())
+                addDaoImpls(this)
+            },
+            kotlinTypeBuilder = {
+                TODO("Kotlin codegen not yet implemented!")
+            }
+        )
         return builder
     }
 
@@ -118,8 +130,8 @@
                 addStatement(
                     "$L.put($T.class, $T.$L())",
                     typeConvertersVar,
-                    it.dao.typeName,
-                    it.dao.implTypeName,
+                    it.dao.typeName.toJavaPoet(),
+                    it.dao.implTypeName.toJavaPoet(),
                     DaoWriter.GET_LIST_OF_TYPE_CONVERTERS_METHOD
                 )
             }
@@ -292,10 +304,12 @@
         val scope = CodeGenScope(this)
         builder.apply {
             database.daoMethods.forEach { method ->
-                val name = method.dao.typeName.simpleName().decapitalize(Locale.US).stripNonJava()
+                val name = method.dao.typeName.toJavaPoet().simpleName()
+                    .decapitalize(Locale.US)
+                    .stripNonJava()
                 val fieldName = scope.getTmpVar("_$name")
                 val field = FieldSpec.builder(
-                    method.dao.typeName, fieldName,
+                    method.dao.typeName.toJavaPoet(), fieldName,
                     PRIVATE, VOLATILE
                 ).build()
                 addField(field)
@@ -315,7 +329,11 @@
             nextControlFlow("else").apply {
                 beginControlFlow("synchronized(this)").apply {
                     beginControlFlow("if($N == null)", field).apply {
-                        addStatement("$N = new $T(this)", field, method.dao.implTypeName)
+                        addStatement(
+                            "$N = new $T(this)",
+                            field,
+                            method.dao.implTypeName.toJavaPoet()
+                        )
                     }
                     endControlFlow()
                     addStatement("return $N", field)
@@ -368,15 +386,16 @@
 
             returns(ParameterizedTypeName.get(CommonTypeNames.LIST, RoomTypeNames.MIGRATION))
             val autoMigrationsList = database.autoMigrations.map { autoMigrationResult ->
-                val implTypeName = autoMigrationResult.getImplTypeName(database.typeName)
+                val implTypeName =
+                    autoMigrationResult.getImplTypeName(database.typeName)
                 if (autoMigrationResult.isSpecProvided) {
                     CodeBlock.of(
                         "new $T(autoMigrationSpecsMap.get($T.class))",
-                        implTypeName,
+                        implTypeName.toJavaPoet(),
                         autoMigrationResult.specClassName
                     )
                 } else {
-                    CodeBlock.of("new $T()", implTypeName)
+                    CodeBlock.of("new $T()", implTypeName.toJavaPoet())
                 }
             }
             addStatement(
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/writer/EntityCursorConverterWriter.kt b/room/room-compiler/src/main/kotlin/androidx/room/writer/EntityCursorConverterWriter.kt
index cf277eb..af86099 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/writer/EntityCursorConverterWriter.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/writer/EntityCursorConverterWriter.kt
@@ -34,14 +34,14 @@
 import java.util.Locale
 import javax.lang.model.element.Modifier.PRIVATE
 
-class EntityCursorConverterWriter(val entity: Entity) : ClassWriter.SharedMethodSpec(
+class EntityCursorConverterWriter(val entity: Entity) : TypeWriter.SharedMethodSpec(
     "entityCursorConverter_${entity.typeName.toString().stripNonJava()}"
 ) {
     override fun getUniqueKey(): String {
         return "generic_entity_converter_of_${entity.element.qualifiedName}"
     }
 
-    override fun prepare(methodName: String, writer: ClassWriter, builder: MethodSpec.Builder) {
+    override fun prepare(methodName: String, writer: TypeWriter, builder: MethodSpec.Builder) {
         builder.apply {
             val cursorParam = ParameterSpec
                 .builder(AndroidTypeNames.CURSOR, "cursor").build()
@@ -52,7 +52,7 @@
         }
     }
 
-    private fun buildConvertMethodBody(writer: ClassWriter, cursorParam: ParameterSpec): CodeBlock {
+    private fun buildConvertMethodBody(writer: TypeWriter, cursorParam: ParameterSpec): CodeBlock {
         val scope = CodeGenScope(writer)
         val entityVar = scope.getTmpVar("_entity")
         scope.builder().apply {
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/writer/EntityDeletionAdapterWriter.kt b/room/room-compiler/src/main/kotlin/androidx/room/writer/EntityDeletionAdapterWriter.kt
index 9be1753..4963ac1 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/writer/EntityDeletionAdapterWriter.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/writer/EntityDeletionAdapterWriter.kt
@@ -54,7 +54,7 @@
         }
     }
 
-    fun createAnonymous(classWriter: ClassWriter, dbParam: String): TypeSpec {
+    fun createAnonymous(typeWriter: TypeWriter, dbParam: String): TypeSpec {
         @Suppress("RemoveSingleExpressionStringTemplate")
         return TypeSpec.anonymousClassBuilder("$L", dbParam).apply {
             superclass(
@@ -75,7 +75,7 @@
             )
             addMethod(
                 MethodSpec.methodBuilder("bind").apply {
-                    val bindScope = CodeGenScope(classWriter)
+                    val bindScope = CodeGenScope(typeWriter)
                     addAnnotation(Override::class.java)
                     val stmtParam = "stmt"
                     addParameter(
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/writer/EntityInsertionAdapterWriter.kt b/room/room-compiler/src/main/kotlin/androidx/room/writer/EntityInsertionAdapterWriter.kt
index 577b0cf..cd328f7 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/writer/EntityInsertionAdapterWriter.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/writer/EntityInsertionAdapterWriter.kt
@@ -66,7 +66,7 @@
         }
     }
 
-    fun createAnonymous(classWriter: ClassWriter, dbParam: String): TypeSpec {
+    fun createAnonymous(typeWriter: TypeWriter, dbParam: String): TypeSpec {
         @Suppress("RemoveSingleExpressionStringTemplate")
         return TypeSpec.anonymousClassBuilder("$L", dbParam).apply {
             superclass(ParameterizedTypeName.get(RoomTypeNames.INSERTION_ADAPTER, pojo.typeName))
@@ -99,7 +99,7 @@
             )
             addMethod(
                 MethodSpec.methodBuilder("bind").apply {
-                    val bindScope = CodeGenScope(classWriter)
+                    val bindScope = CodeGenScope(typeWriter)
                     addAnnotation(Override::class.java)
                     addModifiers(PUBLIC)
                     returns(TypeName.VOID)
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/writer/EntityUpdateAdapterWriter.kt b/room/room-compiler/src/main/kotlin/androidx/room/writer/EntityUpdateAdapterWriter.kt
index 44822ad..e6023e5 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/writer/EntityUpdateAdapterWriter.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/writer/EntityUpdateAdapterWriter.kt
@@ -50,7 +50,7 @@
             )
     }
 
-    fun createAnonymous(classWriter: ClassWriter, dbParam: String): TypeSpec {
+    fun createAnonymous(typeWriter: TypeWriter, dbParam: String): TypeSpec {
         @Suppress("RemoveSingleExpressionStringTemplate")
         return TypeSpec.anonymousClassBuilder("$L", dbParam).apply {
             superclass(
@@ -85,7 +85,7 @@
             )
             addMethod(
                 MethodSpec.methodBuilder("bind").apply {
-                    val bindScope = CodeGenScope(classWriter)
+                    val bindScope = CodeGenScope(typeWriter)
                     addAnnotation(Override::class.java)
                     addModifiers(PUBLIC)
                     returns(TypeName.VOID)
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/writer/EntityUpsertionAdapterWriter.kt b/room/room-compiler/src/main/kotlin/androidx/room/writer/EntityUpsertionAdapterWriter.kt
index 11dc2a9..eab3b3e 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/writer/EntityUpsertionAdapterWriter.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/writer/EntityUpsertionAdapterWriter.kt
@@ -40,16 +40,16 @@
 
     fun createConcrete(
         entity: ShortcutEntity,
-        classWriter: ClassWriter,
+        typeWriter: TypeWriter,
         dbParam: String
     ): CodeBlock {
         val upsertionAdapter = ParameterizedTypeName.get(
             RoomTypeNames.UPSERTION_ADAPTER, pojo.typeName
         )
         val insertionHelper = EntityInsertionAdapterWriter.create(entity, "")
-            .createAnonymous(classWriter, dbParam)
+            .createAnonymous(typeWriter, dbParam)
         val updateHelper = EntityUpdateAdapterWriter.create(entity, "")
-            .createAnonymous(classWriter, dbParam)
+            .createAnonymous(typeWriter, dbParam)
         return CodeBlock.builder().add("new $T($L, $L)",
             upsertionAdapter, insertionHelper, updateHelper
         ).build()
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/writer/PreparedStatementWriter.kt b/room/room-compiler/src/main/kotlin/androidx/room/writer/PreparedStatementWriter.kt
index 53e3f57..a37740f 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/writer/PreparedStatementWriter.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/writer/PreparedStatementWriter.kt
@@ -29,8 +29,8 @@
  * Creates anonymous classes for RoomTypeNames#SHARED_SQLITE_STMT.
  */
 class PreparedStatementWriter(val queryWriter: QueryWriter) {
-    fun createAnonymous(classWriter: ClassWriter, dbParam: FieldSpec): TypeSpec {
-        val scope = CodeGenScope(classWriter)
+    fun createAnonymous(typeWriter: TypeWriter, dbParam: FieldSpec): TypeSpec {
+        val scope = CodeGenScope(typeWriter)
         @Suppress("RemoveSingleExpressionStringTemplate")
         return TypeSpec.anonymousClassBuilder("$N", dbParam).apply {
             superclass(RoomTypeNames.SHARED_SQLITE_STMT)
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/writer/RelationCollectorMethodWriter.kt b/room/room-compiler/src/main/kotlin/androidx/room/writer/RelationCollectorMethodWriter.kt
index 04f9387..e7bd3a9 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/writer/RelationCollectorMethodWriter.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/writer/RelationCollectorMethodWriter.kt
@@ -40,7 +40,7 @@
  * Writes the method that fetches the relations of a POJO and assigns them into the given map.
  */
 class RelationCollectorMethodWriter(private val collector: RelationCollector) :
-    ClassWriter.SharedMethodSpec(
+    TypeWriter.SharedMethodSpec(
         "fetchRelationship${collector.relation.entity.tableName.stripNonJava()}" +
             "As${collector.relation.pojoTypeName.toString().stripNonJava()}"
     ) {
@@ -58,7 +58,7 @@
             "-${relation.createLoadAllSql()}"
     }
 
-    override fun prepare(methodName: String, writer: ClassWriter, builder: MethodSpec.Builder) {
+    override fun prepare(methodName: String, writer: TypeWriter, builder: MethodSpec.Builder) {
         val scope = CodeGenScope(writer)
         val relation = collector.relation
 
diff --git a/room/room-compiler/src/main/kotlin/androidx/room/writer/TypeWriter.kt b/room/room-compiler/src/main/kotlin/androidx/room/writer/TypeWriter.kt
index 349b407..5722888 100644
--- a/room/room-compiler/src/main/kotlin/androidx/room/writer/TypeWriter.kt
+++ b/room/room-compiler/src/main/kotlin/androidx/room/writer/TypeWriter.kt
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2016 The Android Open Source Project
+ * Copyright 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.
@@ -17,19 +17,28 @@
 package androidx.room.writer
 
 import androidx.room.RoomProcessor
+import androidx.room.compiler.codegen.CodeLanguage
 import androidx.room.compiler.codegen.XTypeSpec
 import androidx.room.compiler.codegen.XTypeSpec.Builder.Companion.apply
 import androidx.room.compiler.processing.XProcessingEnv
 import androidx.room.compiler.processing.writeTo
 import androidx.room.ext.S
-import com.squareup.kotlinpoet.javapoet.JClassName
+import androidx.room.solver.CodeGenScope
+import com.squareup.kotlinpoet.javapoet.JAnnotationSpec
+import com.squareup.kotlinpoet.javapoet.KAnnotationSpec
 import com.squareup.kotlinpoet.javapoet.toKClassName
 import kotlin.reflect.KClass
 
 /**
  * Base class for all writers that can produce a class.
  */
-abstract class TypeWriter(private val className: JClassName) {
+abstract class TypeWriter(val codeLanguage: CodeLanguage) {
+    // TODO(danysantiago): Migrate to XPoet
+    private val sharedFieldSpecs = mutableMapOf<String, com.squareup.javapoet.FieldSpec>()
+    private val sharedMethodSpecs = mutableMapOf<String, com.squareup.javapoet.MethodSpec>()
+    private val sharedFieldNames = mutableSetOf<String>()
+    private val sharedMethodNames = mutableSetOf<String>()
+
     private val metadata = mutableMapOf<KClass<*>, Any>()
 
     abstract fun createTypeSpecBuilder(): XTypeSpec.Builder
@@ -45,9 +54,9 @@
     }
 
     /**
-     * Add additional metadata to the ClassWriter that can be read back later.
+     * Add additional metadata to the TypeWriter that can be read back later.
      * This is useful for additional functionality where a sub code generator needs to bubble up
-     * information to the main ClassWriter without copying it in every intermediate step.
+     * information to the main TypeWriter without copying it in every intermediate step.
      *
      * @see get
      */
@@ -57,9 +66,15 @@
 
     fun write(processingEnv: XProcessingEnv) {
         val builder = createTypeSpecBuilder()
+        builder.apply(
+            javaTypeBuilder = {
+                sharedFieldSpecs.values.forEach { addField(it) }
+                sharedMethodSpecs.values.forEach { addMethod(it) }
+            },
+            kotlinTypeBuilder = { }
+        )
         addGeneratedAnnotationIfAvailable(builder, processingEnv)
         addSuppressWarnings(builder)
-
         builder.build().writeTo(processingEnv.filer)
     }
 
@@ -92,14 +107,14 @@
             adapterTypeSpecBuilder.apply(
                 javaTypeBuilder = {
                     addAnnotation(
-                        com.squareup.javapoet.AnnotationSpec.builder(it.className)
+                        JAnnotationSpec.builder(it.className)
                             .addMember("value", "$S", memberValue)
                             .build()
                     )
                 },
                 kotlinTypeBuilder = {
                     addAnnotation(
-                        com.squareup.kotlinpoet.AnnotationSpec.builder(it.className.toKClassName())
+                        KAnnotationSpec.builder(it.className.toKClassName())
                             .addMember("value = [%S]", memberValue)
                             .build()
                     )
@@ -107,4 +122,62 @@
             )
         }
     }
+
+    private fun makeUnique(set: MutableSet<String>, value: String): String {
+        if (!value.startsWith(CodeGenScope.CLASS_PROPERTY_PREFIX)) {
+            return makeUnique(set, "${CodeGenScope.CLASS_PROPERTY_PREFIX}$value")
+        }
+        if (set.add(value)) {
+            return value
+        }
+        var index = 1
+        while (true) {
+            if (set.add("${value}_$index")) {
+                return "${value}_$index"
+            }
+            index++
+        }
+    }
+
+    fun getOrCreateField(sharedField: SharedFieldSpec): com.squareup.javapoet.FieldSpec {
+        return sharedFieldSpecs.getOrPut(sharedField.getUniqueKey()) {
+            sharedField.build(this, makeUnique(sharedFieldNames, sharedField.baseName))
+        }
+    }
+
+    fun getOrCreateMethod(sharedMethod: SharedMethodSpec): com.squareup.javapoet.MethodSpec {
+        return sharedMethodSpecs.getOrPut(sharedMethod.getUniqueKey()) {
+            sharedMethod.build(this, makeUnique(sharedMethodNames, sharedMethod.baseName))
+        }
+    }
+
+    abstract class SharedFieldSpec(val baseName: String, val type: com.squareup.javapoet.TypeName) {
+
+        abstract fun getUniqueKey(): String
+
+        abstract fun prepare(writer: TypeWriter, builder: com.squareup.javapoet.FieldSpec.Builder)
+
+        fun build(classWriter: TypeWriter, name: String): com.squareup.javapoet.FieldSpec {
+            val builder = com.squareup.javapoet.FieldSpec.builder(type, name)
+            prepare(classWriter, builder)
+            return builder.build()
+        }
+    }
+
+    abstract class SharedMethodSpec(val baseName: String) {
+
+        abstract fun getUniqueKey(): String
+
+        abstract fun prepare(
+            methodName: String,
+            writer: TypeWriter,
+            builder: com.squareup.javapoet.MethodSpec.Builder
+        )
+
+        fun build(writer: TypeWriter, name: String): com.squareup.javapoet.MethodSpec {
+            val builder = com.squareup.javapoet.MethodSpec.methodBuilder(name)
+            prepare(name, writer, builder)
+            return builder.build()
+        }
+    }
 }
diff --git a/room/room-compiler/src/test/kotlin/androidx/room/processor/BaseDaoTest.kt b/room/room-compiler/src/test/kotlin/androidx/room/processor/BaseDaoTest.kt
index a87d4b5..50cacb8 100644
--- a/room/room-compiler/src/test/kotlin/androidx/room/processor/BaseDaoTest.kt
+++ b/room/room-compiler/src/test/kotlin/androidx/room/processor/BaseDaoTest.kt
@@ -1,6 +1,7 @@
 package androidx.room.processor
 
 import COMMON
+import androidx.room.compiler.codegen.CodeLanguage
 import androidx.room.compiler.processing.util.Source
 import androidx.room.compiler.processing.util.runProcessorTest
 import androidx.room.testing.context
@@ -218,7 +219,7 @@
                 val processed = DaoProcessor(
                     invocation.context, dao, dbType, null
                 ).process()
-                DaoWriter(processed, dbElm, invocation.processingEnv)
+                DaoWriter(processed, dbElm, CodeLanguage.JAVA)
                     .write(invocation.processingEnv)
             }
         }
@@ -269,7 +270,7 @@
                 invocation.context, daoElm, dbType, null
             ).process()
             handler(processedDao)
-            DaoWriter(processedDao, dbElm, invocation.processingEnv).write(invocation.processingEnv)
+            DaoWriter(processedDao, dbElm, CodeLanguage.JAVA).write(invocation.processingEnv)
         }
     }
 }
diff --git a/room/room-compiler/src/test/kotlin/androidx/room/solver/BasicColumnTypeAdaptersTest.kt b/room/room-compiler/src/test/kotlin/androidx/room/solver/BasicColumnTypeAdaptersTest.kt
index 6c2c5fc..939a336 100644
--- a/room/room-compiler/src/test/kotlin/androidx/room/solver/BasicColumnTypeAdaptersTest.kt
+++ b/room/room-compiler/src/test/kotlin/androidx/room/solver/BasicColumnTypeAdaptersTest.kt
@@ -124,7 +124,7 @@
                 bindCode
             }
             adapter.bindToStmt("st", "6", "inp", scope)
-            assertThat(scope.generate().toString().trim(), `is`(expected))
+            assertThat(scope.builder().build().toString().trim(), `is`(expected))
             generateCode(invocation, scope, type)
         }
     }
@@ -155,7 +155,7 @@
                 """.trimIndent()
             }
             assertThat(
-                scope.generate().toString().trim(),
+                scope.builder().build().toString().trim(),
                 `is`(
                     expected
                 )
@@ -180,7 +180,7 @@
                 )!!
             adapter.bindToStmt("st", "6", "inp", scope)
             assertThat(
-                scope.generate().toString().trim(),
+                scope.builder().build().toString().trim(),
                 `is`(
                     """
                     if (inp == null) {
@@ -241,7 +241,7 @@
                 cursorCode
             }
             adapter.readFromCursor("out", "crs", "9", scope)
-            assertThat(scope.generate().toString().trim(), `is`(expected))
+            assertThat(scope.builder().build().toString().trim(), `is`(expected))
             generateCode(invocation, scope, type)
         }
     }
@@ -272,7 +272,7 @@
                 """.trimIndent()
             }
             assertThat(
-                scope.generate().toString().trim(),
+                scope.builder().build().toString().trim(),
                 `is`(
                     expected
                 )
@@ -292,7 +292,7 @@
             ).findColumnTypeAdapter(nullableType, null, false)!!
             adapter.readFromCursor("out", "crs", "9", scope)
             assertThat(
-                scope.generate().toString().trim(),
+                scope.builder().build().toString().trim(),
                 `is`(
                     """
                     if (crs.isNull(9)) {
diff --git a/room/room-compiler/src/test/kotlin/androidx/room/solver/NullabilityAwareTypeConverterStoreTest.kt b/room/room-compiler/src/test/kotlin/androidx/room/solver/NullabilityAwareTypeConverterStoreTest.kt
index 3cc910d..598015b 100644
--- a/room/room-compiler/src/test/kotlin/androidx/room/solver/NullabilityAwareTypeConverterStoreTest.kt
+++ b/room/room-compiler/src/test/kotlin/androidx/room/solver/NullabilityAwareTypeConverterStoreTest.kt
@@ -17,6 +17,7 @@
 package androidx.room.solver
 
 import androidx.room.RoomKspProcessor
+import androidx.room.compiler.codegen.CodeLanguage
 import androidx.room.compiler.processing.XType
 import androidx.room.compiler.processing.util.Source
 import androidx.room.compiler.processing.util.XTestInvocation
@@ -33,12 +34,12 @@
 import androidx.room.vo.BuiltInConverterFlags
 import androidx.room.writer.DaoWriter
 import com.google.common.truth.Truth.assertThat
+import javax.tools.Diagnostic
 import org.junit.Rule
 import org.junit.Test
 import org.junit.rules.TemporaryFolder
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
-import javax.tools.Diagnostic
 
 @RunWith(JUnit4::class)
 class NullabilityAwareTypeConverterStoreTest {
@@ -401,7 +402,7 @@
                 dao = daoProcessor.process(),
                 dbElement = invocation.processingEnv
                     .requireTypeElement("androidx.room.RoomDatabase"),
-                processingEnv = invocation.processingEnv
+                codeLanguage = CodeLanguage.JAVA
             ).write(invocation.processingEnv)
             invocation.assertCompilationResult {
                 generatedSourceFileWithPath("MyDao_Impl.java").let {
diff --git a/room/room-compiler/src/test/kotlin/androidx/room/solver/TypeAdapterStoreTest.kt b/room/room-compiler/src/test/kotlin/androidx/room/solver/TypeAdapterStoreTest.kt
index 2fa5dbb..f70f865 100644
--- a/room/room-compiler/src/test/kotlin/androidx/room/solver/TypeAdapterStoreTest.kt
+++ b/room/room-compiler/src/test/kotlin/androidx/room/solver/TypeAdapterStoreTest.kt
@@ -74,8 +74,9 @@
 import com.google.common.truth.Truth.assertThat
 import com.squareup.javapoet.CodeBlock
 import com.squareup.javapoet.TypeName
-import org.hamcrest.CoreMatchers.`is`
+import java.util.UUID
 import org.hamcrest.CoreMatchers.instanceOf
+import org.hamcrest.CoreMatchers.`is`
 import org.hamcrest.CoreMatchers.notNullValue
 import org.hamcrest.CoreMatchers.nullValue
 import org.hamcrest.MatcherAssert.assertThat
@@ -83,13 +84,12 @@
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
 import testCodeGenScope
-import java.util.UUID
 
 @Suppress("PLATFORM_CLASS_MAPPED_TO_KOTLIN")
 @RunWith(JUnit4::class)
 class TypeAdapterStoreTest {
     companion object {
-        fun tmp(index: Int) = CodeGenScope._tmpVar(index)
+        fun tmp(index: Int) = CodeGenScope.getTmpVarString(index)
     }
 
     @Test
@@ -261,7 +261,7 @@
             val bindScope = testCodeGenScope()
             adapter!!.bindToStmt("stmt", "41", "fooVar", bindScope)
             assertThat(
-                bindScope.generate().toString().trim(),
+                bindScope.builder().build().toString().trim(),
                 `is`(
                     """
                     final int ${tmp(0)} = fooVar ? 1 : 0;
@@ -273,7 +273,7 @@
             val cursorScope = testCodeGenScope()
             adapter.readFromCursor("res", "curs", "7", cursorScope)
             assertThat(
-                cursorScope.generate().toString().trim(),
+                cursorScope.builder().build().toString().trim(),
                 `is`(
                     """
                     final int ${tmp(0)};
@@ -336,7 +336,7 @@
             val bindScope = testCodeGenScope()
             adapter!!.bindToStmt("stmt", "41", "fooVar", bindScope)
             assertThat(
-                bindScope.generate().toString().trim(),
+                bindScope.builder().build().toString().trim(),
                 `is`(
                     """
                     final boolean ${tmp(0)} = foo.bar.Point.toBoolean(fooVar);
@@ -349,7 +349,7 @@
             val cursorScope = testCodeGenScope()
             adapter.readFromCursor("res", "curs", "11", cursorScope).toString()
             assertThat(
-                cursorScope.generate().toString().trim(),
+                cursorScope.builder().build().toString().trim(),
                 `is`(
                     """
                     final int ${tmp(0)};
@@ -377,7 +377,7 @@
             val bindScope = testCodeGenScope()
             adapter!!.readFromCursor("outDate", "curs", "0", bindScope)
             assertThat(
-                bindScope.generate().toString().trim(),
+                bindScope.builder().build().toString().trim(),
                 `is`(
                     """
                 final java.lang.Long _tmp;
@@ -414,7 +414,7 @@
             val bindScope = testCodeGenScope()
             adapter!!.bindToStmt("stmt", "41", "fooVar", bindScope)
             assertThat(
-                bindScope.generate().toString().trim(),
+                bindScope.builder().build().toString().trim(),
                 `is`(
                     """
                 final java.lang.String ${tmp(0)} = androidx.room.util.StringUtil.joinIntoString(fooVar);
diff --git a/room/room-compiler/src/test/kotlin/androidx/room/solver/query/QueryWriterTest.kt b/room/room-compiler/src/test/kotlin/androidx/room/solver/query/QueryWriterTest.kt
index 40f4a86..c704fa4 100644
--- a/room/room-compiler/src/test/kotlin/androidx/room/solver/query/QueryWriterTest.kt
+++ b/room/room-compiler/src/test/kotlin/androidx/room/solver/query/QueryWriterTest.kt
@@ -18,9 +18,9 @@
 
 import androidx.room.Dao
 import androidx.room.Query
+import androidx.room.compiler.processing.XTypeElement
 import androidx.room.compiler.processing.util.Source
 import androidx.room.compiler.processing.util.runProcessorTest
-import androidx.room.compiler.processing.XTypeElement
 import androidx.room.ext.RoomTypeNames.ROOM_SQL_QUERY
 import androidx.room.ext.RoomTypeNames.STRING_UTIL
 import androidx.room.processor.QueryMethodProcessor
@@ -59,7 +59,7 @@
             val scope = testCodeGenScope()
             writer.prepareReadAndBind("_sql", "_stmt", scope)
             assertThat(
-                scope.generate().toString().trim(),
+                scope.builder().build().toString().trim(),
                 `is`(
                     """
                     final java.lang.String _sql = "SELECT id FROM users";
@@ -81,7 +81,7 @@
             val scope = testCodeGenScope()
             writer.prepareReadAndBind("_sql", "_stmt", scope)
             assertThat(
-                scope.generate().toString().trim(),
+                scope.builder().build().toString().trim(),
                 `is`(
                     """
                     final java.lang.String _sql = "SELECT id FROM users WHERE name LIKE ?";
@@ -109,7 +109,7 @@
             val scope = testCodeGenScope()
             writer.prepareReadAndBind("_sql", "_stmt", scope)
             assertThat(
-                scope.generate().toString().trim(),
+                scope.builder().build().toString().trim(),
                 `is`(
                     """
                     final java.lang.String _sql = "SELECT id FROM users WHERE id IN(?,?)";
@@ -135,7 +135,7 @@
             val scope = testCodeGenScope()
             writer.prepareReadAndBind("_sql", "_stmt", scope)
             assertThat(
-                scope.generate().toString().trim(),
+                scope.builder().build().toString().trim(),
                 `is`(
                     """
                     java.lang.StringBuilder _stringBuilder = $STRING_UTIL.newStringBuilder();
@@ -193,7 +193,7 @@
         ) { writer ->
             val scope = testCodeGenScope()
             writer.prepareReadAndBind("_sql", "_stmt", scope)
-            assertThat(scope.generate().toString().trim(), `is`(collectionOut))
+            assertThat(scope.builder().build().toString().trim(), `is`(collectionOut))
         }
     }
 
@@ -207,7 +207,7 @@
         ) { writer ->
             val scope = testCodeGenScope()
             writer.prepareReadAndBind("_sql", "_stmt", scope)
-            assertThat(scope.generate().toString().trim(), `is`(collectionOut))
+            assertThat(scope.builder().build().toString().trim(), `is`(collectionOut))
         }
     }
 
@@ -221,7 +221,7 @@
         ) { writer ->
             val scope = testCodeGenScope()
             writer.prepareReadAndBind("_sql", "_stmt", scope)
-            assertThat(scope.generate().toString().trim(), `is`(collectionOut))
+            assertThat(scope.builder().build().toString().trim(), `is`(collectionOut))
         }
     }
 
@@ -236,7 +236,7 @@
             val scope = testCodeGenScope()
             writer.prepareReadAndBind("_sql", "_stmt", scope)
             assertThat(
-                scope.generate().toString().trim(),
+                scope.builder().build().toString().trim(),
                 `is`(
                     """
                     final java.lang.String _sql = "SELECT id FROM users WHERE age > ? OR bage > ?";
@@ -262,7 +262,7 @@
             val scope = testCodeGenScope()
             writer.prepareReadAndBind("_sql", "_stmt", scope)
             assertThat(
-                scope.generate().toString().trim(),
+                scope.builder().build().toString().trim(),
                 `is`(
                     """
                     java.lang.StringBuilder _stringBuilder = $STRING_UTIL.newStringBuilder();
@@ -303,7 +303,7 @@
             val scope = testCodeGenScope()
             writer.prepareReadAndBind("_sql", "_stmt", scope)
             assertThat(
-                scope.generate().toString().trim(),
+                scope.builder().build().toString().trim(),
                 `is`(
                     """
                     java.lang.StringBuilder _stringBuilder = $STRING_UTIL.newStringBuilder();
diff --git a/room/room-compiler/src/test/kotlin/androidx/room/testing/test_util.kt b/room/room-compiler/src/test/kotlin/androidx/room/testing/test_util.kt
index 8fe1108..97b9376 100644
--- a/room/room-compiler/src/test/kotlin/androidx/room/testing/test_util.kt
+++ b/room/room-compiler/src/test/kotlin/androidx/room/testing/test_util.kt
@@ -16,6 +16,9 @@
 
 import androidx.room.DatabaseView
 import androidx.room.Entity
+import androidx.room.compiler.codegen.CodeLanguage
+import androidx.room.compiler.codegen.XClassName
+import androidx.room.compiler.codegen.XTypeSpec
 import androidx.room.compiler.processing.XElement
 import androidx.room.compiler.processing.XFieldElement
 import androidx.room.compiler.processing.XType
@@ -43,11 +46,11 @@
 import androidx.room.solver.CodeGenScope
 import androidx.room.testing.context
 import androidx.room.verifier.DatabaseVerifier
-import androidx.room.writer.ClassWriter
+import androidx.room.writer.TypeWriter
 import com.squareup.javapoet.ClassName
+import java.io.File
 import org.mockito.Mockito.doReturn
 import org.mockito.Mockito.mock
-import java.io.File
 
 object COMMON {
     val ARTIST by lazy {
@@ -314,7 +317,13 @@
 }
 
 fun testCodeGenScope(): CodeGenScope {
-    return CodeGenScope(mock(ClassWriter::class.java))
+    return CodeGenScope(
+        object : TypeWriter(CodeLanguage.JAVA) {
+            override fun createTypeSpecBuilder(): XTypeSpec.Builder {
+                return XTypeSpec.classBuilder(codeLanguage, XClassName.get("test", "Foo"))
+            }
+        }
+    )
 }
 
 fun loadJavaCode(fileName: String, qName: String): Source {
diff --git a/room/room-compiler/src/test/kotlin/androidx/room/writer/DaoWriterTest.kt b/room/room-compiler/src/test/kotlin/androidx/room/writer/DaoWriterTest.kt
index 26108ee..9b43506 100644
--- a/room/room-compiler/src/test/kotlin/androidx/room/writer/DaoWriterTest.kt
+++ b/room/room-compiler/src/test/kotlin/androidx/room/writer/DaoWriterTest.kt
@@ -17,6 +17,7 @@
 package androidx.room.writer
 
 import COMMON
+import androidx.room.compiler.codegen.CodeLanguage
 import androidx.room.compiler.processing.XTypeElement
 import androidx.room.compiler.processing.util.Source
 import androidx.room.compiler.processing.util.XTestInvocation
@@ -25,11 +26,11 @@
 import androidx.room.processor.DaoProcessor
 import androidx.room.testing.context
 import createVerifierFromEntitiesAndViews
+import java.util.Locale
 import loadTestSource
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
-import java.util.Locale
 
 @RunWith(JUnit4::class)
 class DaoWriterTest {
@@ -178,7 +179,7 @@
                     dbVerifier = dbVerifier
                 )
                 val parsedDao = parser.process()
-                DaoWriter(parsedDao, db, invocation.processingEnv)
+                DaoWriter(parsedDao, db, CodeLanguage.JAVA)
                     .write(invocation.processingEnv)
             }
             // we could call handler inside the if block but if something happens and we cannot
diff --git a/room/room-compiler/src/test/kotlin/androidx/room/writer/DefaultsInDaoTest.kt b/room/room-compiler/src/test/kotlin/androidx/room/writer/DefaultsInDaoTest.kt
index 6f5d816..ecbec9c 100644
--- a/room/room-compiler/src/test/kotlin/androidx/room/writer/DefaultsInDaoTest.kt
+++ b/room/room-compiler/src/test/kotlin/androidx/room/writer/DefaultsInDaoTest.kt
@@ -16,6 +16,9 @@
 
 package androidx.room.writer
 
+import COMMON
+import androidx.room.compiler.codegen.CodeLanguage
+import androidx.room.compiler.codegen.toJavaPoet
 import androidx.room.compiler.processing.XTypeElement
 import androidx.room.compiler.processing.util.Source
 import androidx.room.compiler.processing.util.runKaptTest
@@ -163,10 +166,11 @@
                         dbVerifier = createVerifierFromEntitiesAndViews(invocation)
                     )
                     val parsedDao = parser.process()
-                    DaoWriter(parsedDao, db, invocation.processingEnv)
+                    DaoWriter(parsedDao, db, CodeLanguage.JAVA)
                         .write(invocation.processingEnv)
                     invocation.assertCompilationResult {
-                        val relativePath = parsedDao.implTypeName.simpleName() + ".java"
+                        val relativePath =
+                            parsedDao.implTypeName.toJavaPoet().simpleName() + ".java"
                         handler(generatedSourceFileWithPath(relativePath))
                     }
                 }
diff --git a/room/room-compiler/src/test/kotlin/androidx/room/writer/EntityCursorConverterWriterTest.kt b/room/room-compiler/src/test/kotlin/androidx/room/writer/EntityCursorConverterWriterTest.kt
index 98dd3cb..b8076ef 100644
--- a/room/room-compiler/src/test/kotlin/androidx/room/writer/EntityCursorConverterWriterTest.kt
+++ b/room/room-compiler/src/test/kotlin/androidx/room/writer/EntityCursorConverterWriterTest.kt
@@ -16,15 +16,17 @@
 
 package androidx.room.writer
 
+import androidx.room.compiler.codegen.CodeLanguage
+import androidx.room.compiler.codegen.XClassName
+import androidx.room.compiler.codegen.XTypeSpec
+import androidx.room.compiler.codegen.XTypeSpec.Builder.Companion.apply
 import androidx.room.compiler.processing.util.Source
 import androidx.room.compiler.processing.util.XTestInvocation
 import androidx.room.processor.BaseEntityParserTest
-import com.squareup.javapoet.ClassName
-import com.squareup.javapoet.TypeSpec
+import javax.lang.model.element.Modifier
 import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.JUnit4
-import javax.lang.model.element.Modifier
 
 @RunWith(JUnit4::class)
 class EntityCursorConverterWriterTest : BaseEntityParserTest() {
@@ -113,13 +115,15 @@
         handler: (XTestInvocation) -> Unit
     ) {
         singleEntity(input, attributes) { entity, invocation ->
-            val className = ClassName.get("foo.bar", "MyContainerClass")
-            val writer = object : ClassWriter(className) {
-                override fun createTypeSpecBuilder(): TypeSpec.Builder {
+            val className = XClassName.get("foo.bar", "MyContainerClass")
+            val writer = object : TypeWriter(CodeLanguage.JAVA) {
+                override fun createTypeSpecBuilder(): XTypeSpec.Builder {
                     getOrCreateMethod(EntityCursorConverterWriter(entity))
-                    return TypeSpec.classBuilder(className).apply {
-                        addModifiers(Modifier.PUBLIC)
-                    }
+                    return XTypeSpec.classBuilder(codeLanguage, className)
+                        .apply(
+                            javaTypeBuilder = { addModifiers(Modifier.PUBLIC) },
+                            kotlinTypeBuilder = { }
+                        )
                 }
             }
             writer.write(invocation.processingEnv)
diff --git a/room/room-guava/api/2.5.0-beta01.txt b/room/room-guava/api/2.5.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/room/room-guava/api/2.5.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/room/room-guava/api/public_plus_experimental_2.5.0-beta01.txt b/room/room-guava/api/public_plus_experimental_2.5.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/room/room-guava/api/public_plus_experimental_2.5.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/room/room-guava/api/res-2.5.0-beta01.txt b/room/room-guava/api/res-2.5.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/room/room-guava/api/res-2.5.0-beta01.txt
diff --git a/room/room-guava/api/restricted_2.5.0-beta01.txt b/room/room-guava/api/restricted_2.5.0-beta01.txt
new file mode 100644
index 0000000..1c04602
--- /dev/null
+++ b/room/room-guava/api/restricted_2.5.0-beta01.txt
@@ -0,0 +1,14 @@
+// Signature format: 4.0
+package androidx.room.guava {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class GuavaRoom {
+    method @Deprecated public static <T> com.google.common.util.concurrent.ListenableFuture<T!>! createListenableFuture(java.util.concurrent.Callable<T!>!, androidx.room.RoomSQLiteQuery!, boolean);
+    method @Deprecated public static <T> com.google.common.util.concurrent.ListenableFuture<T!>! createListenableFuture(androidx.room.RoomDatabase!, java.util.concurrent.Callable<T!>!, androidx.room.RoomSQLiteQuery!, boolean);
+    method public static <T> com.google.common.util.concurrent.ListenableFuture<T!>! createListenableFuture(androidx.room.RoomDatabase!, boolean, java.util.concurrent.Callable<T!>!, androidx.room.RoomSQLiteQuery!, boolean);
+    method public static <T> com.google.common.util.concurrent.ListenableFuture<T!> createListenableFuture(androidx.room.RoomDatabase, boolean, java.util.concurrent.Callable<T!>, androidx.room.RoomSQLiteQuery, boolean, android.os.CancellationSignal?);
+    method @Deprecated public static <T> com.google.common.util.concurrent.ListenableFuture<T!> createListenableFuture(androidx.room.RoomDatabase, java.util.concurrent.Callable<T!>);
+    method public static <T> com.google.common.util.concurrent.ListenableFuture<T!> createListenableFuture(androidx.room.RoomDatabase, boolean, java.util.concurrent.Callable<T!>);
+  }
+
+}
+
diff --git a/room/room-ktx/api/2.5.0-beta01.txt b/room/room-ktx/api/2.5.0-beta01.txt
new file mode 100644
index 0000000..c9649d4
--- /dev/null
+++ b/room/room-ktx/api/2.5.0-beta01.txt
@@ -0,0 +1,20 @@
+// Signature format: 4.0
+package androidx.room {
+
+  public final class CoroutinesRoomKt {
+  }
+
+  public final class RoomDatabaseKt {
+    method public static suspend <R> Object? withTransaction(androidx.room.RoomDatabase, kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super R>,?> block, kotlin.coroutines.Continuation<? super R>);
+  }
+
+}
+
+package androidx.room.migration {
+
+  public final class MigrationKt {
+    method public static androidx.room.migration.Migration Migration(int startVersion, int endVersion, kotlin.jvm.functions.Function1<? super androidx.sqlite.db.SupportSQLiteDatabase,kotlin.Unit> migrate);
+  }
+
+}
+
diff --git a/room/room-ktx/api/public_plus_experimental_2.5.0-beta01.txt b/room/room-ktx/api/public_plus_experimental_2.5.0-beta01.txt
new file mode 100644
index 0000000..c9649d4
--- /dev/null
+++ b/room/room-ktx/api/public_plus_experimental_2.5.0-beta01.txt
@@ -0,0 +1,20 @@
+// Signature format: 4.0
+package androidx.room {
+
+  public final class CoroutinesRoomKt {
+  }
+
+  public final class RoomDatabaseKt {
+    method public static suspend <R> Object? withTransaction(androidx.room.RoomDatabase, kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super R>,?> block, kotlin.coroutines.Continuation<? super R>);
+  }
+
+}
+
+package androidx.room.migration {
+
+  public final class MigrationKt {
+    method public static androidx.room.migration.Migration Migration(int startVersion, int endVersion, kotlin.jvm.functions.Function1<? super androidx.sqlite.db.SupportSQLiteDatabase,kotlin.Unit> migrate);
+  }
+
+}
+
diff --git a/room/room-ktx/api/res-2.5.0-beta01.txt b/room/room-ktx/api/res-2.5.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/room/room-ktx/api/res-2.5.0-beta01.txt
diff --git a/room/room-ktx/api/restricted_2.5.0-beta01.txt b/room/room-ktx/api/restricted_2.5.0-beta01.txt
new file mode 100644
index 0000000..b4d63f6
--- /dev/null
+++ b/room/room-ktx/api/restricted_2.5.0-beta01.txt
@@ -0,0 +1,33 @@
+// Signature format: 4.0
+package androidx.room {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class CoroutinesRoom {
+    method public static <R> kotlinx.coroutines.flow.Flow<R> createFlow(androidx.room.RoomDatabase db, boolean inTransaction, String![] tableNames, java.util.concurrent.Callable<R> callable);
+    method public static suspend <R> Object? execute(androidx.room.RoomDatabase db, boolean inTransaction, java.util.concurrent.Callable<R> callable, kotlin.coroutines.Continuation<? super R>);
+    method public static suspend <R> Object? execute(androidx.room.RoomDatabase db, boolean inTransaction, android.os.CancellationSignal cancellationSignal, java.util.concurrent.Callable<R> callable, kotlin.coroutines.Continuation<? super R>);
+    field public static final androidx.room.CoroutinesRoom.Companion Companion;
+  }
+
+  public static final class CoroutinesRoom.Companion {
+    method public <R> kotlinx.coroutines.flow.Flow<R> createFlow(androidx.room.RoomDatabase db, boolean inTransaction, String![] tableNames, java.util.concurrent.Callable<R> callable);
+    method public suspend <R> Object? execute(androidx.room.RoomDatabase db, boolean inTransaction, java.util.concurrent.Callable<R> callable, kotlin.coroutines.Continuation<? super R>);
+    method public suspend <R> Object? execute(androidx.room.RoomDatabase db, boolean inTransaction, android.os.CancellationSignal cancellationSignal, java.util.concurrent.Callable<R> callable, kotlin.coroutines.Continuation<? super R>);
+  }
+
+  public final class CoroutinesRoomKt {
+  }
+
+  public final class RoomDatabaseKt {
+    method public static suspend <R> Object? withTransaction(androidx.room.RoomDatabase, kotlin.jvm.functions.Function1<? super kotlin.coroutines.Continuation<? super R>,?> block, kotlin.coroutines.Continuation<? super R>);
+  }
+
+}
+
+package androidx.room.migration {
+
+  public final class MigrationKt {
+    method public static androidx.room.migration.Migration Migration(int startVersion, int endVersion, kotlin.jvm.functions.Function1<? super androidx.sqlite.db.SupportSQLiteDatabase,kotlin.Unit> migrate);
+  }
+
+}
+
diff --git a/room/room-migration/api/2.5.0-beta01.txt b/room/room-migration/api/2.5.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/room/room-migration/api/2.5.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/room/room-migration/api/public_plus_experimental_2.5.0-beta01.txt b/room/room-migration/api/public_plus_experimental_2.5.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/room/room-migration/api/public_plus_experimental_2.5.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/room/room-migration/api/restricted_2.5.0-beta01.txt b/room/room-migration/api/restricted_2.5.0-beta01.txt
new file mode 100644
index 0000000..8d5b5f4
--- /dev/null
+++ b/room/room-migration/api/restricted_2.5.0-beta01.txt
@@ -0,0 +1,192 @@
+// Signature format: 4.0
+package androidx.room.migration.bundle {
+
+  @RestrictTo({androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX}) public final class BundleUtil {
+    method public static String replaceTableName(String contents, String tableName);
+    method public static String replaceViewName(String contents, String viewName);
+    field public static final String TABLE_NAME_PLACEHOLDER = "${TABLE_NAME}";
+    field public static final String VIEW_NAME_PLACEHOLDER = "${VIEW_NAME}";
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class DatabaseBundle implements androidx.room.migration.bundle.SchemaEquality<androidx.room.migration.bundle.DatabaseBundle> {
+    ctor public DatabaseBundle(int version, String identityHash, java.util.List<? extends androidx.room.migration.bundle.EntityBundle> entities, java.util.List<? extends androidx.room.migration.bundle.DatabaseViewBundle> views, java.util.List<java.lang.String> setupQueries);
+    ctor @Deprecated public DatabaseBundle();
+    method public java.util.List<java.lang.String> buildCreateQueries();
+    method public java.util.List<androidx.room.migration.bundle.EntityBundle> getEntities();
+    method public java.util.Map<java.lang.String,androidx.room.migration.bundle.EntityBundle> getEntitiesByTableName();
+    method public String getIdentityHash();
+    method public int getVersion();
+    method public java.util.List<androidx.room.migration.bundle.DatabaseViewBundle> getViews();
+    method public final java.util.Map<java.lang.String,androidx.room.migration.bundle.DatabaseViewBundle> getViewsByName();
+    method public boolean isSchemaEqual(androidx.room.migration.bundle.DatabaseBundle other);
+    property public java.util.List<androidx.room.migration.bundle.EntityBundle> entities;
+    property public java.util.Map<java.lang.String,androidx.room.migration.bundle.EntityBundle> entitiesByTableName;
+    property public String identityHash;
+    property public int version;
+    property public java.util.List<androidx.room.migration.bundle.DatabaseViewBundle> views;
+    property public final java.util.Map<java.lang.String,androidx.room.migration.bundle.DatabaseViewBundle> viewsByName;
+  }
+
+  public static final class DatabaseBundle.FtsEntityCreateComparator implements java.util.Comparator<androidx.room.migration.bundle.EntityBundle> {
+    ctor public DatabaseBundle.FtsEntityCreateComparator();
+    method public int compare(androidx.room.migration.bundle.EntityBundle firstEntity, androidx.room.migration.bundle.EntityBundle secondEntity);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class DatabaseViewBundle implements androidx.room.migration.bundle.SchemaEquality<androidx.room.migration.bundle.DatabaseViewBundle> {
+    ctor public DatabaseViewBundle(@com.google.gson.annotations.SerializedName("viewName") String viewName, @com.google.gson.annotations.SerializedName("createSql") String createSql);
+    method public String createView();
+    method public String getCreateSql();
+    method public String getViewName();
+    method public boolean isSchemaEqual(androidx.room.migration.bundle.DatabaseViewBundle other);
+    property public String createSql;
+    property public String viewName;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class EntityBundle implements androidx.room.migration.bundle.SchemaEquality<androidx.room.migration.bundle.EntityBundle> {
+    ctor public EntityBundle(@com.google.gson.annotations.SerializedName("tableName") String tableName, @com.google.gson.annotations.SerializedName("createSql") String createSql, @com.google.gson.annotations.SerializedName("fields") java.util.List<? extends androidx.room.migration.bundle.FieldBundle> fields, @com.google.gson.annotations.SerializedName("primaryKey") androidx.room.migration.bundle.PrimaryKeyBundle primaryKey, @com.google.gson.annotations.SerializedName("indices") java.util.List<? extends androidx.room.migration.bundle.IndexBundle> indices, @com.google.gson.annotations.SerializedName("foreignKeys") java.util.List<? extends androidx.room.migration.bundle.ForeignKeyBundle> foreignKeys);
+    method public java.util.Collection<java.lang.String> buildCreateQueries();
+    method public String createNewTable();
+    method public String createTable();
+    method public String getCreateSql();
+    method public java.util.List<androidx.room.migration.bundle.FieldBundle> getFields();
+    method public java.util.Map<java.lang.String,androidx.room.migration.bundle.FieldBundle> getFieldsByColumnName();
+    method public java.util.List<androidx.room.migration.bundle.ForeignKeyBundle> getForeignKeys();
+    method public java.util.List<androidx.room.migration.bundle.IndexBundle> getIndices();
+    method public String getNewTableName();
+    method public androidx.room.migration.bundle.PrimaryKeyBundle getPrimaryKey();
+    method public String getTableName();
+    method public boolean isSchemaEqual(androidx.room.migration.bundle.EntityBundle other);
+    method public String renameToOriginal();
+    property public String createSql;
+    property public java.util.List<androidx.room.migration.bundle.FieldBundle> fields;
+    property public java.util.Map<java.lang.String,androidx.room.migration.bundle.FieldBundle> fieldsByColumnName;
+    property public java.util.List<androidx.room.migration.bundle.ForeignKeyBundle> foreignKeys;
+    property public java.util.List<androidx.room.migration.bundle.IndexBundle> indices;
+    property public String newTableName;
+    property public androidx.room.migration.bundle.PrimaryKeyBundle primaryKey;
+    property public String tableName;
+    field public static final androidx.room.migration.bundle.EntityBundle.Companion Companion;
+    field public static final String NEW_TABLE_PREFIX = "_new_";
+  }
+
+  public static final class EntityBundle.Companion {
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class FieldBundle implements androidx.room.migration.bundle.SchemaEquality<androidx.room.migration.bundle.FieldBundle> {
+    ctor public FieldBundle(@com.google.gson.annotations.SerializedName("fieldPath") String fieldPath, @com.google.gson.annotations.SerializedName("columnName") String columnName, @com.google.gson.annotations.SerializedName("affinity") String affinity, @com.google.gson.annotations.SerializedName("notNull") boolean isNonNull, @com.google.gson.annotations.SerializedName("defaultValue") String? defaultValue);
+    ctor @Deprecated public FieldBundle(String fieldPath, String columnName, String affinity, boolean nonNull);
+    method public String getAffinity();
+    method public String getColumnName();
+    method public String? getDefaultValue();
+    method public String getFieldPath();
+    method public boolean isNonNull();
+    method public boolean isSchemaEqual(androidx.room.migration.bundle.FieldBundle other);
+    property public String affinity;
+    property public String columnName;
+    property public String? defaultValue;
+    property public String fieldPath;
+    property public boolean isNonNull;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class ForeignKeyBundle implements androidx.room.migration.bundle.SchemaEquality<androidx.room.migration.bundle.ForeignKeyBundle> {
+    ctor public ForeignKeyBundle(String table, String onDelete, String onUpdate, java.util.List<java.lang.String> columns, java.util.List<java.lang.String> referencedColumns);
+    method public java.util.List<java.lang.String> getColumns();
+    method public String getOnDelete();
+    method public String getOnUpdate();
+    method public java.util.List<java.lang.String> getReferencedColumns();
+    method public String getTable();
+    method public boolean isSchemaEqual(androidx.room.migration.bundle.ForeignKeyBundle other);
+    property public java.util.List<java.lang.String> columns;
+    property public String onDelete;
+    property public String onUpdate;
+    property public java.util.List<java.lang.String> referencedColumns;
+    property public String table;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class FtsEntityBundle extends androidx.room.migration.bundle.EntityBundle {
+    ctor public FtsEntityBundle(String tableName, String createSql, java.util.List<? extends androidx.room.migration.bundle.FieldBundle> fields, androidx.room.migration.bundle.PrimaryKeyBundle primaryKey, String ftsVersion, androidx.room.migration.bundle.FtsOptionsBundle ftsOptions, @com.google.gson.annotations.SerializedName("contentSyncTriggers") java.util.List<java.lang.String> contentSyncSqlTriggers);
+    method public java.util.List<java.lang.String> getContentSyncSqlTriggers();
+    method public androidx.room.migration.bundle.FtsOptionsBundle getFtsOptions();
+    method public String getFtsVersion();
+    method public java.util.List<java.lang.String> getShadowTableNames();
+    property public java.util.List<java.lang.String> contentSyncSqlTriggers;
+    property public androidx.room.migration.bundle.FtsOptionsBundle ftsOptions;
+    property public String ftsVersion;
+    property public java.util.List<java.lang.String> shadowTableNames;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class FtsOptionsBundle implements androidx.room.migration.bundle.SchemaEquality<androidx.room.migration.bundle.FtsOptionsBundle> {
+    ctor public FtsOptionsBundle(@com.google.gson.annotations.SerializedName("tokenizer") String tokenizer, @com.google.gson.annotations.SerializedName("tokenizerArgs") java.util.List<java.lang.String> tokenizerArgs, @com.google.gson.annotations.SerializedName("contentTable") String contentTable, @com.google.gson.annotations.SerializedName("languageIdColumnName") String languageIdColumnName, @com.google.gson.annotations.SerializedName("matchInfo") String matchInfo, @com.google.gson.annotations.SerializedName("notIndexedColumns") java.util.List<java.lang.String> notIndexedColumns, @com.google.gson.annotations.SerializedName("prefixSizes") java.util.List<java.lang.Integer> prefixSizes, @com.google.gson.annotations.SerializedName("preferredOrder") String preferredOrder);
+    method public String getContentTable();
+    method public String getLanguageIdColumnName();
+    method public String getMatchInfo();
+    method public java.util.List<java.lang.String> getNotIndexedColumns();
+    method public String getPreferredOrder();
+    method public java.util.List<java.lang.Integer> getPrefixSizes();
+    method public java.util.List<java.lang.String> getTokenizerArgs();
+    method public boolean isSchemaEqual(androidx.room.migration.bundle.FtsOptionsBundle other);
+    property public String contentTable;
+    property public String languageIdColumnName;
+    property public String matchInfo;
+    property public java.util.List<java.lang.String> notIndexedColumns;
+    property public String preferredOrder;
+    property public java.util.List<java.lang.Integer> prefixSizes;
+    property public java.util.List<java.lang.String> tokenizerArgs;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class IndexBundle implements androidx.room.migration.bundle.SchemaEquality<androidx.room.migration.bundle.IndexBundle> {
+    ctor public IndexBundle(@com.google.gson.annotations.SerializedName("name") String name, @com.google.gson.annotations.SerializedName("unique") boolean isUnique, @com.google.gson.annotations.SerializedName("columnNames") java.util.List<java.lang.String>? columnNames, @com.google.gson.annotations.SerializedName("orders") java.util.List<java.lang.String>? orders, @com.google.gson.annotations.SerializedName("createSql") String createSql);
+    ctor @Deprecated public IndexBundle(String name, boolean unique, java.util.List<java.lang.String> columnNames, String createSql);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public String create(String tableName);
+    method public java.util.List<java.lang.String>? getColumnNames();
+    method public String getCreateSql(String tableName);
+    method public String getCreateSql();
+    method public String getName();
+    method public java.util.List<java.lang.String>? getOrders();
+    method public boolean isSchemaEqual(androidx.room.migration.bundle.IndexBundle other);
+    method public boolean isUnique();
+    property public java.util.List<java.lang.String>? columnNames;
+    property public String createSql;
+    property public boolean isUnique;
+    property public String name;
+    property public java.util.List<java.lang.String>? orders;
+    field public static final androidx.room.migration.bundle.IndexBundle.Companion Companion;
+    field public static final String DEFAULT_PREFIX = "index_";
+  }
+
+  public static final class IndexBundle.Companion {
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class PrimaryKeyBundle implements androidx.room.migration.bundle.SchemaEquality<androidx.room.migration.bundle.PrimaryKeyBundle> {
+    ctor public PrimaryKeyBundle(@com.google.gson.annotations.SerializedName("autoGenerate") boolean isAutoGenerate, @com.google.gson.annotations.SerializedName("columnNames") java.util.List<java.lang.String> columnNames);
+    method public java.util.List<java.lang.String> getColumnNames();
+    method public boolean isAutoGenerate();
+    method public boolean isSchemaEqual(androidx.room.migration.bundle.PrimaryKeyBundle other);
+    property public java.util.List<java.lang.String> columnNames;
+    property public boolean isAutoGenerate;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class SchemaBundle implements androidx.room.migration.bundle.SchemaEquality<androidx.room.migration.bundle.SchemaBundle> {
+    ctor public SchemaBundle(@com.google.gson.annotations.SerializedName("formatVersion") int formatVersion, @com.google.gson.annotations.SerializedName("database") androidx.room.migration.bundle.DatabaseBundle database);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @kotlin.jvm.Throws(exceptionClasses=UnsupportedEncodingException::class) public static final androidx.room.migration.bundle.SchemaBundle deserialize(java.io.InputStream fis) throws java.io.UnsupportedEncodingException;
+    method public androidx.room.migration.bundle.DatabaseBundle getDatabase();
+    method public int getFormatVersion();
+    method public boolean isSchemaEqual(androidx.room.migration.bundle.SchemaBundle other);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @kotlin.jvm.Throws(exceptionClasses=IOException::class) public static final void serialize(androidx.room.migration.bundle.SchemaBundle bundle, java.io.File file) throws java.io.IOException;
+    property public androidx.room.migration.bundle.DatabaseBundle database;
+    property public int formatVersion;
+    field public static final androidx.room.migration.bundle.SchemaBundle.Companion Companion;
+    field public static final int LATEST_FORMAT = 1; // 0x1
+  }
+
+  public static final class SchemaBundle.Companion {
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @kotlin.jvm.Throws(exceptionClasses=UnsupportedEncodingException::class) public androidx.room.migration.bundle.SchemaBundle deserialize(java.io.InputStream fis) throws java.io.UnsupportedEncodingException;
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @kotlin.jvm.Throws(exceptionClasses=IOException::class) public void serialize(androidx.room.migration.bundle.SchemaBundle bundle, java.io.File file) throws java.io.IOException;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public interface SchemaEquality<T> {
+    method public boolean isSchemaEqual(T? other);
+  }
+
+}
+
diff --git a/room/room-migration/src/main/java/androidx/room/migration/bundle/FtsEntityBundle.kt b/room/room-migration/src/main/java/androidx/room/migration/bundle/FtsEntityBundle.kt
index b5e8ed9..ec1c6ed 100644
--- a/room/room-migration/src/main/java/androidx/room/migration/bundle/FtsEntityBundle.kt
+++ b/room/room-migration/src/main/java/androidx/room/migration/bundle/FtsEntityBundle.kt
@@ -60,6 +60,7 @@
         emptyList()
     )
 
+    @Transient
     private val SHADOW_TABLE_NAME_SUFFIXES = listOf(
         "_content",
         "_segdir",
@@ -92,6 +93,7 @@
      * Gets the list of shadow table names corresponding to the FTS virtual table.
      * @return the list of names.
      */
+    @delegate:Transient
     public open val shadowTableNames: List<String> by lazy {
         val currentTable = this@FtsEntityBundle.tableName
         buildList {
diff --git a/room/room-paging-guava/api/2.5.0-beta01.txt b/room/room-paging-guava/api/2.5.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/room/room-paging-guava/api/2.5.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/room/room-paging-guava/api/public_plus_experimental_2.5.0-beta01.txt b/room/room-paging-guava/api/public_plus_experimental_2.5.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/room/room-paging-guava/api/public_plus_experimental_2.5.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/room/room-paging-guava/api/res-2.5.0-beta01.txt b/room/room-paging-guava/api/res-2.5.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/room/room-paging-guava/api/res-2.5.0-beta01.txt
diff --git a/room/room-paging-guava/api/restricted_2.5.0-beta01.txt b/room/room-paging-guava/api/restricted_2.5.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/room/room-paging-guava/api/restricted_2.5.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/room/room-paging-rxjava2/api/2.5.0-beta01.txt b/room/room-paging-rxjava2/api/2.5.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/room/room-paging-rxjava2/api/2.5.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/room/room-paging-rxjava2/api/public_plus_experimental_2.5.0-beta01.txt b/room/room-paging-rxjava2/api/public_plus_experimental_2.5.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/room/room-paging-rxjava2/api/public_plus_experimental_2.5.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/room/room-paging-rxjava2/api/res-2.5.0-beta01.txt b/room/room-paging-rxjava2/api/res-2.5.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/room/room-paging-rxjava2/api/res-2.5.0-beta01.txt
diff --git a/room/room-paging-rxjava2/api/restricted_2.5.0-beta01.txt b/room/room-paging-rxjava2/api/restricted_2.5.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/room/room-paging-rxjava2/api/restricted_2.5.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/room/room-paging-rxjava3/api/2.5.0-beta01.txt b/room/room-paging-rxjava3/api/2.5.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/room/room-paging-rxjava3/api/2.5.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/room/room-paging-rxjava3/api/public_plus_experimental_2.5.0-beta01.txt b/room/room-paging-rxjava3/api/public_plus_experimental_2.5.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/room/room-paging-rxjava3/api/public_plus_experimental_2.5.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/room/room-paging-rxjava3/api/res-2.5.0-beta01.txt b/room/room-paging-rxjava3/api/res-2.5.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/room/room-paging-rxjava3/api/res-2.5.0-beta01.txt
diff --git a/room/room-paging-rxjava3/api/restricted_2.5.0-beta01.txt b/room/room-paging-rxjava3/api/restricted_2.5.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/room/room-paging-rxjava3/api/restricted_2.5.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/room/room-paging/api/2.5.0-beta01.txt b/room/room-paging/api/2.5.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/room/room-paging/api/2.5.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/room/room-paging/api/public_plus_experimental_2.5.0-beta01.txt b/room/room-paging/api/public_plus_experimental_2.5.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/room/room-paging/api/public_plus_experimental_2.5.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/room/room-paging/api/res-2.5.0-beta01.txt b/room/room-paging/api/res-2.5.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/room/room-paging/api/res-2.5.0-beta01.txt
diff --git a/room/room-paging/api/restricted_2.5.0-beta01.txt b/room/room-paging/api/restricted_2.5.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/room/room-paging/api/restricted_2.5.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/room/room-runtime/api/2.5.0-beta01.txt b/room/room-runtime/api/2.5.0-beta01.txt
new file mode 100644
index 0000000..f72bcc8
--- /dev/null
+++ b/room/room-runtime/api/2.5.0-beta01.txt
@@ -0,0 +1,169 @@
+// Signature format: 4.0
+package androidx.room {
+
+  public class DatabaseConfiguration {
+    method public boolean isMigrationRequired(int fromVersion, int toVersion);
+    method @Deprecated public boolean isMigrationRequiredFrom(int version);
+    field public final boolean allowDestructiveMigrationOnDowngrade;
+    field public final boolean allowMainThreadQueries;
+    field public final java.util.List<androidx.room.migration.AutoMigrationSpec> autoMigrationSpecs;
+    field public final java.util.List<androidx.room.RoomDatabase.Callback>? callbacks;
+    field public final android.content.Context context;
+    field public final String? copyFromAssetPath;
+    field public final java.io.File? copyFromFile;
+    field public final java.util.concurrent.Callable<java.io.InputStream>? copyFromInputStream;
+    field public final androidx.room.RoomDatabase.JournalMode journalMode;
+    field public final androidx.room.RoomDatabase.MigrationContainer migrationContainer;
+    field public final boolean multiInstanceInvalidation;
+    field public final String? name;
+    field public final androidx.room.RoomDatabase.PrepackagedDatabaseCallback? prepackagedDatabaseCallback;
+    field public final java.util.concurrent.Executor queryExecutor;
+    field public final boolean requireMigration;
+    field public final androidx.sqlite.db.SupportSQLiteOpenHelper.Factory sqliteOpenHelperFactory;
+    field public final java.util.concurrent.Executor transactionExecutor;
+    field public final java.util.List<java.lang.Object> typeConverters;
+  }
+
+  public final class EntityUpsertionAdapterKt {
+  }
+
+  public class InvalidationTracker {
+    method @WorkerThread public void addObserver(androidx.room.InvalidationTracker.Observer observer);
+    method public void refreshVersionsAsync();
+    method @WorkerThread public void removeObserver(androidx.room.InvalidationTracker.Observer observer);
+    field public static final androidx.room.InvalidationTracker.Companion Companion;
+  }
+
+  public static final class InvalidationTracker.Companion {
+  }
+
+  public abstract static class InvalidationTracker.Observer {
+    ctor public InvalidationTracker.Observer(String![] tables);
+    ctor protected InvalidationTracker.Observer(String firstTable, java.lang.String... rest);
+    method public abstract void onInvalidated(java.util.Set<java.lang.String> tables);
+  }
+
+  public final class Room {
+    method public static <T extends androidx.room.RoomDatabase> androidx.room.RoomDatabase.Builder<T> databaseBuilder(android.content.Context context, Class<T> klass, String? name);
+    method public static <T extends androidx.room.RoomDatabase> androidx.room.RoomDatabase.Builder<T> inMemoryDatabaseBuilder(android.content.Context context, Class<T> klass);
+    field public static final androidx.room.Room INSTANCE;
+    field public static final String MASTER_TABLE_NAME = "room_master_table";
+  }
+
+  public abstract class RoomDatabase {
+    ctor public RoomDatabase();
+    method @Deprecated public void beginTransaction();
+    method @WorkerThread public abstract void clearAllTables();
+    method public void close();
+    method public androidx.sqlite.db.SupportSQLiteStatement compileStatement(String sql);
+    method protected abstract androidx.room.InvalidationTracker createInvalidationTracker();
+    method protected abstract androidx.sqlite.db.SupportSQLiteOpenHelper createOpenHelper(androidx.room.DatabaseConfiguration config);
+    method @Deprecated public void endTransaction();
+    method public androidx.room.InvalidationTracker getInvalidationTracker();
+    method public androidx.sqlite.db.SupportSQLiteOpenHelper getOpenHelper();
+    method public java.util.concurrent.Executor getQueryExecutor();
+    method public java.util.concurrent.Executor getTransactionExecutor();
+    method public <T> T? getTypeConverter(Class<T> klass);
+    method public boolean inTransaction();
+    method @CallSuper public void init(androidx.room.DatabaseConfiguration configuration);
+    method protected void internalInitInvalidationTracker(androidx.sqlite.db.SupportSQLiteDatabase db);
+    method public boolean isOpen();
+    method public android.database.Cursor query(String query, Object![]? args);
+    method public android.database.Cursor query(androidx.sqlite.db.SupportSQLiteQuery query, optional android.os.CancellationSignal? signal);
+    method public android.database.Cursor query(androidx.sqlite.db.SupportSQLiteQuery query);
+    method public void runInTransaction(Runnable body);
+    method public <V> V! runInTransaction(java.util.concurrent.Callable<V> body);
+    method @Deprecated public void setTransactionSuccessful();
+    property public androidx.room.InvalidationTracker invalidationTracker;
+    property public boolean isOpen;
+    property public androidx.sqlite.db.SupportSQLiteOpenHelper openHelper;
+    property public java.util.concurrent.Executor queryExecutor;
+    property public java.util.concurrent.Executor transactionExecutor;
+    field public static final androidx.room.RoomDatabase.Companion Companion;
+    field @Deprecated @kotlin.jvm.Volatile protected volatile androidx.sqlite.db.SupportSQLiteDatabase? mDatabase;
+  }
+
+  public static class RoomDatabase.Builder<T extends androidx.room.RoomDatabase> {
+    method public androidx.room.RoomDatabase.Builder<T> addAutoMigrationSpec(androidx.room.migration.AutoMigrationSpec autoMigrationSpec);
+    method public androidx.room.RoomDatabase.Builder<T> addCallback(androidx.room.RoomDatabase.Callback callback);
+    method public androidx.room.RoomDatabase.Builder<T> addMigrations(androidx.room.migration.Migration... migrations);
+    method public androidx.room.RoomDatabase.Builder<T> addTypeConverter(Object typeConverter);
+    method public androidx.room.RoomDatabase.Builder<T> allowMainThreadQueries();
+    method public T build();
+    method public androidx.room.RoomDatabase.Builder<T> createFromAsset(String databaseFilePath);
+    method public androidx.room.RoomDatabase.Builder<T> createFromAsset(String databaseFilePath, androidx.room.RoomDatabase.PrepackagedDatabaseCallback callback);
+    method public androidx.room.RoomDatabase.Builder<T> createFromFile(java.io.File databaseFile);
+    method public androidx.room.RoomDatabase.Builder<T> createFromFile(java.io.File databaseFile, androidx.room.RoomDatabase.PrepackagedDatabaseCallback callback);
+    method public androidx.room.RoomDatabase.Builder<T> createFromInputStream(java.util.concurrent.Callable<java.io.InputStream> inputStreamCallable);
+    method public androidx.room.RoomDatabase.Builder<T> createFromInputStream(java.util.concurrent.Callable<java.io.InputStream> inputStreamCallable, androidx.room.RoomDatabase.PrepackagedDatabaseCallback callback);
+    method public androidx.room.RoomDatabase.Builder<T> enableMultiInstanceInvalidation();
+    method public androidx.room.RoomDatabase.Builder<T> fallbackToDestructiveMigration();
+    method public androidx.room.RoomDatabase.Builder<T> fallbackToDestructiveMigrationFrom(int... startVersions);
+    method public androidx.room.RoomDatabase.Builder<T> fallbackToDestructiveMigrationOnDowngrade();
+    method public androidx.room.RoomDatabase.Builder<T> openHelperFactory(androidx.sqlite.db.SupportSQLiteOpenHelper.Factory? factory);
+    method public androidx.room.RoomDatabase.Builder<T> setJournalMode(androidx.room.RoomDatabase.JournalMode journalMode);
+    method public androidx.room.RoomDatabase.Builder<T> setQueryCallback(androidx.room.RoomDatabase.QueryCallback queryCallback, java.util.concurrent.Executor executor);
+    method public androidx.room.RoomDatabase.Builder<T> setQueryExecutor(java.util.concurrent.Executor executor);
+    method public androidx.room.RoomDatabase.Builder<T> setTransactionExecutor(java.util.concurrent.Executor executor);
+  }
+
+  public abstract static class RoomDatabase.Callback {
+    ctor public RoomDatabase.Callback();
+    method public void onCreate(androidx.sqlite.db.SupportSQLiteDatabase db);
+    method public void onDestructiveMigration(androidx.sqlite.db.SupportSQLiteDatabase db);
+    method public void onOpen(androidx.sqlite.db.SupportSQLiteDatabase db);
+  }
+
+  public static final class RoomDatabase.Companion {
+  }
+
+  public enum RoomDatabase.JournalMode {
+    method public static androidx.room.RoomDatabase.JournalMode valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.room.RoomDatabase.JournalMode[] values();
+    enum_constant public static final androidx.room.RoomDatabase.JournalMode AUTOMATIC;
+    enum_constant public static final androidx.room.RoomDatabase.JournalMode TRUNCATE;
+    enum_constant public static final androidx.room.RoomDatabase.JournalMode WRITE_AHEAD_LOGGING;
+  }
+
+  public static class RoomDatabase.MigrationContainer {
+    ctor public RoomDatabase.MigrationContainer();
+    method public void addMigrations(androidx.room.migration.Migration... migrations);
+    method public void addMigrations(java.util.List<? extends androidx.room.migration.Migration> migrations);
+    method public final boolean contains(int startVersion, int endVersion);
+    method public java.util.List<androidx.room.migration.Migration>? findMigrationPath(int start, int end);
+    method public java.util.Map<java.lang.Integer,java.util.Map<java.lang.Integer,androidx.room.migration.Migration>> getMigrations();
+  }
+
+  public abstract static class RoomDatabase.PrepackagedDatabaseCallback {
+    ctor public RoomDatabase.PrepackagedDatabaseCallback();
+    method public void onOpenPrepackagedDatabase(androidx.sqlite.db.SupportSQLiteDatabase db);
+  }
+
+  public static interface RoomDatabase.QueryCallback {
+    method public void onQuery(String sqlQuery, java.util.List<?> bindArgs);
+  }
+
+}
+
+package androidx.room.migration {
+
+  public interface AutoMigrationSpec {
+    method public default void onPostMigrate(androidx.sqlite.db.SupportSQLiteDatabase);
+  }
+
+  public abstract class Migration {
+    ctor public Migration(int, int);
+    method public abstract void migrate(androidx.sqlite.db.SupportSQLiteDatabase);
+    field public final int endVersion;
+    field public final int startVersion;
+  }
+
+}
+
+package androidx.room.util {
+
+  public final class TableInfoKt {
+  }
+
+}
+
diff --git a/room/room-runtime/api/public_plus_experimental_2.5.0-beta01.txt b/room/room-runtime/api/public_plus_experimental_2.5.0-beta01.txt
new file mode 100644
index 0000000..b9bfe81
--- /dev/null
+++ b/room/room-runtime/api/public_plus_experimental_2.5.0-beta01.txt
@@ -0,0 +1,179 @@
+// Signature format: 4.0
+package androidx.room {
+
+  public class DatabaseConfiguration {
+    method public boolean isMigrationRequired(int fromVersion, int toVersion);
+    method @Deprecated public boolean isMigrationRequiredFrom(int version);
+    field public final boolean allowDestructiveMigrationOnDowngrade;
+    field public final boolean allowMainThreadQueries;
+    field public final java.util.List<androidx.room.migration.AutoMigrationSpec> autoMigrationSpecs;
+    field public final java.util.List<androidx.room.RoomDatabase.Callback>? callbacks;
+    field public final android.content.Context context;
+    field public final String? copyFromAssetPath;
+    field public final java.io.File? copyFromFile;
+    field public final java.util.concurrent.Callable<java.io.InputStream>? copyFromInputStream;
+    field public final androidx.room.RoomDatabase.JournalMode journalMode;
+    field public final androidx.room.RoomDatabase.MigrationContainer migrationContainer;
+    field public final boolean multiInstanceInvalidation;
+    field public final String? name;
+    field public final androidx.room.RoomDatabase.PrepackagedDatabaseCallback? prepackagedDatabaseCallback;
+    field public final java.util.concurrent.Executor queryExecutor;
+    field public final boolean requireMigration;
+    field public final androidx.sqlite.db.SupportSQLiteOpenHelper.Factory sqliteOpenHelperFactory;
+    field public final java.util.concurrent.Executor transactionExecutor;
+    field public final java.util.List<java.lang.Object> typeConverters;
+  }
+
+  public final class EntityUpsertionAdapterKt {
+  }
+
+  @RequiresOptIn @kotlin.annotation.Target(allowedTargets={kotlin.annotation.AnnotationTarget.CLASS, kotlin.annotation.AnnotationTarget.FUNCTION}) public @interface ExperimentalRoomApi {
+  }
+
+  public class InvalidationTracker {
+    method @WorkerThread public void addObserver(androidx.room.InvalidationTracker.Observer observer);
+    method public void refreshVersionsAsync();
+    method @WorkerThread public void removeObserver(androidx.room.InvalidationTracker.Observer observer);
+    field public static final androidx.room.InvalidationTracker.Companion Companion;
+  }
+
+  public static final class InvalidationTracker.Companion {
+  }
+
+  public abstract static class InvalidationTracker.Observer {
+    ctor public InvalidationTracker.Observer(String![] tables);
+    ctor protected InvalidationTracker.Observer(String firstTable, java.lang.String... rest);
+    method public abstract void onInvalidated(java.util.Set<java.lang.String> tables);
+  }
+
+  @androidx.room.ExperimentalRoomApi public final class MultiInstanceInvalidationService extends android.app.Service {
+    ctor public MultiInstanceInvalidationService();
+    method public android.os.IBinder onBind(android.content.Intent intent);
+  }
+
+  public final class Room {
+    method public static <T extends androidx.room.RoomDatabase> androidx.room.RoomDatabase.Builder<T> databaseBuilder(android.content.Context context, Class<T> klass, String? name);
+    method public static <T extends androidx.room.RoomDatabase> androidx.room.RoomDatabase.Builder<T> inMemoryDatabaseBuilder(android.content.Context context, Class<T> klass);
+    field public static final androidx.room.Room INSTANCE;
+    field public static final String MASTER_TABLE_NAME = "room_master_table";
+  }
+
+  public abstract class RoomDatabase {
+    ctor public RoomDatabase();
+    method @Deprecated public void beginTransaction();
+    method @WorkerThread public abstract void clearAllTables();
+    method public void close();
+    method public androidx.sqlite.db.SupportSQLiteStatement compileStatement(String sql);
+    method protected abstract androidx.room.InvalidationTracker createInvalidationTracker();
+    method protected abstract androidx.sqlite.db.SupportSQLiteOpenHelper createOpenHelper(androidx.room.DatabaseConfiguration config);
+    method @Deprecated public void endTransaction();
+    method public androidx.room.InvalidationTracker getInvalidationTracker();
+    method public androidx.sqlite.db.SupportSQLiteOpenHelper getOpenHelper();
+    method public java.util.concurrent.Executor getQueryExecutor();
+    method public java.util.concurrent.Executor getTransactionExecutor();
+    method public <T> T? getTypeConverter(Class<T> klass);
+    method public boolean inTransaction();
+    method @CallSuper public void init(androidx.room.DatabaseConfiguration configuration);
+    method protected void internalInitInvalidationTracker(androidx.sqlite.db.SupportSQLiteDatabase db);
+    method public boolean isOpen();
+    method public android.database.Cursor query(String query, Object![]? args);
+    method public android.database.Cursor query(androidx.sqlite.db.SupportSQLiteQuery query, optional android.os.CancellationSignal? signal);
+    method public android.database.Cursor query(androidx.sqlite.db.SupportSQLiteQuery query);
+    method public void runInTransaction(Runnable body);
+    method public <V> V! runInTransaction(java.util.concurrent.Callable<V> body);
+    method @Deprecated public void setTransactionSuccessful();
+    property public androidx.room.InvalidationTracker invalidationTracker;
+    property public boolean isOpen;
+    property public androidx.sqlite.db.SupportSQLiteOpenHelper openHelper;
+    property public java.util.concurrent.Executor queryExecutor;
+    property public java.util.concurrent.Executor transactionExecutor;
+    field public static final androidx.room.RoomDatabase.Companion Companion;
+    field @Deprecated @kotlin.jvm.Volatile protected volatile androidx.sqlite.db.SupportSQLiteDatabase? mDatabase;
+  }
+
+  public static class RoomDatabase.Builder<T extends androidx.room.RoomDatabase> {
+    method public androidx.room.RoomDatabase.Builder<T> addAutoMigrationSpec(androidx.room.migration.AutoMigrationSpec autoMigrationSpec);
+    method public androidx.room.RoomDatabase.Builder<T> addCallback(androidx.room.RoomDatabase.Callback callback);
+    method public androidx.room.RoomDatabase.Builder<T> addMigrations(androidx.room.migration.Migration... migrations);
+    method public androidx.room.RoomDatabase.Builder<T> addTypeConverter(Object typeConverter);
+    method public androidx.room.RoomDatabase.Builder<T> allowMainThreadQueries();
+    method public T build();
+    method public androidx.room.RoomDatabase.Builder<T> createFromAsset(String databaseFilePath);
+    method public androidx.room.RoomDatabase.Builder<T> createFromAsset(String databaseFilePath, androidx.room.RoomDatabase.PrepackagedDatabaseCallback callback);
+    method public androidx.room.RoomDatabase.Builder<T> createFromFile(java.io.File databaseFile);
+    method public androidx.room.RoomDatabase.Builder<T> createFromFile(java.io.File databaseFile, androidx.room.RoomDatabase.PrepackagedDatabaseCallback callback);
+    method public androidx.room.RoomDatabase.Builder<T> createFromInputStream(java.util.concurrent.Callable<java.io.InputStream> inputStreamCallable);
+    method public androidx.room.RoomDatabase.Builder<T> createFromInputStream(java.util.concurrent.Callable<java.io.InputStream> inputStreamCallable, androidx.room.RoomDatabase.PrepackagedDatabaseCallback callback);
+    method public androidx.room.RoomDatabase.Builder<T> enableMultiInstanceInvalidation();
+    method public androidx.room.RoomDatabase.Builder<T> fallbackToDestructiveMigration();
+    method public androidx.room.RoomDatabase.Builder<T> fallbackToDestructiveMigrationFrom(int... startVersions);
+    method public androidx.room.RoomDatabase.Builder<T> fallbackToDestructiveMigrationOnDowngrade();
+    method public androidx.room.RoomDatabase.Builder<T> openHelperFactory(androidx.sqlite.db.SupportSQLiteOpenHelper.Factory? factory);
+    method @androidx.room.ExperimentalRoomApi public androidx.room.RoomDatabase.Builder<T> setAutoCloseTimeout(@IntRange(from=0L) long autoCloseTimeout, java.util.concurrent.TimeUnit autoCloseTimeUnit);
+    method public androidx.room.RoomDatabase.Builder<T> setJournalMode(androidx.room.RoomDatabase.JournalMode journalMode);
+    method @androidx.room.ExperimentalRoomApi public androidx.room.RoomDatabase.Builder<T> setMultiInstanceInvalidationServiceIntent(android.content.Intent invalidationServiceIntent);
+    method public androidx.room.RoomDatabase.Builder<T> setQueryCallback(androidx.room.RoomDatabase.QueryCallback queryCallback, java.util.concurrent.Executor executor);
+    method public androidx.room.RoomDatabase.Builder<T> setQueryExecutor(java.util.concurrent.Executor executor);
+    method public androidx.room.RoomDatabase.Builder<T> setTransactionExecutor(java.util.concurrent.Executor executor);
+  }
+
+  public abstract static class RoomDatabase.Callback {
+    ctor public RoomDatabase.Callback();
+    method public void onCreate(androidx.sqlite.db.SupportSQLiteDatabase db);
+    method public void onDestructiveMigration(androidx.sqlite.db.SupportSQLiteDatabase db);
+    method public void onOpen(androidx.sqlite.db.SupportSQLiteDatabase db);
+  }
+
+  public static final class RoomDatabase.Companion {
+  }
+
+  public enum RoomDatabase.JournalMode {
+    method public static androidx.room.RoomDatabase.JournalMode valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.room.RoomDatabase.JournalMode[] values();
+    enum_constant public static final androidx.room.RoomDatabase.JournalMode AUTOMATIC;
+    enum_constant public static final androidx.room.RoomDatabase.JournalMode TRUNCATE;
+    enum_constant public static final androidx.room.RoomDatabase.JournalMode WRITE_AHEAD_LOGGING;
+  }
+
+  public static class RoomDatabase.MigrationContainer {
+    ctor public RoomDatabase.MigrationContainer();
+    method public void addMigrations(androidx.room.migration.Migration... migrations);
+    method public void addMigrations(java.util.List<? extends androidx.room.migration.Migration> migrations);
+    method public final boolean contains(int startVersion, int endVersion);
+    method public java.util.List<androidx.room.migration.Migration>? findMigrationPath(int start, int end);
+    method public java.util.Map<java.lang.Integer,java.util.Map<java.lang.Integer,androidx.room.migration.Migration>> getMigrations();
+  }
+
+  public abstract static class RoomDatabase.PrepackagedDatabaseCallback {
+    ctor public RoomDatabase.PrepackagedDatabaseCallback();
+    method public void onOpenPrepackagedDatabase(androidx.sqlite.db.SupportSQLiteDatabase db);
+  }
+
+  public static interface RoomDatabase.QueryCallback {
+    method public void onQuery(String sqlQuery, java.util.List<?> bindArgs);
+  }
+
+}
+
+package androidx.room.migration {
+
+  public interface AutoMigrationSpec {
+    method public default void onPostMigrate(androidx.sqlite.db.SupportSQLiteDatabase);
+  }
+
+  public abstract class Migration {
+    ctor public Migration(int, int);
+    method public abstract void migrate(androidx.sqlite.db.SupportSQLiteDatabase);
+    field public final int endVersion;
+    field public final int startVersion;
+  }
+
+}
+
+package androidx.room.util {
+
+  public final class TableInfoKt {
+  }
+
+}
+
diff --git a/room/room-runtime/api/res-2.5.0-beta01.txt b/room/room-runtime/api/res-2.5.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/room/room-runtime/api/res-2.5.0-beta01.txt
diff --git a/room/room-runtime/api/restricted_2.5.0-beta01.txt b/room/room-runtime/api/restricted_2.5.0-beta01.txt
new file mode 100644
index 0000000..44454ed
--- /dev/null
+++ b/room/room-runtime/api/restricted_2.5.0-beta01.txt
@@ -0,0 +1,434 @@
+// Signature format: 4.0
+package androidx.room {
+
+  public class DatabaseConfiguration {
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public DatabaseConfiguration(android.content.Context context, String? name, androidx.sqlite.db.SupportSQLiteOpenHelper.Factory sqliteOpenHelperFactory, androidx.room.RoomDatabase.MigrationContainer migrationContainer, java.util.List<? extends androidx.room.RoomDatabase.Callback>? callbacks, boolean allowMainThreadQueries, androidx.room.RoomDatabase.JournalMode journalMode, java.util.concurrent.Executor queryExecutor, java.util.concurrent.Executor transactionExecutor, android.content.Intent? multiInstanceInvalidationServiceIntent, boolean requireMigration, boolean allowDestructiveMigrationOnDowngrade, java.util.Set<java.lang.Integer>? migrationNotRequiredFrom, String? copyFromAssetPath, java.io.File? copyFromFile, java.util.concurrent.Callable<java.io.InputStream>? copyFromInputStream, androidx.room.RoomDatabase.PrepackagedDatabaseCallback? prepackagedDatabaseCallback, java.util.List<?> typeConverters, java.util.List<? extends androidx.room.migration.AutoMigrationSpec> autoMigrationSpecs);
+    ctor @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public DatabaseConfiguration(android.content.Context context, String? name, androidx.sqlite.db.SupportSQLiteOpenHelper.Factory sqliteOpenHelperFactory, androidx.room.RoomDatabase.MigrationContainer migrationContainer, java.util.List<? extends androidx.room.RoomDatabase.Callback>? callbacks, boolean allowMainThreadQueries, androidx.room.RoomDatabase.JournalMode journalMode, java.util.concurrent.Executor queryExecutor, boolean requireMigration, java.util.Set<java.lang.Integer>? migrationNotRequiredFrom);
+    ctor @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public DatabaseConfiguration(android.content.Context context, String? name, androidx.sqlite.db.SupportSQLiteOpenHelper.Factory sqliteOpenHelperFactory, androidx.room.RoomDatabase.MigrationContainer migrationContainer, java.util.List<? extends androidx.room.RoomDatabase.Callback>? callbacks, boolean allowMainThreadQueries, androidx.room.RoomDatabase.JournalMode journalMode, java.util.concurrent.Executor queryExecutor, java.util.concurrent.Executor transactionExecutor, boolean multiInstanceInvalidation, boolean requireMigration, boolean allowDestructiveMigrationOnDowngrade, java.util.Set<java.lang.Integer>? migrationNotRequiredFrom);
+    ctor @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public DatabaseConfiguration(android.content.Context context, String? name, androidx.sqlite.db.SupportSQLiteOpenHelper.Factory sqliteOpenHelperFactory, androidx.room.RoomDatabase.MigrationContainer migrationContainer, java.util.List<? extends androidx.room.RoomDatabase.Callback>? callbacks, boolean allowMainThreadQueries, androidx.room.RoomDatabase.JournalMode journalMode, java.util.concurrent.Executor queryExecutor, java.util.concurrent.Executor transactionExecutor, boolean multiInstanceInvalidation, boolean requireMigration, boolean allowDestructiveMigrationOnDowngrade, java.util.Set<java.lang.Integer>? migrationNotRequiredFrom, String? copyFromAssetPath, java.io.File? copyFromFile);
+    ctor @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public DatabaseConfiguration(android.content.Context context, String? name, androidx.sqlite.db.SupportSQLiteOpenHelper.Factory sqliteOpenHelperFactory, androidx.room.RoomDatabase.MigrationContainer migrationContainer, java.util.List<? extends androidx.room.RoomDatabase.Callback>? callbacks, boolean allowMainThreadQueries, androidx.room.RoomDatabase.JournalMode journalMode, java.util.concurrent.Executor queryExecutor, java.util.concurrent.Executor transactionExecutor, boolean multiInstanceInvalidation, boolean requireMigration, boolean allowDestructiveMigrationOnDowngrade, java.util.Set<java.lang.Integer>? migrationNotRequiredFrom, String? copyFromAssetPath, java.io.File? copyFromFile, java.util.concurrent.Callable<java.io.InputStream>? copyFromInputStream);
+    ctor @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public DatabaseConfiguration(android.content.Context context, String? name, androidx.sqlite.db.SupportSQLiteOpenHelper.Factory sqliteOpenHelperFactory, androidx.room.RoomDatabase.MigrationContainer migrationContainer, java.util.List<? extends androidx.room.RoomDatabase.Callback>? callbacks, boolean allowMainThreadQueries, androidx.room.RoomDatabase.JournalMode journalMode, java.util.concurrent.Executor queryExecutor, java.util.concurrent.Executor transactionExecutor, boolean multiInstanceInvalidation, boolean requireMigration, boolean allowDestructiveMigrationOnDowngrade, java.util.Set<java.lang.Integer>? migrationNotRequiredFrom, String? copyFromAssetPath, java.io.File? copyFromFile, java.util.concurrent.Callable<java.io.InputStream>? copyFromInputStream, androidx.room.RoomDatabase.PrepackagedDatabaseCallback? prepackagedDatabaseCallback);
+    ctor @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public DatabaseConfiguration(android.content.Context context, String? name, androidx.sqlite.db.SupportSQLiteOpenHelper.Factory sqliteOpenHelperFactory, androidx.room.RoomDatabase.MigrationContainer migrationContainer, java.util.List<? extends androidx.room.RoomDatabase.Callback>? callbacks, boolean allowMainThreadQueries, androidx.room.RoomDatabase.JournalMode journalMode, java.util.concurrent.Executor queryExecutor, java.util.concurrent.Executor transactionExecutor, boolean multiInstanceInvalidation, boolean requireMigration, boolean allowDestructiveMigrationOnDowngrade, java.util.Set<java.lang.Integer>? migrationNotRequiredFrom, String? copyFromAssetPath, java.io.File? copyFromFile, java.util.concurrent.Callable<java.io.InputStream>? copyFromInputStream, androidx.room.RoomDatabase.PrepackagedDatabaseCallback? prepackagedDatabaseCallback, java.util.List<?> typeConverters);
+    ctor @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public DatabaseConfiguration(android.content.Context context, String? name, androidx.sqlite.db.SupportSQLiteOpenHelper.Factory sqliteOpenHelperFactory, androidx.room.RoomDatabase.MigrationContainer migrationContainer, java.util.List<? extends androidx.room.RoomDatabase.Callback>? callbacks, boolean allowMainThreadQueries, androidx.room.RoomDatabase.JournalMode journalMode, java.util.concurrent.Executor queryExecutor, java.util.concurrent.Executor transactionExecutor, boolean multiInstanceInvalidation, boolean requireMigration, boolean allowDestructiveMigrationOnDowngrade, java.util.Set<java.lang.Integer>? migrationNotRequiredFrom, String? copyFromAssetPath, java.io.File? copyFromFile, java.util.concurrent.Callable<java.io.InputStream>? copyFromInputStream, androidx.room.RoomDatabase.PrepackagedDatabaseCallback? prepackagedDatabaseCallback, java.util.List<?> typeConverters, java.util.List<? extends androidx.room.migration.AutoMigrationSpec> autoMigrationSpecs);
+    method public boolean isMigrationRequired(int fromVersion, int toVersion);
+    method @Deprecated public boolean isMigrationRequiredFrom(int version);
+    field public final boolean allowDestructiveMigrationOnDowngrade;
+    field public final boolean allowMainThreadQueries;
+    field public final java.util.List<androidx.room.migration.AutoMigrationSpec> autoMigrationSpecs;
+    field public final java.util.List<androidx.room.RoomDatabase.Callback>? callbacks;
+    field public final android.content.Context context;
+    field public final String? copyFromAssetPath;
+    field public final java.io.File? copyFromFile;
+    field public final java.util.concurrent.Callable<java.io.InputStream>? copyFromInputStream;
+    field public final androidx.room.RoomDatabase.JournalMode journalMode;
+    field public final androidx.room.RoomDatabase.MigrationContainer migrationContainer;
+    field public final boolean multiInstanceInvalidation;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final android.content.Intent? multiInstanceInvalidationServiceIntent;
+    field public final String? name;
+    field public final androidx.room.RoomDatabase.PrepackagedDatabaseCallback? prepackagedDatabaseCallback;
+    field public final java.util.concurrent.Executor queryExecutor;
+    field public final boolean requireMigration;
+    field public final androidx.sqlite.db.SupportSQLiteOpenHelper.Factory sqliteOpenHelperFactory;
+    field public final java.util.concurrent.Executor transactionExecutor;
+    field public final java.util.List<java.lang.Object> typeConverters;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract class EntityDeletionOrUpdateAdapter<T> extends androidx.room.SharedSQLiteStatement {
+    ctor public EntityDeletionOrUpdateAdapter(androidx.room.RoomDatabase database);
+    method protected abstract void bind(androidx.sqlite.db.SupportSQLiteStatement statement, T? entity);
+    method public final int handle(T? entity);
+    method public final int handleMultiple(Iterable<? extends T> entities);
+    method public final int handleMultiple(T![] entities);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract class EntityInsertionAdapter<T> extends androidx.room.SharedSQLiteStatement {
+    ctor public EntityInsertionAdapter(androidx.room.RoomDatabase database);
+    method protected abstract void bind(androidx.sqlite.db.SupportSQLiteStatement? statement, T? entity);
+    method public final void insert(T? entity);
+    method public final void insert(T![] entities);
+    method public final void insert(Iterable<? extends T> entities);
+    method public final long insertAndReturnId(T? entity);
+    method public final long[] insertAndReturnIdsArray(java.util.Collection<? extends T> entities);
+    method public final long[] insertAndReturnIdsArray(T![] entities);
+    method public final Long![] insertAndReturnIdsArrayBox(java.util.Collection<? extends T> entities);
+    method public final Long![] insertAndReturnIdsArrayBox(T![] entities);
+    method public final java.util.List<java.lang.Long> insertAndReturnIdsList(T![] entities);
+    method public final java.util.List<java.lang.Long> insertAndReturnIdsList(java.util.Collection<? extends T> entities);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class EntityUpsertionAdapter<T> {
+    ctor public EntityUpsertionAdapter(androidx.room.EntityInsertionAdapter<T> insertionAdapter, androidx.room.EntityDeletionOrUpdateAdapter<T> updateAdapter);
+    method public void upsert(T? entity);
+    method public void upsert(T![] entities);
+    method public void upsert(Iterable<? extends T> entities);
+    method public long upsertAndReturnId(T? entity);
+    method public long[] upsertAndReturnIdsArray(T![] entities);
+    method public long[] upsertAndReturnIdsArray(java.util.Collection<? extends T> entities);
+    method public Long![] upsertAndReturnIdsArrayBox(T![] entities);
+    method public Long![] upsertAndReturnIdsArrayBox(java.util.Collection<? extends T> entities);
+    method public java.util.List<java.lang.Long> upsertAndReturnIdsList(T![] entities);
+    method public java.util.List<java.lang.Long> upsertAndReturnIdsList(java.util.Collection<? extends T> entities);
+  }
+
+  public final class EntityUpsertionAdapterKt {
+  }
+
+  public class InvalidationTracker {
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public InvalidationTracker(androidx.room.RoomDatabase database, java.util.Map<java.lang.String,java.lang.String> shadowTablesMap, java.util.Map<java.lang.String,java.util.Set<java.lang.String>> viewTables, java.lang.String... tableNames);
+    ctor @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public InvalidationTracker(androidx.room.RoomDatabase database, java.lang.String... tableNames);
+    method @WorkerThread public void addObserver(androidx.room.InvalidationTracker.Observer observer);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void addWeakObserver(androidx.room.InvalidationTracker.Observer observer);
+    method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public <T> androidx.lifecycle.LiveData<T> createLiveData(String![] tableNames, java.util.concurrent.Callable<T> computeFunction);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public <T> androidx.lifecycle.LiveData<T> createLiveData(String![] tableNames, boolean inTransaction, java.util.concurrent.Callable<T> computeFunction);
+    method public void refreshVersionsAsync();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) @WorkerThread public void refreshVersionsSync();
+    method @WorkerThread public void removeObserver(androidx.room.InvalidationTracker.Observer observer);
+    field public static final androidx.room.InvalidationTracker.Companion Companion;
+  }
+
+  public static final class InvalidationTracker.Companion {
+  }
+
+  public abstract static class InvalidationTracker.Observer {
+    ctor public InvalidationTracker.Observer(String![] tables);
+    ctor protected InvalidationTracker.Observer(String firstTable, java.lang.String... rest);
+    method public abstract void onInvalidated(java.util.Set<java.lang.String> tables);
+  }
+
+  public final class Room {
+    method public static <T extends androidx.room.RoomDatabase> androidx.room.RoomDatabase.Builder<T> databaseBuilder(android.content.Context context, Class<T> klass, String? name);
+    method public static <T extends androidx.room.RoomDatabase> androidx.room.RoomDatabase.Builder<T> inMemoryDatabaseBuilder(android.content.Context context, Class<T> klass);
+    field public static final androidx.room.Room INSTANCE;
+    field public static final String MASTER_TABLE_NAME = "room_master_table";
+  }
+
+  public abstract class RoomDatabase {
+    ctor public RoomDatabase();
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public void assertNotMainThread();
+    method @Deprecated public void beginTransaction();
+    method @WorkerThread public abstract void clearAllTables();
+    method public void close();
+    method public androidx.sqlite.db.SupportSQLiteStatement compileStatement(String sql);
+    method protected abstract androidx.room.InvalidationTracker createInvalidationTracker();
+    method protected abstract androidx.sqlite.db.SupportSQLiteOpenHelper createOpenHelper(androidx.room.DatabaseConfiguration config);
+    method @Deprecated public void endTransaction();
+    method public androidx.room.InvalidationTracker getInvalidationTracker();
+    method public androidx.sqlite.db.SupportSQLiteOpenHelper getOpenHelper();
+    method public java.util.concurrent.Executor getQueryExecutor();
+    method public java.util.concurrent.Executor getTransactionExecutor();
+    method public <T> T? getTypeConverter(Class<T> klass);
+    method public boolean inTransaction();
+    method @CallSuper public void init(androidx.room.DatabaseConfiguration configuration);
+    method protected void internalInitInvalidationTracker(androidx.sqlite.db.SupportSQLiteDatabase db);
+    method public boolean isOpen();
+    method public android.database.Cursor query(String query, Object![]? args);
+    method public android.database.Cursor query(androidx.sqlite.db.SupportSQLiteQuery query, optional android.os.CancellationSignal? signal);
+    method public android.database.Cursor query(androidx.sqlite.db.SupportSQLiteQuery query);
+    method public void runInTransaction(Runnable body);
+    method public <V> V! runInTransaction(java.util.concurrent.Callable<V> body);
+    method @Deprecated public void setTransactionSuccessful();
+    property public androidx.room.InvalidationTracker invalidationTracker;
+    property public boolean isOpen;
+    property public androidx.sqlite.db.SupportSQLiteOpenHelper openHelper;
+    property public java.util.concurrent.Executor queryExecutor;
+    property public java.util.concurrent.Executor transactionExecutor;
+    field public static final androidx.room.RoomDatabase.Companion Companion;
+    field @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final int MAX_BIND_PARAMETER_CNT = 999; // 0x3e7
+    field @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) protected java.util.List<? extends androidx.room.RoomDatabase.Callback>? mCallbacks;
+    field @Deprecated @kotlin.jvm.Volatile protected volatile androidx.sqlite.db.SupportSQLiteDatabase? mDatabase;
+  }
+
+  public static class RoomDatabase.Builder<T extends androidx.room.RoomDatabase> {
+    method public androidx.room.RoomDatabase.Builder<T> addAutoMigrationSpec(androidx.room.migration.AutoMigrationSpec autoMigrationSpec);
+    method public androidx.room.RoomDatabase.Builder<T> addCallback(androidx.room.RoomDatabase.Callback callback);
+    method public androidx.room.RoomDatabase.Builder<T> addMigrations(androidx.room.migration.Migration... migrations);
+    method public androidx.room.RoomDatabase.Builder<T> addTypeConverter(Object typeConverter);
+    method public androidx.room.RoomDatabase.Builder<T> allowMainThreadQueries();
+    method public T build();
+    method public androidx.room.RoomDatabase.Builder<T> createFromAsset(String databaseFilePath);
+    method public androidx.room.RoomDatabase.Builder<T> createFromAsset(String databaseFilePath, androidx.room.RoomDatabase.PrepackagedDatabaseCallback callback);
+    method public androidx.room.RoomDatabase.Builder<T> createFromFile(java.io.File databaseFile);
+    method public androidx.room.RoomDatabase.Builder<T> createFromFile(java.io.File databaseFile, androidx.room.RoomDatabase.PrepackagedDatabaseCallback callback);
+    method public androidx.room.RoomDatabase.Builder<T> createFromInputStream(java.util.concurrent.Callable<java.io.InputStream> inputStreamCallable);
+    method public androidx.room.RoomDatabase.Builder<T> createFromInputStream(java.util.concurrent.Callable<java.io.InputStream> inputStreamCallable, androidx.room.RoomDatabase.PrepackagedDatabaseCallback callback);
+    method public androidx.room.RoomDatabase.Builder<T> enableMultiInstanceInvalidation();
+    method public androidx.room.RoomDatabase.Builder<T> fallbackToDestructiveMigration();
+    method public androidx.room.RoomDatabase.Builder<T> fallbackToDestructiveMigrationFrom(int... startVersions);
+    method public androidx.room.RoomDatabase.Builder<T> fallbackToDestructiveMigrationOnDowngrade();
+    method public androidx.room.RoomDatabase.Builder<T> openHelperFactory(androidx.sqlite.db.SupportSQLiteOpenHelper.Factory? factory);
+    method public androidx.room.RoomDatabase.Builder<T> setJournalMode(androidx.room.RoomDatabase.JournalMode journalMode);
+    method public androidx.room.RoomDatabase.Builder<T> setQueryCallback(androidx.room.RoomDatabase.QueryCallback queryCallback, java.util.concurrent.Executor executor);
+    method public androidx.room.RoomDatabase.Builder<T> setQueryExecutor(java.util.concurrent.Executor executor);
+    method public androidx.room.RoomDatabase.Builder<T> setTransactionExecutor(java.util.concurrent.Executor executor);
+  }
+
+  public abstract static class RoomDatabase.Callback {
+    ctor public RoomDatabase.Callback();
+    method public void onCreate(androidx.sqlite.db.SupportSQLiteDatabase db);
+    method public void onDestructiveMigration(androidx.sqlite.db.SupportSQLiteDatabase db);
+    method public void onOpen(androidx.sqlite.db.SupportSQLiteDatabase db);
+  }
+
+  public static final class RoomDatabase.Companion {
+  }
+
+  public enum RoomDatabase.JournalMode {
+    method public static androidx.room.RoomDatabase.JournalMode valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.room.RoomDatabase.JournalMode[] values();
+    enum_constant public static final androidx.room.RoomDatabase.JournalMode AUTOMATIC;
+    enum_constant public static final androidx.room.RoomDatabase.JournalMode TRUNCATE;
+    enum_constant public static final androidx.room.RoomDatabase.JournalMode WRITE_AHEAD_LOGGING;
+  }
+
+  public static class RoomDatabase.MigrationContainer {
+    ctor public RoomDatabase.MigrationContainer();
+    method public void addMigrations(androidx.room.migration.Migration... migrations);
+    method public void addMigrations(java.util.List<? extends androidx.room.migration.Migration> migrations);
+    method public final boolean contains(int startVersion, int endVersion);
+    method public java.util.List<androidx.room.migration.Migration>? findMigrationPath(int start, int end);
+    method public java.util.Map<java.lang.Integer,java.util.Map<java.lang.Integer,androidx.room.migration.Migration>> getMigrations();
+  }
+
+  public abstract static class RoomDatabase.PrepackagedDatabaseCallback {
+    ctor public RoomDatabase.PrepackagedDatabaseCallback();
+    method public void onOpenPrepackagedDatabase(androidx.sqlite.db.SupportSQLiteDatabase db);
+  }
+
+  public static interface RoomDatabase.QueryCallback {
+    method public void onQuery(String sqlQuery, java.util.List<?> bindArgs);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public class RoomOpenHelper extends androidx.sqlite.db.SupportSQLiteOpenHelper.Callback {
+    ctor public RoomOpenHelper(androidx.room.DatabaseConfiguration configuration, androidx.room.RoomOpenHelper.Delegate delegate, String identityHash, String legacyHash);
+    ctor public RoomOpenHelper(androidx.room.DatabaseConfiguration configuration, androidx.room.RoomOpenHelper.Delegate delegate, String legacyHash);
+    method public void onCreate(androidx.sqlite.db.SupportSQLiteDatabase db);
+    method public void onUpgrade(androidx.sqlite.db.SupportSQLiteDatabase db, int oldVersion, int newVersion);
+    field public static final androidx.room.RoomOpenHelper.Companion Companion;
+  }
+
+  public static final class RoomOpenHelper.Companion {
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract static class RoomOpenHelper.Delegate {
+    ctor public RoomOpenHelper.Delegate(int version);
+    method public abstract void createAllTables(androidx.sqlite.db.SupportSQLiteDatabase database);
+    method public abstract void dropAllTables(androidx.sqlite.db.SupportSQLiteDatabase database);
+    method public abstract void onCreate(androidx.sqlite.db.SupportSQLiteDatabase database);
+    method public abstract void onOpen(androidx.sqlite.db.SupportSQLiteDatabase database);
+    method public void onPostMigrate(androidx.sqlite.db.SupportSQLiteDatabase database);
+    method public void onPreMigrate(androidx.sqlite.db.SupportSQLiteDatabase database);
+    method public androidx.room.RoomOpenHelper.ValidationResult onValidateSchema(androidx.sqlite.db.SupportSQLiteDatabase db);
+    method @Deprecated protected void validateMigration(androidx.sqlite.db.SupportSQLiteDatabase db);
+    field public final int version;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static class RoomOpenHelper.ValidationResult {
+    ctor public RoomOpenHelper.ValidationResult(boolean isValid, String? expectedFoundMsg);
+    field public final String? expectedFoundMsg;
+    field public final boolean isValid;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class RoomSQLiteQuery implements androidx.sqlite.db.SupportSQLiteProgram androidx.sqlite.db.SupportSQLiteQuery {
+    method public static androidx.room.RoomSQLiteQuery acquire(String query, int argumentCount);
+    method public void bindBlob(int index, byte[] value);
+    method public void bindDouble(int index, double value);
+    method public void bindLong(int index, long value);
+    method public void bindNull(int index);
+    method public void bindString(int index, String value);
+    method public void bindTo(androidx.sqlite.db.SupportSQLiteProgram statement);
+    method public void clearBindings();
+    method public void close();
+    method public void copyArgumentsFrom(androidx.room.RoomSQLiteQuery other);
+    method public static androidx.room.RoomSQLiteQuery copyFrom(androidx.sqlite.db.SupportSQLiteQuery supportSQLiteQuery);
+    method public int getArgCount();
+    method public int getCapacity();
+    method public String getSql();
+    method public void init(String query, int initArgCount);
+    method public void release();
+    property public int argCount;
+    property public final int capacity;
+    property public String sql;
+    field public static final androidx.room.RoomSQLiteQuery.Companion Companion;
+    field @VisibleForTesting public static final int DESIRED_POOL_SIZE = 10; // 0xa
+    field @VisibleForTesting public static final int POOL_LIMIT = 15; // 0xf
+    field @VisibleForTesting public final byte[]![] blobBindings;
+    field @VisibleForTesting public final double[] doubleBindings;
+    field @VisibleForTesting public final long[] longBindings;
+    field @VisibleForTesting public static final java.util.TreeMap<java.lang.Integer,androidx.room.RoomSQLiteQuery> queryPool;
+    field @VisibleForTesting public final String![] stringBindings;
+  }
+
+  public static final class RoomSQLiteQuery.Companion {
+    method public androidx.room.RoomSQLiteQuery acquire(String query, int argumentCount);
+    method public androidx.room.RoomSQLiteQuery copyFrom(androidx.sqlite.db.SupportSQLiteQuery supportSQLiteQuery);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract class SharedSQLiteStatement {
+    ctor public SharedSQLiteStatement(androidx.room.RoomDatabase database);
+    method public androidx.sqlite.db.SupportSQLiteStatement acquire();
+    method protected void assertNotMainThread();
+    method protected abstract String createQuery();
+    method public void release(androidx.sqlite.db.SupportSQLiteStatement statement);
+  }
+
+}
+
+package androidx.room.migration {
+
+  public interface AutoMigrationSpec {
+    method public default void onPostMigrate(androidx.sqlite.db.SupportSQLiteDatabase);
+  }
+
+  public abstract class Migration {
+    ctor public Migration(int, int);
+    method public abstract void migrate(androidx.sqlite.db.SupportSQLiteDatabase);
+    field public final int endVersion;
+    field public final int startVersion;
+  }
+
+}
+
+package androidx.room.paging {
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public abstract class LimitOffsetDataSource<T> extends androidx.paging.PositionalDataSource<T> {
+    ctor protected LimitOffsetDataSource(androidx.room.RoomDatabase, androidx.sqlite.db.SupportSQLiteQuery, boolean, java.lang.String!...);
+    ctor protected LimitOffsetDataSource(androidx.room.RoomDatabase, androidx.sqlite.db.SupportSQLiteQuery, boolean, boolean, java.lang.String!...);
+    ctor protected LimitOffsetDataSource(androidx.room.RoomDatabase, androidx.room.RoomSQLiteQuery, boolean, java.lang.String!...);
+    ctor protected LimitOffsetDataSource(androidx.room.RoomDatabase, androidx.room.RoomSQLiteQuery, boolean, boolean, java.lang.String!...);
+    method protected abstract java.util.List<T!> convertRows(android.database.Cursor);
+    method public void loadInitial(androidx.paging.PositionalDataSource.LoadInitialParams, androidx.paging.PositionalDataSource.LoadInitialCallback<T!>);
+    method public void loadRange(androidx.paging.PositionalDataSource.LoadRangeParams, androidx.paging.PositionalDataSource.LoadRangeCallback<T!>);
+  }
+
+}
+
+package androidx.room.util {
+
+  @RestrictTo({androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX}) public final class CursorUtil {
+    method public static android.database.Cursor copyAndClose(android.database.Cursor c);
+    method public static int getColumnIndex(android.database.Cursor c, String name);
+    method public static int getColumnIndexOrThrow(android.database.Cursor c, String name);
+    method public static inline <R> R! useCursor(android.database.Cursor, kotlin.jvm.functions.Function1<? super android.database.Cursor,? extends R> block);
+    method public static android.database.Cursor wrapMappedColumns(android.database.Cursor cursor, String![] columnNames, int[] mapping);
+  }
+
+  @RestrictTo({androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX}) public final class DBUtil {
+    method public static android.os.CancellationSignal? createCancellationSignal();
+    method public static void dropFtsSyncTriggers(androidx.sqlite.db.SupportSQLiteDatabase db);
+    method public static void foreignKeyCheck(androidx.sqlite.db.SupportSQLiteDatabase db, String tableName);
+    method @Deprecated public static android.database.Cursor query(androidx.room.RoomDatabase db, androidx.sqlite.db.SupportSQLiteQuery sqLiteQuery, boolean maybeCopy);
+    method public static android.database.Cursor query(androidx.room.RoomDatabase db, androidx.sqlite.db.SupportSQLiteQuery sqLiteQuery, boolean maybeCopy, android.os.CancellationSignal? signal);
+    method @kotlin.jvm.Throws(exceptionClasses=IOException::class) public static int readVersion(java.io.File databaseFile) throws java.io.IOException;
+  }
+
+  @RestrictTo({androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX}) public final class FileUtil {
+    method @kotlin.jvm.Throws(exceptionClasses=IOException::class) public static void copy(java.nio.channels.ReadableByteChannel input, java.nio.channels.FileChannel output) throws java.io.IOException;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class FtsTableInfo {
+    ctor public FtsTableInfo(String name, java.util.Set<java.lang.String> columns, java.util.Set<java.lang.String> options);
+    ctor public FtsTableInfo(String name, java.util.Set<java.lang.String> columns, String createSql);
+    method @VisibleForTesting public static java.util.Set<java.lang.String> parseOptions(String createStatement);
+    method public static androidx.room.util.FtsTableInfo read(androidx.sqlite.db.SupportSQLiteDatabase database, String tableName);
+    field public static final androidx.room.util.FtsTableInfo.Companion Companion;
+    field public final java.util.Set<java.lang.String> columns;
+    field public final String name;
+    field public final java.util.Set<java.lang.String> options;
+  }
+
+  public static final class FtsTableInfo.Companion {
+    method @VisibleForTesting public java.util.Set<java.lang.String> parseOptions(String createStatement);
+    method public androidx.room.util.FtsTableInfo read(androidx.sqlite.db.SupportSQLiteDatabase database, String tableName);
+  }
+
+  @RestrictTo({androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX}) public final class StringUtil {
+    method public static void appendPlaceholders(StringBuilder builder, int count);
+    method public static String? joinIntoString(java.util.List<java.lang.Integer>? input);
+    method public static StringBuilder newStringBuilder();
+    method public static java.util.List<java.lang.Integer>? splitToIntList(String? input);
+    field public static final String![] EMPTY_STRING_ARRAY;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class TableInfo {
+    ctor public TableInfo(String name, java.util.Map<java.lang.String,androidx.room.util.TableInfo.Column> columns, java.util.Set<androidx.room.util.TableInfo.ForeignKey> foreignKeys, optional java.util.Set<androidx.room.util.TableInfo.Index>? indices);
+    ctor public TableInfo(String name, java.util.Map<java.lang.String,androidx.room.util.TableInfo.Column> columns, java.util.Set<androidx.room.util.TableInfo.ForeignKey> foreignKeys);
+    method public static androidx.room.util.TableInfo read(androidx.sqlite.db.SupportSQLiteDatabase database, String tableName);
+    field public static final int CREATED_FROM_DATABASE = 2; // 0x2
+    field public static final int CREATED_FROM_ENTITY = 1; // 0x1
+    field public static final int CREATED_FROM_UNKNOWN = 0; // 0x0
+    field public static final androidx.room.util.TableInfo.Companion Companion;
+    field public final java.util.Map<java.lang.String,androidx.room.util.TableInfo.Column> columns;
+    field public final java.util.Set<androidx.room.util.TableInfo.ForeignKey> foreignKeys;
+    field public final java.util.Set<androidx.room.util.TableInfo.Index>? indices;
+    field public final String name;
+  }
+
+  public static final class TableInfo.Column {
+    ctor public TableInfo.Column(String name, String type, boolean notNull, int primaryKeyPosition, String? defaultValue, int createdFrom);
+    ctor @Deprecated public TableInfo.Column(String name, String type, boolean notNull, int primaryKeyPosition);
+    method @VisibleForTesting public static boolean defaultValueEquals(String current, String? other);
+    method public boolean isPrimaryKey();
+    property public final boolean isPrimaryKey;
+    field public static final androidx.room.util.TableInfo.Column.Companion Companion;
+    field @androidx.room.ColumnInfo.SQLiteTypeAffinity public final int affinity;
+    field public final int createdFrom;
+    field public final String? defaultValue;
+    field public final String name;
+    field public final boolean notNull;
+    field public final int primaryKeyPosition;
+    field public final String type;
+  }
+
+  public static final class TableInfo.Column.Companion {
+    method @VisibleForTesting public boolean defaultValueEquals(String current, String? other);
+  }
+
+  public static final class TableInfo.Companion {
+    method public androidx.room.util.TableInfo read(androidx.sqlite.db.SupportSQLiteDatabase database, String tableName);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final class TableInfo.ForeignKey {
+    ctor public TableInfo.ForeignKey(String referenceTable, String onDelete, String onUpdate, java.util.List<java.lang.String> columnNames, java.util.List<java.lang.String> referenceColumnNames);
+    field public final java.util.List<java.lang.String> columnNames;
+    field public final String onDelete;
+    field public final String onUpdate;
+    field public final java.util.List<java.lang.String> referenceColumnNames;
+    field public final String referenceTable;
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static final class TableInfo.Index {
+    ctor public TableInfo.Index(String name, boolean unique, java.util.List<java.lang.String> columns, java.util.List<java.lang.String> orders);
+    ctor @Deprecated public TableInfo.Index(String name, boolean unique, java.util.List<java.lang.String> columns);
+    field public static final androidx.room.util.TableInfo.Index.Companion Companion;
+    field public static final String DEFAULT_PREFIX = "index_";
+    field public final java.util.List<java.lang.String> columns;
+    field public final String name;
+    field public java.util.List<java.lang.String> orders;
+    field public final boolean unique;
+  }
+
+  public static final class TableInfo.Index.Companion {
+  }
+
+  public final class TableInfoKt {
+  }
+
+  @RestrictTo({androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX}) public final class UUIDUtil {
+    method public static java.util.UUID convertByteToUUID(byte[] bytes);
+    method public static byte[] convertUUIDToByte(java.util.UUID uuid);
+  }
+
+  @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public final class ViewInfo {
+    ctor public ViewInfo(String name, String? sql);
+    method public static androidx.room.util.ViewInfo read(androidx.sqlite.db.SupportSQLiteDatabase database, String viewName);
+    field public static final androidx.room.util.ViewInfo.Companion Companion;
+    field public final String name;
+    field public final String? sql;
+  }
+
+  public static final class ViewInfo.Companion {
+    method public androidx.room.util.ViewInfo read(androidx.sqlite.db.SupportSQLiteDatabase database, String viewName);
+  }
+
+}
+
diff --git a/room/room-runtime/src/test/java/androidx/room/BuilderTest.java b/room/room-runtime/src/test/java/androidx/room/BuilderTest.java
deleted file mode 100644
index ca73919..0000000
--- a/room/room-runtime/src/test/java/androidx/room/BuilderTest.java
+++ /dev/null
@@ -1,506 +0,0 @@
-/*
- * Copyright (C) 2016 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 androidx.room;
-
-import static org.hamcrest.CoreMatchers.containsString;
-import static org.hamcrest.CoreMatchers.instanceOf;
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.notNullValue;
-import static org.hamcrest.CoreMatchers.nullValue;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.Assert.fail;
-import static org.mockito.Mockito.mock;
-
-import static java.util.Arrays.asList;
-
-import android.content.Context;
-
-import androidx.annotation.NonNull;
-import androidx.room.migration.Migration;
-import androidx.sqlite.db.SupportSQLiteDatabase;
-import androidx.sqlite.db.SupportSQLiteOpenHelper;
-import androidx.sqlite.db.framework.FrameworkSQLiteOpenHelperFactory;
-
-import org.hamcrest.CoreMatchers;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-import java.io.File;
-import java.util.List;
-import java.util.concurrent.Executor;
-
-@SuppressWarnings({"ArraysAsListWithZeroOrOneArgument", "deprecation"})
-@RunWith(JUnit4.class)
-public class BuilderTest {
-    @Test(expected = IllegalArgumentException.class)
-    public void nullName() {
-        //noinspection ConstantConditions
-        Room.databaseBuilder(mock(Context.class), RoomDatabase.class, null).build();
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    public void emptyName() {
-        Room.databaseBuilder(mock(Context.class), RoomDatabase.class, "  ").build();
-    }
-
-    @Test
-    public void executors_setQueryExecutor() {
-        Executor executor = mock(Executor.class);
-
-        TestDatabase db = Room.databaseBuilder(mock(Context.class), TestDatabase.class, "foo")
-                .setQueryExecutor(executor)
-                .build();
-
-        assertThat(db.mDatabaseConfiguration.queryExecutor, is(executor));
-        assertThat(db.mDatabaseConfiguration.transactionExecutor, is(executor));
-    }
-
-    @Test
-    public void executors_setTransactionExecutor() {
-        Executor executor = mock(Executor.class);
-
-        TestDatabase db = Room.databaseBuilder(mock(Context.class), TestDatabase.class, "foo")
-                .setTransactionExecutor(executor)
-                .build();
-
-        assertThat(db.mDatabaseConfiguration.queryExecutor, is(executor));
-        assertThat(db.mDatabaseConfiguration.transactionExecutor, is(executor));
-    }
-
-    @Test
-    public void executors_setBothExecutors() {
-        Executor executor1 = mock(Executor.class);
-        Executor executor2 = mock(Executor.class);
-
-        TestDatabase db = Room.databaseBuilder(mock(Context.class), TestDatabase.class, "foo")
-                .setQueryExecutor(executor1)
-                .setTransactionExecutor(executor2)
-                .build();
-
-        assertThat(db.mDatabaseConfiguration.queryExecutor, is(executor1));
-        assertThat(db.mDatabaseConfiguration.transactionExecutor, is(executor2));
-    }
-
-    @Test
-    public void migration() {
-        Migration m1 = new EmptyMigration(0, 1);
-        Migration m2 = new EmptyMigration(1, 2);
-        TestDatabase db = Room.databaseBuilder(mock(Context.class), TestDatabase.class, "foo")
-                .addMigrations(m1, m2).build();
-        DatabaseConfiguration config = ((BuilderTest_TestDatabase_Impl) db).mConfig;
-        RoomDatabase.MigrationContainer migrations = config.migrationContainer;
-        assertThat(migrations.findMigrationPath(0, 1), is(asList(m1)));
-        assertThat(migrations.findMigrationPath(1, 2), is(asList(m2)));
-        assertThat(migrations.findMigrationPath(0, 2), is(asList(m1, m2)));
-        assertThat(migrations.findMigrationPath(2, 0), CoreMatchers.<List<Migration>>nullValue());
-        assertThat(migrations.findMigrationPath(0, 3), CoreMatchers.<List<Migration>>nullValue());
-    }
-
-    @Test
-    public void migrationOverride() {
-        Migration m1 = new EmptyMigration(0, 1);
-        Migration m2 = new EmptyMigration(1, 2);
-        Migration m3 = new EmptyMigration(0, 1);
-        TestDatabase db = Room.databaseBuilder(mock(Context.class), TestDatabase.class, "foo")
-                .addMigrations(m1, m2, m3).build();
-        DatabaseConfiguration config = ((BuilderTest_TestDatabase_Impl) db).mConfig;
-        RoomDatabase.MigrationContainer migrations = config.migrationContainer;
-        assertThat(migrations.findMigrationPath(0, 1), is(asList(m3)));
-        assertThat(migrations.findMigrationPath(1, 2), is(asList(m2)));
-        assertThat(migrations.findMigrationPath(0, 3), CoreMatchers.<List<Migration>>nullValue());
-    }
-
-    @Test
-    public void migrationJump() {
-        Migration m1 = new EmptyMigration(0, 1);
-        Migration m2 = new EmptyMigration(1, 2);
-        Migration m3 = new EmptyMigration(2, 3);
-        Migration m4 = new EmptyMigration(0, 3);
-        TestDatabase db = Room.databaseBuilder(mock(Context.class), TestDatabase.class, "foo")
-                .addMigrations(m1, m2, m3, m4).build();
-        DatabaseConfiguration config = ((BuilderTest_TestDatabase_Impl) db).mConfig;
-        RoomDatabase.MigrationContainer migrations = config.migrationContainer;
-        assertThat(migrations.findMigrationPath(0, 3), is(asList(m4)));
-        assertThat(migrations.findMigrationPath(1, 3), is(asList(m2, m3)));
-    }
-
-    @Test
-    public void migrationDowngrade() {
-        Migration m1_2 = new EmptyMigration(1, 2);
-        Migration m2_3 = new EmptyMigration(2, 3);
-        Migration m3_4 = new EmptyMigration(3, 4);
-        Migration m3_2 = new EmptyMigration(3, 2);
-        Migration m2_1 = new EmptyMigration(2, 1);
-        TestDatabase db = Room.databaseBuilder(mock(Context.class), TestDatabase.class, "foo")
-                .addMigrations(m1_2, m2_3, m3_4, m3_2, m2_1).build();
-        DatabaseConfiguration config = ((BuilderTest_TestDatabase_Impl) db).mConfig;
-        RoomDatabase.MigrationContainer migrations = config.migrationContainer;
-        assertThat(migrations.findMigrationPath(3, 2), is(asList(m3_2)));
-        assertThat(migrations.findMigrationPath(3, 1), is(asList(m3_2, m2_1)));
-    }
-
-    @Test
-    public void skipMigration() {
-        Context context = mock(Context.class);
-
-        TestDatabase db = Room.inMemoryDatabaseBuilder(context, TestDatabase.class)
-                .fallbackToDestructiveMigration()
-                .build();
-
-        DatabaseConfiguration config = ((BuilderTest_TestDatabase_Impl) db).mConfig;
-        assertThat(config.requireMigration, is(false));
-    }
-
-    @Test
-    public void fallbackToDestructiveMigrationFrom_calledOnce_migrationsNotRequiredForValues() {
-        Context context = mock(Context.class);
-
-        TestDatabase db = Room.inMemoryDatabaseBuilder(context, TestDatabase.class)
-                .fallbackToDestructiveMigrationFrom(1, 2).build();
-
-        DatabaseConfiguration config = ((BuilderTest_TestDatabase_Impl) db).mConfig;
-        assertThat(config.isMigrationRequiredFrom(1), is(false));
-        assertThat(config.isMigrationRequiredFrom(2), is(false));
-
-        assertThat(config.isMigrationRequired(1, 2), is(false));
-        assertThat(config.isMigrationRequired(2, 3), is(false));
-    }
-
-    @Test
-    public void fallbackToDestructiveMigrationFrom_calledTwice_migrationsNotRequiredForValues() {
-        Context context = mock(Context.class);
-        TestDatabase db = Room.inMemoryDatabaseBuilder(context, TestDatabase.class)
-                .fallbackToDestructiveMigrationFrom(1, 2)
-                .fallbackToDestructiveMigrationFrom(3, 4)
-                .build();
-        DatabaseConfiguration config = ((BuilderTest_TestDatabase_Impl) db).mConfig;
-
-        assertThat(config.isMigrationRequiredFrom(1), is(false));
-        assertThat(config.isMigrationRequiredFrom(2), is(false));
-        assertThat(config.isMigrationRequiredFrom(3), is(false));
-        assertThat(config.isMigrationRequiredFrom(4), is(false));
-
-        assertThat(config.isMigrationRequired(1, 2), is(false));
-        assertThat(config.isMigrationRequired(2, 3), is(false));
-        assertThat(config.isMigrationRequired(3, 4), is(false));
-        assertThat(config.isMigrationRequired(4, 5), is(false));
-    }
-
-    @Test
-    public void isMigrationRequiredFrom_fallBackToDestructiveCalled_alwaysReturnsFalse() {
-        Context context = mock(Context.class);
-
-        TestDatabase db = Room.inMemoryDatabaseBuilder(context, TestDatabase.class)
-                .fallbackToDestructiveMigration()
-                .build();
-
-        DatabaseConfiguration config = ((BuilderTest_TestDatabase_Impl) db).mConfig;
-        assertThat(config.isMigrationRequiredFrom(0), is(false));
-        assertThat(config.isMigrationRequiredFrom(1), is(false));
-        assertThat(config.isMigrationRequiredFrom(5), is(false));
-        assertThat(config.isMigrationRequiredFrom(12), is(false));
-        assertThat(config.isMigrationRequiredFrom(132), is(false));
-
-        // Upgrades
-        assertThat(config.isMigrationRequired(0, 1), is(false));
-        assertThat(config.isMigrationRequired(1, 2), is(false));
-        assertThat(config.isMigrationRequired(5, 6), is(false));
-        assertThat(config.isMigrationRequired(7, 12), is(false));
-        assertThat(config.isMigrationRequired(132, 150), is(false));
-
-        // Downgrades
-        assertThat(config.isMigrationRequired(1, 0), is(false));
-        assertThat(config.isMigrationRequired(2, 1), is(false));
-        assertThat(config.isMigrationRequired(6, 5), is(false));
-        assertThat(config.isMigrationRequired(7, 12), is(false));
-        assertThat(config.isMigrationRequired(150, 132), is(false));
-    }
-
-    @Test
-    public void isMigrationRequired_destructiveMigrationOnDowngrade_returnTrueWhenUpgrading() {
-        Context context = mock(Context.class);
-
-        TestDatabase db = Room.inMemoryDatabaseBuilder(context, TestDatabase.class)
-                .fallbackToDestructiveMigrationOnDowngrade()
-                .build();
-
-        DatabaseConfiguration config = ((BuilderTest_TestDatabase_Impl) db).mConfig;
-
-        // isMigrationRequiredFrom doesn't know about downgrade only so it always returns true
-        assertThat(config.isMigrationRequiredFrom(0), is(true));
-        assertThat(config.isMigrationRequiredFrom(1), is(true));
-        assertThat(config.isMigrationRequiredFrom(5), is(true));
-        assertThat(config.isMigrationRequiredFrom(12), is(true));
-        assertThat(config.isMigrationRequiredFrom(132), is(true));
-
-        assertThat(config.isMigrationRequired(0, 1), is(true));
-        assertThat(config.isMigrationRequired(1, 2), is(true));
-        assertThat(config.isMigrationRequired(5, 6), is(true));
-        assertThat(config.isMigrationRequired(7, 12), is(true));
-        assertThat(config.isMigrationRequired(132, 150), is(true));
-    }
-
-    @Test
-    public void isMigrationRequired_destructiveMigrationOnDowngrade_returnFalseWhenDowngrading() {
-        Context context = mock(Context.class);
-
-        TestDatabase db = Room.inMemoryDatabaseBuilder(context, TestDatabase.class)
-                .fallbackToDestructiveMigrationOnDowngrade()
-                .build();
-
-        DatabaseConfiguration config = ((BuilderTest_TestDatabase_Impl) db).mConfig;
-
-        // isMigrationRequiredFrom doesn't know about downgrade only so it always returns true
-        assertThat(config.isMigrationRequiredFrom(0), is(true));
-        assertThat(config.isMigrationRequiredFrom(1), is(true));
-        assertThat(config.isMigrationRequiredFrom(5), is(true));
-        assertThat(config.isMigrationRequiredFrom(12), is(true));
-        assertThat(config.isMigrationRequiredFrom(132), is(true));
-
-        assertThat(config.isMigrationRequired(1, 0), is(false));
-        assertThat(config.isMigrationRequired(2, 1), is(false));
-        assertThat(config.isMigrationRequired(6 , 5), is(false));
-        assertThat(config.isMigrationRequired(12, 7), is(false));
-        assertThat(config.isMigrationRequired(150, 132), is(false));
-    }
-
-    @Test
-    public void isMigrationRequiredFrom_byDefault_alwaysReturnsTrue() {
-        Context context = mock(Context.class);
-
-        TestDatabase db = Room.inMemoryDatabaseBuilder(context, TestDatabase.class)
-                .build();
-
-        DatabaseConfiguration config = ((BuilderTest_TestDatabase_Impl) db).mConfig;
-        assertThat(config.isMigrationRequiredFrom(0), is(true));
-        assertThat(config.isMigrationRequiredFrom(1), is(true));
-        assertThat(config.isMigrationRequiredFrom(5), is(true));
-        assertThat(config.isMigrationRequiredFrom(12), is(true));
-        assertThat(config.isMigrationRequiredFrom(132), is(true));
-
-        // Upgrades
-        assertThat(config.isMigrationRequired(0, 1), is(true));
-        assertThat(config.isMigrationRequired(1, 2), is(true));
-        assertThat(config.isMigrationRequired(5, 6), is(true));
-        assertThat(config.isMigrationRequired(7, 12), is(true));
-        assertThat(config.isMigrationRequired(132, 150), is(true));
-
-        // Downgrades
-        assertThat(config.isMigrationRequired(1, 0), is(true));
-        assertThat(config.isMigrationRequired(2, 1), is(true));
-        assertThat(config.isMigrationRequired(6, 5), is(true));
-        assertThat(config.isMigrationRequired(7, 12), is(true));
-        assertThat(config.isMigrationRequired(150, 132), is(true));
-    }
-
-    @Test
-    public void isMigrationRequiredFrom_fallBackToDestFromCalled_falseForProvidedValues() {
-        Context context = mock(Context.class);
-
-        TestDatabase db = Room.inMemoryDatabaseBuilder(context, TestDatabase.class)
-                .fallbackToDestructiveMigrationFrom(1, 4, 81)
-                .build();
-
-        DatabaseConfiguration config = ((BuilderTest_TestDatabase_Impl) db).mConfig;
-        assertThat(config.isMigrationRequiredFrom(1), is(false));
-        assertThat(config.isMigrationRequiredFrom(4), is(false));
-        assertThat(config.isMigrationRequiredFrom(81), is(false));
-
-        assertThat(config.isMigrationRequired(1, 2), is(false));
-        assertThat(config.isMigrationRequired(4, 8), is(false));
-        assertThat(config.isMigrationRequired(81, 90), is(false));
-    }
-
-    @Test
-    public void isMigrationRequiredFrom_fallBackToDestFromCalled_trueForNonProvidedValues() {
-        Context context = mock(Context.class);
-
-        TestDatabase db = Room.inMemoryDatabaseBuilder(context, TestDatabase.class)
-                .fallbackToDestructiveMigrationFrom(1, 4, 81)
-                .build();
-
-        DatabaseConfiguration config = ((BuilderTest_TestDatabase_Impl) db).mConfig;
-        assertThat(config.isMigrationRequiredFrom(2), is(true));
-        assertThat(config.isMigrationRequiredFrom(3), is(true));
-        assertThat(config.isMigrationRequiredFrom(73), is(true));
-
-        assertThat(config.isMigrationRequired(2, 3), is(true));
-        assertThat(config.isMigrationRequired(3, 4), is(true));
-        assertThat(config.isMigrationRequired(73, 80), is(true));
-    }
-
-    @Test
-    public void autoMigrationShouldBeAddedToMigrations_WhenManualDowngradeMigrationIsPresent() {
-        Context context = mock(Context.class);
-
-        BuilderTest_TestDatabase_Impl db =
-                (BuilderTest_TestDatabase_Impl) Room.inMemoryDatabaseBuilder(context,
-                                TestDatabase.class)
-                        .addMigrations(new EmptyMigration(1, 0))
-                        .build();
-
-        DatabaseConfiguration config = db.mDatabaseConfiguration;
-
-        assertThat(config.migrationContainer.findMigrationPath(1, 2), is(db.mAutoMigrations));
-    }
-
-    @Test
-    public void fallbackToDestructiveMigrationOnDowngrade_withProvidedValues_falseForDowngrades() {
-        Context context = mock(Context.class);
-
-        TestDatabase db = Room.inMemoryDatabaseBuilder(context, TestDatabase.class)
-                .fallbackToDestructiveMigrationOnDowngrade()
-                .fallbackToDestructiveMigrationFrom(2, 4).build();
-
-        DatabaseConfiguration config = ((BuilderTest_TestDatabase_Impl) db).mConfig;
-
-        assertThat(config.isMigrationRequired(1, 2), is(true));
-        assertThat(config.isMigrationRequired(2, 3), is(false));
-        assertThat(config.isMigrationRequired(3, 4), is(true));
-        assertThat(config.isMigrationRequired(4, 5), is(false));
-        assertThat(config.isMigrationRequired(5, 6), is(true));
-
-        assertThat(config.isMigrationRequired(2, 1), is(false));
-        assertThat(config.isMigrationRequired(3, 2), is(false));
-        assertThat(config.isMigrationRequired(4, 3), is(false));
-        assertThat(config.isMigrationRequired(5, 4), is(false));
-        assertThat(config.isMigrationRequired(6, 5), is(false));
-    }
-
-    @Test
-    public void createBasic() {
-        Context context = mock(Context.class);
-        TestDatabase db = Room.inMemoryDatabaseBuilder(context, TestDatabase.class).build();
-        assertThat(db, instanceOf(BuilderTest_TestDatabase_Impl.class));
-        DatabaseConfiguration config = ((BuilderTest_TestDatabase_Impl) db).mConfig;
-        assertThat(config, notNullValue());
-        assertThat(config.context, is(context));
-        assertThat(config.name, is(nullValue()));
-        assertThat(config.allowMainThreadQueries, is(false));
-        assertThat(config.journalMode, is(RoomDatabase.JournalMode.TRUNCATE));
-        assertThat(config.sqliteOpenHelperFactory,
-                instanceOf(FrameworkSQLiteOpenHelperFactory.class));
-    }
-
-    @Test
-    public void createAllowMainThread() {
-        Context context = mock(Context.class);
-        TestDatabase db = Room.inMemoryDatabaseBuilder(context, TestDatabase.class)
-                .allowMainThreadQueries()
-                .build();
-        DatabaseConfiguration config = ((BuilderTest_TestDatabase_Impl) db).mConfig;
-        assertThat(config.allowMainThreadQueries, is(true));
-    }
-
-    @Test
-    public void createWriteAheadLogging() {
-        Context context = mock(Context.class);
-        TestDatabase db = Room.databaseBuilder(context, TestDatabase.class, "foo")
-                .setJournalMode(RoomDatabase.JournalMode.WRITE_AHEAD_LOGGING).build();
-        assertThat(db, instanceOf(BuilderTest_TestDatabase_Impl.class));
-        DatabaseConfiguration config = ((BuilderTest_TestDatabase_Impl) db).mConfig;
-        assertThat(config.journalMode, is(RoomDatabase.JournalMode.WRITE_AHEAD_LOGGING));
-    }
-
-    @Test
-    public void createWithFactoryAndVersion() {
-        Context context = mock(Context.class);
-        SupportSQLiteOpenHelper.Factory factory = mock(SupportSQLiteOpenHelper.Factory.class);
-
-        TestDatabase db = Room.inMemoryDatabaseBuilder(context, TestDatabase.class)
-                .openHelperFactory(factory)
-                .build();
-        assertThat(db, instanceOf(BuilderTest_TestDatabase_Impl.class));
-        DatabaseConfiguration config = ((BuilderTest_TestDatabase_Impl) db).mConfig;
-        assertThat(config, notNullValue());
-        assertThat(config.sqliteOpenHelperFactory, is(factory));
-    }
-
-    @Test
-    public void createFromAssetAndFromFile() {
-        Exception exception = null;
-        try {
-            Room.databaseBuilder(mock(Context.class), TestDatabase.class, "foo")
-                    .createFromAsset("assets-path")
-                    .createFromFile(new File("not-a--real-file"))
-                    .build();
-            fail("Build should have thrown");
-        } catch (Exception e) {
-            exception = e;
-        }
-        assertThat(exception, instanceOf(IllegalArgumentException.class));
-        assertThat(exception.getMessage(),
-                containsString(
-                        "More than one of createFromAsset(), createFromInputStream(), and "
-                                + "createFromFile() were called on this Builder"));
-    }
-
-    @Test
-    public void createInMemoryFromAsset() {
-        Exception exception = null;
-        try {
-            Room.inMemoryDatabaseBuilder(mock(Context.class), TestDatabase.class)
-                    .createFromAsset("assets-path")
-                    .build();
-            fail("Build should have thrown");
-        } catch (Exception e) {
-            exception = e;
-        }
-        assertThat(exception, instanceOf(IllegalArgumentException.class));
-        assertThat(exception.getMessage(),
-                containsString("Cannot create from asset or file for an in-memory"));
-    }
-
-    @Test
-    public void createInMemoryFromFile() {
-        Exception exception = null;
-        try {
-            Room.inMemoryDatabaseBuilder(mock(Context.class), TestDatabase.class)
-                    .createFromFile(new File("not-a--real-file"))
-                    .build();
-            fail("Build should have thrown");
-        } catch (Exception e) {
-            exception = e;
-        }
-        assertThat(exception, instanceOf(IllegalArgumentException.class));
-        assertThat(exception.getMessage(),
-                containsString("Cannot create from asset or file for an in-memory"));
-    }
-
-    abstract static class TestDatabase extends RoomDatabase {
-
-        DatabaseConfiguration mDatabaseConfiguration;
-
-        @Override
-        public void init(@NonNull DatabaseConfiguration configuration) {
-            super.init(configuration);
-            mDatabaseConfiguration = configuration;
-        }
-    }
-
-    static class EmptyMigration extends Migration {
-        EmptyMigration(int start, int end) {
-            super(start, end);
-        }
-
-        @Override
-        public void migrate(@NonNull SupportSQLiteDatabase database) {
-        }
-    }
-
-}
diff --git a/room/room-runtime/src/test/java/androidx/room/BuilderTest.kt b/room/room-runtime/src/test/java/androidx/room/BuilderTest.kt
new file mode 100644
index 0000000..cd2f9f1
--- /dev/null
+++ b/room/room-runtime/src/test/java/androidx/room/BuilderTest.kt
@@ -0,0 +1,458 @@
+/*
+ * Copyright (C) 2016 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 androidx.room
+
+import android.content.Context
+import androidx.room.Room.databaseBuilder
+import androidx.room.Room.inMemoryDatabaseBuilder
+import androidx.room.migration.Migration
+import androidx.sqlite.db.SupportSQLiteDatabase
+import androidx.sqlite.db.SupportSQLiteOpenHelper
+import androidx.sqlite.db.framework.FrameworkSQLiteOpenHelperFactory
+import com.google.common.truth.Truth.assertThat
+import java.io.File
+import java.util.concurrent.Executor
+import org.junit.Assert
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import org.mockito.kotlin.mock
+
+@RunWith(JUnit4::class)
+class BuilderTest {
+    @Test
+    fun nullName() {
+        try {
+            databaseBuilder(
+                mock(), RoomDatabase::class.java, null
+            ).build()
+        } catch (e: IllegalArgumentException) {
+            assertThat(e.message).isEqualTo(
+                "Cannot build a database with null or empty name. If you are trying to create an " +
+                    "in memory database, use Room.inMemoryDatabaseBuilder"
+            )
+        }
+    }
+
+    @Test
+    fun emptyName() {
+        try {
+            databaseBuilder(
+                mock(), RoomDatabase::class.java, "  "
+            ).build()
+        } catch (e: IllegalArgumentException) {
+            assertThat(e.message).isEqualTo(
+                "Cannot build a database with null or empty name. If you are trying to create an " +
+                    "in memory database, use Room.inMemoryDatabaseBuilder"
+            )
+        }
+    }
+
+    @Test
+    fun executors_setQueryExecutor() {
+        val executor: Executor = mock()
+        val db = databaseBuilder(
+            mock(), TestDatabase::class.java, "foo"
+        ).setQueryExecutor(executor).build()
+
+        assertThat(db.mDatabaseConfiguration.queryExecutor).isEqualTo(executor)
+        assertThat(db.mDatabaseConfiguration.transactionExecutor).isEqualTo(executor)
+    }
+
+    @Test
+    fun executors_setTransactionExecutor() {
+        val executor: Executor = mock()
+        val db = databaseBuilder(
+            mock(), TestDatabase::class.java, "foo"
+        ).setTransactionExecutor(executor).build()
+
+        assertThat(db.mDatabaseConfiguration.queryExecutor).isEqualTo(executor)
+        assertThat(db.mDatabaseConfiguration.transactionExecutor).isEqualTo(executor)
+    }
+
+    @Test
+    fun executors_setBothExecutors() {
+        val executor1: Executor = mock()
+        val executor2: Executor = mock()
+        val db = databaseBuilder(
+            mock(), TestDatabase::class.java, "foo"
+        ).setQueryExecutor(executor1).setTransactionExecutor(executor2).build()
+
+        assertThat(db.mDatabaseConfiguration.queryExecutor).isEqualTo(executor1)
+        assertThat(db.mDatabaseConfiguration.transactionExecutor).isEqualTo(executor2)
+    }
+
+    @Test
+    fun migration() {
+        val m1: Migration = EmptyMigration(0, 1)
+        val m2: Migration = EmptyMigration(1, 2)
+        val db = databaseBuilder(
+            mock(), TestDatabase::class.java, "foo"
+        ).addMigrations(m1, m2).build()
+
+        val config: DatabaseConfiguration = (db as BuilderTest_TestDatabase_Impl).mConfig
+        val migrations = config.migrationContainer
+
+        assertThat(migrations.findMigrationPath(0, 1)).containsExactlyElementsIn(listOf(m1))
+        assertThat(migrations.findMigrationPath(1, 2)).containsExactlyElementsIn(listOf(m2))
+        assertThat(migrations.findMigrationPath(0, 2))
+            .containsExactlyElementsIn(listOf(m1, m2))
+        assertThat(migrations.findMigrationPath(2, 0)).isNull()
+        assertThat(migrations.findMigrationPath(0, 3)).isNull()
+    }
+
+    @Test
+    fun migrationOverride() {
+        val m1: Migration = EmptyMigration(0, 1)
+        val m2: Migration = EmptyMigration(1, 2)
+        val m3: Migration = EmptyMigration(0, 1)
+        val db = databaseBuilder(
+            mock(), TestDatabase::class.java, "foo"
+        ).addMigrations(m1, m2, m3).build()
+
+        val config: DatabaseConfiguration = (db as BuilderTest_TestDatabase_Impl).mConfig
+        val migrations = config.migrationContainer
+
+        assertThat(migrations.findMigrationPath(0, 1)).containsExactlyElementsIn(listOf(m3))
+        assertThat(migrations.findMigrationPath(1, 2)).containsExactlyElementsIn(listOf(m2))
+        assertThat(migrations.findMigrationPath(0, 3)).isNull()
+    }
+
+    @Test
+    fun migrationJump() {
+        val m1: Migration = EmptyMigration(0, 1)
+        val m2: Migration = EmptyMigration(1, 2)
+        val m3: Migration = EmptyMigration(2, 3)
+        val m4: Migration = EmptyMigration(0, 3)
+        val db = databaseBuilder(
+            mock(), TestDatabase::class.java, "foo"
+        ).addMigrations(m1, m2, m3, m4).build()
+
+        val config: DatabaseConfiguration = (db as BuilderTest_TestDatabase_Impl).mConfig
+        val migrations = config.migrationContainer
+
+        assertThat(migrations.findMigrationPath(0, 3)).containsExactlyElementsIn(listOf(m4))
+        assertThat(migrations.findMigrationPath(1, 3))
+            .containsExactlyElementsIn(listOf(m2, m3))
+    }
+
+    @Test
+    fun migrationDowngrade() {
+        val m1_2: Migration = EmptyMigration(1, 2)
+        val m2_3: Migration = EmptyMigration(2, 3)
+        val m3_4: Migration = EmptyMigration(3, 4)
+        val m3_2: Migration = EmptyMigration(3, 2)
+        val m2_1: Migration = EmptyMigration(2, 1)
+        val db = databaseBuilder(
+            mock(), TestDatabase::class.java, "foo"
+        )
+            .addMigrations(m1_2, m2_3, m3_4, m3_2, m2_1).build()
+        val config: DatabaseConfiguration = (db as BuilderTest_TestDatabase_Impl).mConfig
+        val migrations = config.migrationContainer
+        assertThat(migrations.findMigrationPath(3, 2))
+            .containsExactlyElementsIn(listOf(m3_2))
+        assertThat(migrations.findMigrationPath(3, 1))
+            .containsExactlyElementsIn(listOf(m3_2, m2_1))
+    }
+
+    @Test
+    fun skipMigration() {
+        val context: Context = mock()
+        val db = inMemoryDatabaseBuilder(context, TestDatabase::class.java)
+            .fallbackToDestructiveMigration()
+            .build()
+        val config: DatabaseConfiguration = (db as BuilderTest_TestDatabase_Impl).mConfig
+        assertThat(config.requireMigration).isFalse()
+    }
+
+    @Test
+    fun fallbackToDestructiveMigrationFrom_calledOnce_migrationsNotRequiredForValues() {
+        val context: Context = mock()
+        val db = inMemoryDatabaseBuilder(context, TestDatabase::class.java)
+            .fallbackToDestructiveMigrationFrom(1, 2).build()
+        val config: DatabaseConfiguration = (db as BuilderTest_TestDatabase_Impl).mConfig
+        assertThat(config.isMigrationRequired(1, 2)).isFalse()
+        assertThat(config.isMigrationRequired(2, 3)).isFalse()
+    }
+
+    @Test
+    fun fallbackToDestructiveMigrationFrom_calledTwice_migrationsNotRequiredForValues() {
+        val context: Context = mock()
+        val db = inMemoryDatabaseBuilder(context, TestDatabase::class.java)
+            .fallbackToDestructiveMigrationFrom(1, 2)
+            .fallbackToDestructiveMigrationFrom(3, 4)
+            .build()
+        val config: DatabaseConfiguration = (db as BuilderTest_TestDatabase_Impl).mConfig
+        assertThat(config.isMigrationRequired(1, 2)).isFalse()
+        assertThat(config.isMigrationRequired(2, 3)).isFalse()
+        assertThat(config.isMigrationRequired(3, 4)).isFalse()
+        assertThat(config.isMigrationRequired(4, 5)).isFalse()
+    }
+
+    @Test
+    fun isMigrationRequiredFrom_fallBackToDestructiveCalled_alwaysReturnsFalse() {
+        val context: Context = mock()
+        val db = inMemoryDatabaseBuilder(context, TestDatabase::class.java)
+            .fallbackToDestructiveMigration()
+            .build()
+        val config: DatabaseConfiguration = (db as BuilderTest_TestDatabase_Impl).mConfig
+
+        assertThat(config.isMigrationRequired(0, 1)).isFalse()
+        assertThat(config.isMigrationRequired(1, 2)).isFalse()
+        assertThat(config.isMigrationRequired(5, 6)).isFalse()
+        assertThat(config.isMigrationRequired(7, 12)).isFalse()
+        assertThat(config.isMigrationRequired(132, 150)).isFalse()
+
+        assertThat(config.isMigrationRequired(1, 0)).isFalse()
+        assertThat(config.isMigrationRequired(2, 1)).isFalse()
+        assertThat(config.isMigrationRequired(6, 5)).isFalse()
+        assertThat(config.isMigrationRequired(7, 12)).isFalse()
+        assertThat(config.isMigrationRequired(150, 132)).isFalse()
+    }
+
+    // isMigrationRequiredFrom doesn't know about downgrade only so it always returns true
+    @Test
+    fun isMigrationRequired_destructiveMigrationOnDowngrade_returnTrueWhenUpgrading() {
+        val context: Context = mock()
+        val db = inMemoryDatabaseBuilder(context, TestDatabase::class.java)
+            .fallbackToDestructiveMigrationOnDowngrade()
+            .build()
+        val config: DatabaseConfiguration = (db as BuilderTest_TestDatabase_Impl).mConfig
+
+        // isMigrationRequiredFrom doesn't know about downgrade only so it always returns true
+        assertThat(config.isMigrationRequired(0, 1)).isTrue()
+        assertThat(config.isMigrationRequired(1, 2)).isTrue()
+        assertThat(config.isMigrationRequired(5, 6)).isTrue()
+        assertThat(config.isMigrationRequired(7, 12)).isTrue()
+        assertThat(config.isMigrationRequired(132, 150)).isTrue()
+    }
+
+    // isMigrationRequiredFrom doesn't know about downgrade only so it always returns true
+    @Test
+    fun isMigrationRequired_destructiveMigrationOnDowngrade_returnFalseWhenDowngrading() {
+        val context: Context = mock()
+        val db = inMemoryDatabaseBuilder(context, TestDatabase::class.java)
+            .fallbackToDestructiveMigrationOnDowngrade()
+            .build()
+        val config: DatabaseConfiguration = (db as BuilderTest_TestDatabase_Impl).mConfig
+
+        // isMigrationRequiredFrom doesn't know about downgrade only so it always returns true
+        assertThat(config.isMigrationRequired(1, 0)).isFalse()
+        assertThat(config.isMigrationRequired(2, 1)).isFalse()
+        assertThat(config.isMigrationRequired(6, 5)).isFalse()
+        assertThat(config.isMigrationRequired(12, 7)).isFalse()
+        assertThat(config.isMigrationRequired(150, 132)).isFalse()
+    }
+
+    @Test
+    fun isMigrationRequiredFrom_byDefault_alwaysReturnsTrue() {
+        val context: Context = mock()
+        val db = inMemoryDatabaseBuilder(context, TestDatabase::class.java)
+            .build()
+        val config: DatabaseConfiguration = (db as BuilderTest_TestDatabase_Impl).mConfig
+
+        assertThat(config.isMigrationRequired(0, 1)).isTrue()
+        assertThat(config.isMigrationRequired(1, 2)).isTrue()
+        assertThat(config.isMigrationRequired(5, 6)).isTrue()
+        assertThat(config.isMigrationRequired(7, 12)).isTrue()
+        assertThat(config.isMigrationRequired(132, 150)).isTrue()
+
+        assertThat(config.isMigrationRequired(1, 0)).isTrue()
+        assertThat(config.isMigrationRequired(2, 1)).isTrue()
+        assertThat(config.isMigrationRequired(6, 5)).isTrue()
+        assertThat(config.isMigrationRequired(7, 12)).isTrue()
+        assertThat(config.isMigrationRequired(150, 132)).isTrue()
+    }
+
+    @Test
+    fun isMigrationRequiredFrom_fallBackToDestFromCalled_falseForProvidedValues() {
+        val context: Context = mock()
+        val db = inMemoryDatabaseBuilder(context, TestDatabase::class.java)
+            .fallbackToDestructiveMigrationFrom(1, 4, 81)
+            .build()
+        val config: DatabaseConfiguration = (db as BuilderTest_TestDatabase_Impl).mConfig
+        assertThat(config.isMigrationRequired(1, 2)).isFalse()
+        assertThat(config.isMigrationRequired(4, 8)).isFalse()
+        assertThat(config.isMigrationRequired(81, 90)).isFalse()
+    }
+
+    @Test
+    fun isMigrationRequiredFrom_fallBackToDestFromCalled_trueForNonProvidedValues() {
+        val context: Context = mock()
+        val db = inMemoryDatabaseBuilder(context, TestDatabase::class.java)
+            .fallbackToDestructiveMigrationFrom(1, 4, 81)
+            .build()
+        val config: DatabaseConfiguration = (db as BuilderTest_TestDatabase_Impl).mConfig
+        assertThat(config.isMigrationRequired(2, 3)).isTrue()
+        assertThat(config.isMigrationRequired(3, 4)).isTrue()
+        assertThat(config.isMigrationRequired(73, 80)).isTrue()
+    }
+
+    @Test
+    fun autoMigrationShouldBeAddedToMigrations_WhenManualDowngradeMigrationIsPresent() {
+        val context: Context = mock()
+        val db = inMemoryDatabaseBuilder(
+            context,
+            TestDatabase::class.java
+        )
+            .addMigrations(EmptyMigration(1, 0))
+            .build() as BuilderTest_TestDatabase_Impl
+        val config: DatabaseConfiguration = db.mDatabaseConfiguration
+        assertThat(
+            config.migrationContainer.findMigrationPath(1, 2)).isEqualTo((db.mAutoMigrations)
+        )
+    }
+
+    @Test
+    fun fallbackToDestructiveMigrationOnDowngrade_withProvidedValues_falseForDowngrades() {
+        val context: Context = mock()
+        val db = inMemoryDatabaseBuilder(context, TestDatabase::class.java)
+            .fallbackToDestructiveMigrationOnDowngrade()
+            .fallbackToDestructiveMigrationFrom(2, 4).build()
+        val config: DatabaseConfiguration = (db as BuilderTest_TestDatabase_Impl).mConfig
+        assertThat(config.isMigrationRequired(1, 2)).isTrue()
+        assertThat(config.isMigrationRequired(2, 3)).isFalse()
+        assertThat(config.isMigrationRequired(3, 4)).isTrue()
+        assertThat(config.isMigrationRequired(4, 5)).isFalse()
+        assertThat(config.isMigrationRequired(5, 6)).isTrue()
+        assertThat(config.isMigrationRequired(2, 1)).isFalse()
+        assertThat(config.isMigrationRequired(3, 2)).isFalse()
+        assertThat(config.isMigrationRequired(4, 3)).isFalse()
+        assertThat(config.isMigrationRequired(5, 4)).isFalse()
+        assertThat(config.isMigrationRequired(6, 5)).isFalse()
+    }
+
+    @Test
+    fun createBasic() {
+        val context: Context = mock()
+        val db = inMemoryDatabaseBuilder(context, TestDatabase::class.java).build()
+        assertThat(db).isInstanceOf(BuilderTest_TestDatabase_Impl::class.java)
+        val config: DatabaseConfiguration = (db as BuilderTest_TestDatabase_Impl).mConfig
+        assertThat(config).isNotNull()
+        assertThat(config.context).isEqualTo(context)
+        assertThat(config.name).isNull()
+        assertThat(config.allowMainThreadQueries).isFalse()
+        assertThat(config.journalMode).isEqualTo(RoomDatabase.JournalMode.TRUNCATE)
+        assertThat(config.sqliteOpenHelperFactory)
+            .isInstanceOf(FrameworkSQLiteOpenHelperFactory::class.java)
+    }
+
+    @Test
+    fun createAllowMainThread() {
+        val context: Context = mock()
+        val db = inMemoryDatabaseBuilder(context, TestDatabase::class.java)
+            .allowMainThreadQueries()
+            .build()
+        val config: DatabaseConfiguration = (db as BuilderTest_TestDatabase_Impl).mConfig
+        assertThat(config.allowMainThreadQueries).isTrue()
+    }
+
+    @Test
+    fun createWriteAheadLogging() {
+        val context: Context = mock()
+        val db = databaseBuilder(context, TestDatabase::class.java, "foo")
+            .setJournalMode(RoomDatabase.JournalMode.WRITE_AHEAD_LOGGING).build()
+        assertThat(db).isInstanceOf(BuilderTest_TestDatabase_Impl::class.java)
+        val config: DatabaseConfiguration = (db as BuilderTest_TestDatabase_Impl).mConfig
+        assertThat(config.journalMode).isEqualTo(RoomDatabase.JournalMode.WRITE_AHEAD_LOGGING)
+    }
+
+    @Test
+    fun createWithFactoryAndVersion() {
+        val context: Context = mock()
+        val factory: SupportSQLiteOpenHelper.Factory = mock()
+        val db = inMemoryDatabaseBuilder(context, TestDatabase::class.java)
+            .openHelperFactory(factory)
+            .build()
+        assertThat(db).isInstanceOf(BuilderTest_TestDatabase_Impl::class.java)
+        val config: DatabaseConfiguration = (db as BuilderTest_TestDatabase_Impl).mConfig
+        assertThat(config).isNotNull()
+        assertThat(config.sqliteOpenHelperFactory).isEqualTo(factory)
+    }
+
+    @Test
+    fun createFromAssetAndFromFile() {
+        var exception: Exception? = null
+        try {
+            databaseBuilder(
+                mock(),
+                TestDatabase::class.java,
+                "foo"
+            )
+                .createFromAsset("assets-path")
+                .createFromFile(File("not-a--real-file"))
+                .build()
+            Assert.fail("Build should have thrown")
+        } catch (e: Exception) {
+            exception = e
+        }
+        assertThat(exception).isInstanceOf(IllegalArgumentException::class.java)
+        assertThat(exception).hasMessageThat().contains("More than one of createFromAsset(), " +
+            "createFromInputStream(), and createFromFile() were called on this Builder")
+    }
+
+    @Test
+    fun createInMemoryFromAsset() {
+        var exception: Exception? = null
+        try {
+            inMemoryDatabaseBuilder(
+                mock(),
+                TestDatabase::class.java
+            )
+                .createFromAsset("assets-path")
+                .build()
+            Assert.fail("Build should have thrown")
+        } catch (e: Exception) {
+            exception = e
+        }
+        assertThat(exception).isInstanceOf(IllegalArgumentException::class.java)
+        assertThat(exception).hasMessageThat().contains(
+            "Cannot create from asset or file for an in-memory"
+        )
+    }
+
+    @Test
+    fun createInMemoryFromFile() {
+        var exception: Exception? = null
+        try {
+            inMemoryDatabaseBuilder(
+                mock(),
+                TestDatabase::class.java
+            )
+                .createFromFile(File("not-a--real-file"))
+                .build()
+            Assert.fail("Build should have thrown")
+        } catch (e: Exception) {
+            exception = e
+        }
+        assertThat(exception).isInstanceOf(IllegalArgumentException::class.java)
+        assertThat(exception).hasMessageThat().contains(
+            "Cannot create from asset or file for an in-memory"
+        )
+    }
+
+    internal abstract class TestDatabase : RoomDatabase() {
+        lateinit var mDatabaseConfiguration: DatabaseConfiguration
+        override fun init(configuration: DatabaseConfiguration) {
+            super.init(configuration)
+            mDatabaseConfiguration = configuration
+        }
+    }
+
+    internal class EmptyMigration(start: Int, end: Int) : Migration(start, end) {
+        override fun migrate(database: SupportSQLiteDatabase) {}
+    }
+}
diff --git a/room/room-runtime/src/test/java/androidx/room/BuilderTest_TestDatabase_Impl.java b/room/room-runtime/src/test/java/androidx/room/BuilderTest_TestDatabase_Impl.java
deleted file mode 100644
index f475782..0000000
--- a/room/room-runtime/src/test/java/androidx/room/BuilderTest_TestDatabase_Impl.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (C) 2017 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 androidx.room;
-
-import androidx.annotation.NonNull;
-import androidx.room.migration.AutoMigrationSpec;
-import androidx.room.migration.Migration;
-import androidx.sqlite.db.SupportSQLiteOpenHelper;
-
-import org.mockito.Mockito;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
-public class BuilderTest_TestDatabase_Impl extends BuilderTest.TestDatabase {
-    DatabaseConfiguration mConfig;
-    List<Migration> mAutoMigrations = Arrays.asList(new BuilderTest.EmptyMigration(1, 2));
-
-    @Override
-    public void init(DatabaseConfiguration configuration) {
-        super.init(configuration);
-        mConfig = configuration;
-    }
-
-    @Override
-    protected SupportSQLiteOpenHelper createOpenHelper(DatabaseConfiguration config) {
-        return Mockito.mock(SupportSQLiteOpenHelper.class);
-    }
-
-    @Override
-    protected InvalidationTracker createInvalidationTracker() {
-        return Mockito.mock(InvalidationTracker.class);
-    }
-
-    @Override
-    public void clearAllTables() {
-    }
-
-    @NonNull
-    @Override
-    public List<Migration> getAutoMigrations(
-            @NonNull Map<Class<? extends AutoMigrationSpec>, AutoMigrationSpec> autoMigrationSpecs
-    ) {
-        return mAutoMigrations;
-    }
-}
\ No newline at end of file
diff --git a/room/room-runtime/src/test/java/androidx/room/BuilderTest_TestDatabase_Impl.kt b/room/room-runtime/src/test/java/androidx/room/BuilderTest_TestDatabase_Impl.kt
new file mode 100644
index 0000000..482b0fa
--- /dev/null
+++ b/room/room-runtime/src/test/java/androidx/room/BuilderTest_TestDatabase_Impl.kt
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2017 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 androidx.room
+
+import androidx.room.migration.AutoMigrationSpec
+import androidx.room.migration.Migration
+import androidx.sqlite.db.SupportSQLiteOpenHelper
+import org.mockito.kotlin.mock
+
+internal class BuilderTest_TestDatabase_Impl : BuilderTest.TestDatabase() {
+    lateinit var mConfig: DatabaseConfiguration
+    var mAutoMigrations = listOf<Migration>(BuilderTest.EmptyMigration(1, 2))
+    override fun init(configuration: DatabaseConfiguration) {
+        super.init(configuration)
+        mConfig = configuration
+    }
+
+    override fun createOpenHelper(config: DatabaseConfiguration): SupportSQLiteOpenHelper {
+        return mock()
+    }
+
+    override fun createInvalidationTracker(): InvalidationTracker {
+        return mock()
+    }
+
+    override fun clearAllTables() {}
+    override fun getAutoMigrations(
+        autoMigrationSpecs: Map<Class<out AutoMigrationSpec>, AutoMigrationSpec>
+    ): List<Migration> {
+        return mAutoMigrations
+    }
+}
\ No newline at end of file
diff --git a/room/room-runtime/src/test/java/androidx/room/ObservedTableTrackerTest.java b/room/room-runtime/src/test/java/androidx/room/ObservedTableTrackerTest.java
deleted file mode 100644
index 2106fdb..0000000
--- a/room/room-runtime/src/test/java/androidx/room/ObservedTableTrackerTest.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Copyright (C) 2017 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 androidx.room;
-
-
-import static androidx.room.InvalidationTracker.ObservedTableTracker.ADD;
-import static androidx.room.InvalidationTracker.ObservedTableTracker.NO_OP;
-import static androidx.room.InvalidationTracker.ObservedTableTracker.REMOVE;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.nullValue;
-import static org.hamcrest.MatcherAssert.assertThat;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-import java.util.Arrays;
-
-@RunWith(JUnit4.class)
-public class ObservedTableTrackerTest {
-    private static final int TABLE_COUNT = 5;
-    private InvalidationTracker.ObservedTableTracker mTracker;
-
-    @Before
-    public void setup() {
-        mTracker = new InvalidationTracker.ObservedTableTracker(TABLE_COUNT);
-    }
-
-    @Test
-    public void basicAdd() {
-        mTracker.onAdded(2, 3);
-        assertThat(mTracker.getTablesToSync(), is(createResponse(2, ADD, 3, ADD)));
-    }
-
-    @Test
-    public void basicRemove() {
-        initState(2, 3);
-        mTracker.onRemoved(3);
-        assertThat(mTracker.getTablesToSync(), is(createResponse(3, REMOVE)));
-    }
-
-    @Test
-    public void noChange() {
-        initState(1, 3);
-        mTracker.onAdded(3);
-        assertThat(mTracker.getTablesToSync(), is(nullValue()));
-    }
-
-    @Test
-    public void multipleAdditionsDeletions() {
-        initState(2, 4);
-        mTracker.onAdded(2);
-        assertThat(mTracker.getTablesToSync(), is(nullValue()));
-        mTracker.onAdded(2, 4);
-        assertThat(mTracker.getTablesToSync(), is(nullValue()));
-        mTracker.onRemoved(2);
-        assertThat(mTracker.getTablesToSync(), is(nullValue()));
-        mTracker.onRemoved(2, 4);
-        assertThat(mTracker.getTablesToSync(), is(nullValue()));
-        mTracker.onAdded(1, 3);
-        mTracker.onRemoved(2, 4);
-        assertThat(mTracker.getTablesToSync(), is(
-                createResponse(1, ADD, 2, REMOVE, 3, ADD, 4, REMOVE)));
-    }
-
-    private void initState(int... tableIds) {
-        mTracker.onAdded(tableIds);
-        mTracker.getTablesToSync();
-    }
-
-    private static int[] createResponse(int... tuples) {
-        int[] result = new int[TABLE_COUNT];
-        Arrays.fill(result, NO_OP);
-        for (int i = 0; i < tuples.length; i += 2) {
-            result[tuples[i]] = tuples[i + 1];
-        }
-        return result;
-    }
-}
diff --git a/room/room-runtime/src/test/java/androidx/room/ObservedTableTrackerTest.kt b/room/room-runtime/src/test/java/androidx/room/ObservedTableTrackerTest.kt
new file mode 100644
index 0000000..10ac217
--- /dev/null
+++ b/room/room-runtime/src/test/java/androidx/room/ObservedTableTrackerTest.kt
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2017 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 androidx.room
+
+import com.google.common.truth.Truth.assertThat
+import java.util.Arrays
+import kotlin.test.assertNull
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+
+@RunWith(JUnit4::class)
+class ObservedTableTrackerTest {
+    private lateinit var mTracker: InvalidationTracker.ObservedTableTracker
+    @Before
+    fun setup() {
+        mTracker = InvalidationTracker.ObservedTableTracker(TABLE_COUNT)
+    }
+
+    @Test
+    fun basicAdd() {
+        mTracker.onAdded(2, 3)
+        assertThat(
+            mTracker.getTablesToSync()
+        ).isEqualTo(
+            createResponse(
+                2,
+                InvalidationTracker.ObservedTableTracker.ADD,
+                3,
+                InvalidationTracker.ObservedTableTracker.ADD
+            )
+        )
+    }
+
+    @Test
+    fun basicRemove() {
+        initState(2, 3)
+        mTracker.onRemoved(3)
+        assertThat(
+            mTracker.getTablesToSync()
+        ).isEqualTo(
+            createResponse(3, InvalidationTracker.ObservedTableTracker.REMOVE)
+        )
+    }
+
+    @Test
+    fun noChange() {
+        initState(1, 3)
+        mTracker.onAdded(3)
+        assertNull(
+            mTracker.getTablesToSync()
+        )
+    }
+
+    @Test
+    fun multipleAdditionsDeletions() {
+        initState(2, 4)
+        mTracker.onAdded(2)
+        assertNull(
+            mTracker.getTablesToSync()
+        )
+        mTracker.onAdded(2, 4)
+        assertNull(
+            mTracker.getTablesToSync()
+        )
+        mTracker.onRemoved(2)
+        assertNull(
+            mTracker.getTablesToSync()
+        )
+        mTracker.onRemoved(2, 4)
+        assertNull(
+            mTracker.getTablesToSync()
+        )
+        mTracker.onAdded(1, 3)
+        mTracker.onRemoved(2, 4)
+        assertThat(
+            mTracker.getTablesToSync()
+        ).isEqualTo(
+            createResponse(
+                1,
+                InvalidationTracker.ObservedTableTracker.ADD,
+                2,
+                InvalidationTracker.ObservedTableTracker.REMOVE,
+                3,
+                InvalidationTracker.ObservedTableTracker.ADD,
+                4,
+                InvalidationTracker.ObservedTableTracker.REMOVE
+            )
+        )
+    }
+
+    private fun initState(vararg tableIds: Int) {
+        mTracker.onAdded(*tableIds)
+        mTracker.getTablesToSync()
+    }
+
+    companion object {
+        private const val TABLE_COUNT = 5
+        private fun createResponse(vararg tuples: Int): IntArray {
+            val result = IntArray(TABLE_COUNT)
+            Arrays.fill(result, InvalidationTracker.ObservedTableTracker.NO_OP)
+            var i = 0
+            while (i < tuples.size) {
+                result[tuples[i]] = tuples[i + 1]
+                i += 2
+            }
+            return result
+        }
+    }
+}
\ No newline at end of file
diff --git a/room/room-runtime/src/test/java/androidx/room/RoomSQLiteQueryTest.java b/room/room-runtime/src/test/java/androidx/room/RoomSQLiteQueryTest.java
deleted file mode 100644
index 0738a49..0000000
--- a/room/room-runtime/src/test/java/androidx/room/RoomSQLiteQueryTest.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Copyright (C) 2017 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 androidx.room;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.not;
-import static org.hamcrest.CoreMatchers.sameInstance;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-
-import androidx.sqlite.db.SupportSQLiteProgram;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-@RunWith(JUnit4.class)
-public class RoomSQLiteQueryTest {
-    @Before
-    public void clear() {
-        RoomSQLiteQuery.queryPool.clear();
-    }
-
-    @Test
-    public void acquireBasic() {
-        RoomSQLiteQuery query = RoomSQLiteQuery.acquire("abc", 3);
-        assertThat(query.getSql(), is("abc"));
-        assertThat(query.getArgCount(), is(3));
-        assertThat(query.blobBindings.length, is(4));
-        assertThat(query.longBindings.length, is(4));
-        assertThat(query.stringBindings.length, is(4));
-        assertThat(query.doubleBindings.length, is(4));
-    }
-
-    @Test
-    public void acquireSameSizeAgain() {
-        RoomSQLiteQuery query = RoomSQLiteQuery.acquire("abc", 3);
-        query.release();
-        assertThat(RoomSQLiteQuery.acquire("blah", 3), sameInstance(query));
-    }
-
-    @Test
-    public void acquireSameSizeWithoutRelease() {
-        RoomSQLiteQuery query = RoomSQLiteQuery.acquire("abc", 3);
-        assertThat(RoomSQLiteQuery.acquire("fda", 3), not(sameInstance(query)));
-    }
-
-    @Test
-    public void bindings() {
-        RoomSQLiteQuery query = RoomSQLiteQuery.acquire("abc", 6);
-        byte[] myBlob = new byte[3];
-        long myLong = 3L;
-        double myDouble = 7.0;
-        String myString = "ss";
-        query.bindBlob(1, myBlob);
-        query.bindLong(2, myLong);
-        query.bindNull(3);
-        query.bindDouble(4, myDouble);
-        query.bindString(5, myString);
-        query.bindNull(6);
-        SupportSQLiteProgram program = mock(SupportSQLiteProgram.class);
-        query.bindTo(program);
-
-        verify(program).bindBlob(1, myBlob);
-        verify(program).bindLong(2, myLong);
-        verify(program).bindNull(3);
-        verify(program).bindDouble(4, myDouble);
-        verify(program).bindString(5, myString);
-        verify(program).bindNull(6);
-    }
-
-    @Test
-    public void dontKeepSameSizeTwice() {
-        RoomSQLiteQuery query1 = RoomSQLiteQuery.acquire("abc", 3);
-        RoomSQLiteQuery query2 = RoomSQLiteQuery.acquire("zx", 3);
-        RoomSQLiteQuery query3 = RoomSQLiteQuery.acquire("qw", 0);
-
-        query1.release();
-        query2.release();
-        assertThat(RoomSQLiteQuery.queryPool.size(), is(1));
-
-        query3.release();
-        assertThat(RoomSQLiteQuery.queryPool.size(), is(2));
-    }
-
-    @Test
-    public void returnExistingForSmallerSize() {
-        RoomSQLiteQuery query = RoomSQLiteQuery.acquire("abc", 3);
-        query.release();
-        assertThat(RoomSQLiteQuery.acquire("dsa", 2), sameInstance(query));
-    }
-
-    @Test
-    public void returnNewForBigger() {
-        RoomSQLiteQuery query = RoomSQLiteQuery.acquire("abc", 3);
-        query.release();
-        assertThat(RoomSQLiteQuery.acquire("dsa", 4), not(sameInstance(query)));
-    }
-
-    @Test
-    public void pruneCache() {
-        for (int i = 0; i < RoomSQLiteQuery.POOL_LIMIT; i++) {
-            RoomSQLiteQuery.acquire("dsdsa", i).release();
-        }
-        pruneCacheTest();
-    }
-
-    @Test
-    public void pruneCacheReverseInsertion() {
-        List<RoomSQLiteQuery> queries = new ArrayList<>();
-        for (int i = RoomSQLiteQuery.POOL_LIMIT - 1; i >= 0; i--) {
-            queries.add(RoomSQLiteQuery.acquire("dsdsa", i));
-        }
-        for (RoomSQLiteQuery query : queries) {
-            query.release();
-        }
-        pruneCacheTest();
-    }
-
-    private void pruneCacheTest() {
-        assertThat(RoomSQLiteQuery.queryPool.size(), is(RoomSQLiteQuery.POOL_LIMIT));
-        RoomSQLiteQuery.acquire("dsadsa", RoomSQLiteQuery.POOL_LIMIT + 1).release();
-        assertThat(RoomSQLiteQuery.queryPool.size(), is(RoomSQLiteQuery.DESIRED_POOL_SIZE));
-        Iterator<RoomSQLiteQuery> itr = RoomSQLiteQuery.queryPool.values().iterator();
-        for (int i = 0; i < RoomSQLiteQuery.DESIRED_POOL_SIZE; i++) {
-            assertThat(itr.next().getCapacity(), is(i));
-        }
-    }
-}
diff --git a/room/room-runtime/src/test/java/androidx/room/RoomSQLiteQueryTest.kt b/room/room-runtime/src/test/java/androidx/room/RoomSQLiteQueryTest.kt
new file mode 100644
index 0000000..669b7f2
--- /dev/null
+++ b/room/room-runtime/src/test/java/androidx/room/RoomSQLiteQueryTest.kt
@@ -0,0 +1,146 @@
+/*
+ * Copyright (C) 2017 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 androidx.room
+
+import androidx.room.RoomSQLiteQuery.Companion.acquire
+import androidx.sqlite.db.SupportSQLiteProgram
+import com.google.common.truth.Truth.assertThat
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.verify
+
+@RunWith(JUnit4::class)
+class RoomSQLiteQueryTest {
+    @Before
+    fun clear() {
+        RoomSQLiteQuery.queryPool.clear()
+    }
+
+    @Test
+    fun acquireBasic() {
+        val query = acquire("abc", 3)
+        assertThat(query.sql).isEqualTo("abc")
+        assertThat(query.argCount).isEqualTo(3)
+        assertThat(query.blobBindings.size).isEqualTo(4)
+        assertThat(query.longBindings.size).isEqualTo(4)
+        assertThat(query.stringBindings.size).isEqualTo(4)
+        assertThat(query.doubleBindings.size).isEqualTo(4)
+    }
+
+    @Test
+    fun acquireSameSizeAgain() {
+        val query = acquire("abc", 3)
+        query.release()
+        assertThat(acquire("blah", 3)).isSameInstanceAs(query)
+    }
+
+    @Test
+    fun acquireSameSizeWithoutRelease() {
+        val query = acquire("abc", 3)
+        assertThat(
+            acquire("fda", 3)
+        ).isNotSameInstanceAs(query)
+    }
+
+    @Test
+    fun bindings() {
+        val query = acquire("abc", 6)
+        val myBlob = ByteArray(3)
+        val myLong = 3L
+        val myDouble = 7.0
+        val myString = "ss"
+        query.bindBlob(1, myBlob)
+        query.bindLong(2, myLong)
+        query.bindNull(3)
+        query.bindDouble(4, myDouble)
+        query.bindString(5, myString)
+        query.bindNull(6)
+        val program: SupportSQLiteProgram = mock()
+        query.bindTo(program)
+        verify(program).bindBlob(1, myBlob)
+        verify(program).bindLong(2, myLong)
+        verify(program).bindNull(3)
+        verify(program).bindDouble(4, myDouble)
+        verify(program).bindString(5, myString)
+        verify(program).bindNull(6)
+    }
+
+    @Test
+    fun dontKeepSameSizeTwice() {
+        val query1 = acquire("abc", 3)
+        val query2 = acquire("zx", 3)
+        val query3 = acquire("qw", 0)
+        query1.release()
+        query2.release()
+        assertThat(RoomSQLiteQuery.queryPool.size).isEqualTo(1)
+        query3.release()
+        assertThat(RoomSQLiteQuery.queryPool.size).isEqualTo(2)
+    }
+
+    @Test
+    fun returnExistingForSmallerSize() {
+        val query = acquire("abc", 3)
+        query.release()
+        assertThat(acquire("dsa", 2)).isSameInstanceAs(query)
+    }
+
+    @Test
+    fun returnNewForBigger() {
+        val query = acquire("abc", 3)
+        query.release()
+        assertThat(
+            acquire("dsa", 4)
+        ).isNotSameInstanceAs(query)
+    }
+
+    @Test
+    fun pruneCache() {
+        for (i in 0 until RoomSQLiteQuery.POOL_LIMIT) {
+            acquire("dsdsa", i).release()
+        }
+        pruneCacheTest()
+    }
+
+    @Test
+    fun pruneCacheReverseInsertion() {
+        val queries: MutableList<RoomSQLiteQuery> = ArrayList()
+        for (i in RoomSQLiteQuery.POOL_LIMIT - 1 downTo 0) {
+            queries.add(acquire("dsdsa", i))
+        }
+        for (query in queries) {
+            query.release()
+        }
+        pruneCacheTest()
+    }
+
+    private fun pruneCacheTest() {
+        assertThat(
+            RoomSQLiteQuery.queryPool.size
+        ).isEqualTo(RoomSQLiteQuery.POOL_LIMIT)
+        acquire("dsadsa", RoomSQLiteQuery.POOL_LIMIT + 1).release()
+        assertThat(
+            RoomSQLiteQuery.queryPool.size
+        ).isEqualTo(RoomSQLiteQuery.DESIRED_POOL_SIZE)
+        val itr: Iterator<RoomSQLiteQuery> = RoomSQLiteQuery.queryPool.values.iterator()
+        for (i in 0 until RoomSQLiteQuery.DESIRED_POOL_SIZE) {
+            assertThat(itr.next().capacity).isEqualTo(i)
+        }
+    }
+}
\ No newline at end of file
diff --git a/room/room-runtime/src/test/java/androidx/room/SharedSQLiteStatementTest.java b/room/room-runtime/src/test/java/androidx/room/SharedSQLiteStatementTest.java
deleted file mode 100644
index dde3a3a..0000000
--- a/room/room-runtime/src/test/java/androidx/room/SharedSQLiteStatementTest.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Copyright (C) 2016 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 androidx.room;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.not;
-import static org.hamcrest.CoreMatchers.notNullValue;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.mockito.ArgumentMatchers.anyString;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import androidx.sqlite.db.SupportSQLiteStatement;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-import org.mockito.invocation.InvocationOnMock;
-import org.mockito.stubbing.Answer;
-
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.FutureTask;
-
-@RunWith(JUnit4.class)
-public class SharedSQLiteStatementTest {
-    private SharedSQLiteStatement mSharedStmt;
-    RoomDatabase mDb;
-    @Before
-    public void init() {
-        mDb = mock(RoomDatabase.class);
-        when(mDb.compileStatement(anyString())).thenAnswer(new Answer<SupportSQLiteStatement>() {
-
-            @Override
-            public SupportSQLiteStatement answer(InvocationOnMock invocation) throws Throwable {
-                return mock(SupportSQLiteStatement.class);
-            }
-        });
-        when(mDb.getInvalidationTracker()).thenReturn(mock(InvalidationTracker.class));
-        mSharedStmt = new SharedSQLiteStatement(mDb) {
-            @Override
-            protected String createQuery() {
-                return "foo";
-            }
-        };
-    }
-
-    @Test
-    public void checkMainThread() {
-        mSharedStmt.acquire();
-        verify(mDb).assertNotMainThread();
-    }
-
-    @Test
-    public void basic() {
-        assertThat(mSharedStmt.acquire(), notNullValue());
-    }
-
-    @Test
-    public void getTwiceWithoutReleasing() {
-        SupportSQLiteStatement stmt1 = mSharedStmt.acquire();
-        SupportSQLiteStatement stmt2 = mSharedStmt.acquire();
-        assertThat(stmt1, notNullValue());
-        assertThat(stmt2, notNullValue());
-        assertThat(stmt1, is(not(stmt2)));
-    }
-
-    @Test
-    public void getTwiceWithReleasing() {
-        SupportSQLiteStatement stmt1 = mSharedStmt.acquire();
-        mSharedStmt.release(stmt1);
-        SupportSQLiteStatement stmt2 = mSharedStmt.acquire();
-        assertThat(stmt1, notNullValue());
-        assertThat(stmt1, is(stmt2));
-    }
-
-    @Test
-    public void getFromAnotherThreadWhileHolding() throws ExecutionException, InterruptedException {
-        SupportSQLiteStatement stmt1 = mSharedStmt.acquire();
-        FutureTask<SupportSQLiteStatement> task = new FutureTask<>(
-                new Callable<SupportSQLiteStatement>() {
-                    @Override
-                    public SupportSQLiteStatement call() throws Exception {
-                        return mSharedStmt.acquire();
-                    }
-                });
-        new Thread(task).run();
-        SupportSQLiteStatement stmt2 = task.get();
-        assertThat(stmt1, notNullValue());
-        assertThat(stmt2, notNullValue());
-        assertThat(stmt1, is(not(stmt2)));
-    }
-
-    @Test
-    public void getFromAnotherThreadAfterReleasing() throws ExecutionException,
-            InterruptedException {
-        SupportSQLiteStatement stmt1 = mSharedStmt.acquire();
-        mSharedStmt.release(stmt1);
-        FutureTask<SupportSQLiteStatement> task = new FutureTask<>(
-                new Callable<SupportSQLiteStatement>() {
-                    @Override
-                    public SupportSQLiteStatement call() throws Exception {
-                        return mSharedStmt.acquire();
-                    }
-                });
-        new Thread(task).run();
-        SupportSQLiteStatement stmt2 = task.get();
-        assertThat(stmt1, notNullValue());
-        assertThat(stmt1, is(stmt2));
-    }
-}
diff --git a/room/room-runtime/src/test/java/androidx/room/SharedSQLiteStatementTest.kt b/room/room-runtime/src/test/java/androidx/room/SharedSQLiteStatementTest.kt
new file mode 100644
index 0000000..c9da445
--- /dev/null
+++ b/room/room-runtime/src/test/java/androidx/room/SharedSQLiteStatementTest.kt
@@ -0,0 +1,99 @@
+/*
+ * Copyright (C) 2016 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 androidx.room
+
+import androidx.sqlite.db.SupportSQLiteStatement
+import com.google.common.truth.Truth.assertThat
+import java.util.concurrent.FutureTask
+import org.junit.Before
+import org.junit.Test
+import org.junit.runner.RunWith
+import org.junit.runners.JUnit4
+import org.mockito.kotlin.anyOrNull
+import org.mockito.kotlin.mock
+import org.mockito.kotlin.verify
+import org.mockito.kotlin.whenever
+
+@RunWith(JUnit4::class)
+class SharedSQLiteStatementTest {
+    private lateinit var mSharedStmt: SharedSQLiteStatement
+    lateinit var mDb: RoomDatabase
+    @Before
+    fun init() {
+        val mdata: RoomDatabase = mock()
+        whenever(mdata.compileStatement(anyOrNull())).thenAnswer {
+            mock<SupportSQLiteStatement>()
+        }
+        whenever(mdata.invalidationTracker).thenReturn(mock())
+        mDb = mdata
+        mSharedStmt = object : SharedSQLiteStatement(mdata) {
+            override fun createQuery(): String {
+                return "foo"
+            }
+        }
+    }
+
+    @Test
+    fun checkMainThread() {
+        mSharedStmt.acquire()
+        verify(mDb).assertNotMainThread()
+    }
+
+    @Test
+    fun basic() {
+        assertThat(mSharedStmt.acquire()).isNotNull()
+    }
+
+    @Test
+    fun twiceWithoutReleasing() {
+            val stmt1 = mSharedStmt.acquire()
+            val stmt2 = mSharedStmt.acquire()
+            assertThat(stmt1).isNotNull()
+            assertThat(stmt2).isNotNull()
+            assertThat(stmt1).isNotEqualTo(stmt2)
+        }
+
+    @Test
+    fun twiceWithReleasing() {
+            val stmt1 = mSharedStmt.acquire()
+            mSharedStmt.release(stmt1)
+            val stmt2 = mSharedStmt.acquire()
+            assertThat(stmt1).isNotNull()
+            assertThat(stmt1).isEqualTo(stmt2)
+        }
+
+    @Test
+    fun fromAnotherThreadWhileHolding() {
+        val stmt1 = mSharedStmt.acquire()
+        val task = FutureTask { mSharedStmt.acquire() }
+        Thread(task).start()
+        val stmt2 = task.get()
+        assertThat(stmt1).isNotNull()
+        assertThat(stmt2).isNotNull()
+        assertThat(stmt1).isNotEqualTo(stmt2)
+    }
+
+    @Test
+    fun fromAnotherThreadAfterReleasing() {
+        val stmt1 = mSharedStmt.acquire()
+        mSharedStmt.release(stmt1)
+        val task = FutureTask { mSharedStmt.acquire() }
+        Thread(task).start()
+        val stmt2 = task.get()
+        assertThat(stmt1).isNotNull()
+        assertThat(stmt1).isEqualTo(stmt2)
+    }
+}
\ No newline at end of file
diff --git a/room/room-rxjava2/api/2.5.0-beta01.txt b/room/room-rxjava2/api/2.5.0-beta01.txt
new file mode 100644
index 0000000..64b6fe4
--- /dev/null
+++ b/room/room-rxjava2/api/2.5.0-beta01.txt
@@ -0,0 +1,16 @@
+// Signature format: 4.0
+package androidx.room {
+
+  public class EmptyResultSetException extends java.lang.RuntimeException {
+    ctor public EmptyResultSetException(String!);
+  }
+
+  public class RxRoom {
+    ctor @Deprecated public RxRoom();
+    method public static io.reactivex.Flowable<java.lang.Object!>! createFlowable(androidx.room.RoomDatabase!, java.lang.String!...);
+    method public static io.reactivex.Observable<java.lang.Object!>! createObservable(androidx.room.RoomDatabase!, java.lang.String!...);
+    field public static final Object! NOTHING;
+  }
+
+}
+
diff --git a/room/room-rxjava2/api/public_plus_experimental_2.5.0-beta01.txt b/room/room-rxjava2/api/public_plus_experimental_2.5.0-beta01.txt
new file mode 100644
index 0000000..64b6fe4
--- /dev/null
+++ b/room/room-rxjava2/api/public_plus_experimental_2.5.0-beta01.txt
@@ -0,0 +1,16 @@
+// Signature format: 4.0
+package androidx.room {
+
+  public class EmptyResultSetException extends java.lang.RuntimeException {
+    ctor public EmptyResultSetException(String!);
+  }
+
+  public class RxRoom {
+    ctor @Deprecated public RxRoom();
+    method public static io.reactivex.Flowable<java.lang.Object!>! createFlowable(androidx.room.RoomDatabase!, java.lang.String!...);
+    method public static io.reactivex.Observable<java.lang.Object!>! createObservable(androidx.room.RoomDatabase!, java.lang.String!...);
+    field public static final Object! NOTHING;
+  }
+
+}
+
diff --git a/room/room-rxjava2/api/res-2.5.0-beta01.txt b/room/room-rxjava2/api/res-2.5.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/room/room-rxjava2/api/res-2.5.0-beta01.txt
diff --git a/room/room-rxjava2/api/restricted_2.5.0-beta01.txt b/room/room-rxjava2/api/restricted_2.5.0-beta01.txt
new file mode 100644
index 0000000..5505f93
--- /dev/null
+++ b/room/room-rxjava2/api/restricted_2.5.0-beta01.txt
@@ -0,0 +1,21 @@
+// Signature format: 4.0
+package androidx.room {
+
+  public class EmptyResultSetException extends java.lang.RuntimeException {
+    ctor public EmptyResultSetException(String!);
+  }
+
+  public class RxRoom {
+    ctor @Deprecated public RxRoom();
+    method public static io.reactivex.Flowable<java.lang.Object!>! createFlowable(androidx.room.RoomDatabase!, java.lang.String!...);
+    method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static <T> io.reactivex.Flowable<T!>! createFlowable(androidx.room.RoomDatabase!, String![]!, java.util.concurrent.Callable<T!>!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static <T> io.reactivex.Flowable<T!>! createFlowable(androidx.room.RoomDatabase!, boolean, String![]!, java.util.concurrent.Callable<T!>!);
+    method public static io.reactivex.Observable<java.lang.Object!>! createObservable(androidx.room.RoomDatabase!, java.lang.String!...);
+    method @Deprecated @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static <T> io.reactivex.Observable<T!>! createObservable(androidx.room.RoomDatabase!, String![]!, java.util.concurrent.Callable<T!>!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static <T> io.reactivex.Observable<T!>! createObservable(androidx.room.RoomDatabase!, boolean, String![]!, java.util.concurrent.Callable<T!>!);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static <T> io.reactivex.Single<T!>! createSingle(java.util.concurrent.Callable<T!>!);
+    field public static final Object! NOTHING;
+  }
+
+}
+
diff --git a/room/room-rxjava3/api/2.5.0-beta01.txt b/room/room-rxjava3/api/2.5.0-beta01.txt
new file mode 100644
index 0000000..6b78281
--- /dev/null
+++ b/room/room-rxjava3/api/2.5.0-beta01.txt
@@ -0,0 +1,15 @@
+// Signature format: 4.0
+package androidx.room.rxjava3 {
+
+  public final class EmptyResultSetException extends java.lang.RuntimeException {
+    ctor public EmptyResultSetException(String);
+  }
+
+  public final class RxRoom {
+    method public static io.reactivex.rxjava3.core.Flowable<java.lang.Object!> createFlowable(androidx.room.RoomDatabase, java.lang.String!...);
+    method public static io.reactivex.rxjava3.core.Observable<java.lang.Object!> createObservable(androidx.room.RoomDatabase, java.lang.String!...);
+    field public static final Object NOTHING;
+  }
+
+}
+
diff --git a/room/room-rxjava3/api/public_plus_experimental_2.5.0-beta01.txt b/room/room-rxjava3/api/public_plus_experimental_2.5.0-beta01.txt
new file mode 100644
index 0000000..6b78281
--- /dev/null
+++ b/room/room-rxjava3/api/public_plus_experimental_2.5.0-beta01.txt
@@ -0,0 +1,15 @@
+// Signature format: 4.0
+package androidx.room.rxjava3 {
+
+  public final class EmptyResultSetException extends java.lang.RuntimeException {
+    ctor public EmptyResultSetException(String);
+  }
+
+  public final class RxRoom {
+    method public static io.reactivex.rxjava3.core.Flowable<java.lang.Object!> createFlowable(androidx.room.RoomDatabase, java.lang.String!...);
+    method public static io.reactivex.rxjava3.core.Observable<java.lang.Object!> createObservable(androidx.room.RoomDatabase, java.lang.String!...);
+    field public static final Object NOTHING;
+  }
+
+}
+
diff --git a/room/room-rxjava3/api/res-2.5.0-beta01.txt b/room/room-rxjava3/api/res-2.5.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/room/room-rxjava3/api/res-2.5.0-beta01.txt
diff --git a/room/room-rxjava3/api/restricted_2.5.0-beta01.txt b/room/room-rxjava3/api/restricted_2.5.0-beta01.txt
new file mode 100644
index 0000000..0680710
--- /dev/null
+++ b/room/room-rxjava3/api/restricted_2.5.0-beta01.txt
@@ -0,0 +1,18 @@
+// Signature format: 4.0
+package androidx.room.rxjava3 {
+
+  public final class EmptyResultSetException extends java.lang.RuntimeException {
+    ctor public EmptyResultSetException(String);
+  }
+
+  public final class RxRoom {
+    method public static io.reactivex.rxjava3.core.Flowable<java.lang.Object!> createFlowable(androidx.room.RoomDatabase, java.lang.String!...);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static <T> io.reactivex.rxjava3.core.Flowable<T!> createFlowable(androidx.room.RoomDatabase, boolean, String![], java.util.concurrent.Callable<T!>);
+    method public static io.reactivex.rxjava3.core.Observable<java.lang.Object!> createObservable(androidx.room.RoomDatabase, java.lang.String!...);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static <T> io.reactivex.rxjava3.core.Observable<T!> createObservable(androidx.room.RoomDatabase, boolean, String![], java.util.concurrent.Callable<T!>);
+    method @RestrictTo(androidx.annotation.RestrictTo.Scope.LIBRARY_GROUP_PREFIX) public static <T> io.reactivex.rxjava3.core.Single<T!> createSingle(java.util.concurrent.Callable<T!>);
+    field public static final Object NOTHING;
+  }
+
+}
+
diff --git a/room/room-testing/api/2.5.0-beta01.txt b/room/room-testing/api/2.5.0-beta01.txt
new file mode 100644
index 0000000..ea0639e
--- /dev/null
+++ b/room/room-testing/api/2.5.0-beta01.txt
@@ -0,0 +1,17 @@
+// Signature format: 4.0
+package androidx.room.testing {
+
+  public class MigrationTestHelper extends org.junit.rules.TestWatcher {
+    ctor @Deprecated public MigrationTestHelper(android.app.Instrumentation!, String!);
+    ctor @Deprecated public MigrationTestHelper(android.app.Instrumentation!, String!, androidx.sqlite.db.SupportSQLiteOpenHelper.Factory!);
+    ctor public MigrationTestHelper(android.app.Instrumentation, Class<? extends androidx.room.RoomDatabase>);
+    ctor public MigrationTestHelper(android.app.Instrumentation, Class<? extends androidx.room.RoomDatabase>, java.util.List<androidx.room.migration.AutoMigrationSpec!>);
+    ctor public MigrationTestHelper(android.app.Instrumentation, Class<? extends androidx.room.RoomDatabase>, java.util.List<androidx.room.migration.AutoMigrationSpec!>, androidx.sqlite.db.SupportSQLiteOpenHelper.Factory);
+    method public void closeWhenFinished(androidx.sqlite.db.SupportSQLiteDatabase!);
+    method public void closeWhenFinished(androidx.room.RoomDatabase!);
+    method public androidx.sqlite.db.SupportSQLiteDatabase! createDatabase(String!, int) throws java.io.IOException;
+    method public androidx.sqlite.db.SupportSQLiteDatabase! runMigrationsAndValidate(String!, int, boolean, androidx.room.migration.Migration!...) throws java.io.IOException;
+  }
+
+}
+
diff --git a/room/room-testing/api/public_plus_experimental_2.5.0-beta01.txt b/room/room-testing/api/public_plus_experimental_2.5.0-beta01.txt
new file mode 100644
index 0000000..ea0639e
--- /dev/null
+++ b/room/room-testing/api/public_plus_experimental_2.5.0-beta01.txt
@@ -0,0 +1,17 @@
+// Signature format: 4.0
+package androidx.room.testing {
+
+  public class MigrationTestHelper extends org.junit.rules.TestWatcher {
+    ctor @Deprecated public MigrationTestHelper(android.app.Instrumentation!, String!);
+    ctor @Deprecated public MigrationTestHelper(android.app.Instrumentation!, String!, androidx.sqlite.db.SupportSQLiteOpenHelper.Factory!);
+    ctor public MigrationTestHelper(android.app.Instrumentation, Class<? extends androidx.room.RoomDatabase>);
+    ctor public MigrationTestHelper(android.app.Instrumentation, Class<? extends androidx.room.RoomDatabase>, java.util.List<androidx.room.migration.AutoMigrationSpec!>);
+    ctor public MigrationTestHelper(android.app.Instrumentation, Class<? extends androidx.room.RoomDatabase>, java.util.List<androidx.room.migration.AutoMigrationSpec!>, androidx.sqlite.db.SupportSQLiteOpenHelper.Factory);
+    method public void closeWhenFinished(androidx.sqlite.db.SupportSQLiteDatabase!);
+    method public void closeWhenFinished(androidx.room.RoomDatabase!);
+    method public androidx.sqlite.db.SupportSQLiteDatabase! createDatabase(String!, int) throws java.io.IOException;
+    method public androidx.sqlite.db.SupportSQLiteDatabase! runMigrationsAndValidate(String!, int, boolean, androidx.room.migration.Migration!...) throws java.io.IOException;
+  }
+
+}
+
diff --git a/room/room-testing/api/res-2.5.0-beta01.txt b/room/room-testing/api/res-2.5.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/room/room-testing/api/res-2.5.0-beta01.txt
diff --git a/room/room-testing/api/restricted_2.5.0-beta01.txt b/room/room-testing/api/restricted_2.5.0-beta01.txt
new file mode 100644
index 0000000..ea0639e
--- /dev/null
+++ b/room/room-testing/api/restricted_2.5.0-beta01.txt
@@ -0,0 +1,17 @@
+// Signature format: 4.0
+package androidx.room.testing {
+
+  public class MigrationTestHelper extends org.junit.rules.TestWatcher {
+    ctor @Deprecated public MigrationTestHelper(android.app.Instrumentation!, String!);
+    ctor @Deprecated public MigrationTestHelper(android.app.Instrumentation!, String!, androidx.sqlite.db.SupportSQLiteOpenHelper.Factory!);
+    ctor public MigrationTestHelper(android.app.Instrumentation, Class<? extends androidx.room.RoomDatabase>);
+    ctor public MigrationTestHelper(android.app.Instrumentation, Class<? extends androidx.room.RoomDatabase>, java.util.List<androidx.room.migration.AutoMigrationSpec!>);
+    ctor public MigrationTestHelper(android.app.Instrumentation, Class<? extends androidx.room.RoomDatabase>, java.util.List<androidx.room.migration.AutoMigrationSpec!>, androidx.sqlite.db.SupportSQLiteOpenHelper.Factory);
+    method public void closeWhenFinished(androidx.sqlite.db.SupportSQLiteDatabase!);
+    method public void closeWhenFinished(androidx.room.RoomDatabase!);
+    method public androidx.sqlite.db.SupportSQLiteDatabase! createDatabase(String!, int) throws java.io.IOException;
+    method public androidx.sqlite.db.SupportSQLiteDatabase! runMigrationsAndValidate(String!, int, boolean, androidx.room.migration.Migration!...) throws java.io.IOException;
+  }
+
+}
+
diff --git a/samples/AndroidXDemos/lint-baseline.xml b/samples/AndroidXDemos/lint-baseline.xml
index 66b57c7..6748694 100644
--- a/samples/AndroidXDemos/lint-baseline.xml
+++ b/samples/AndroidXDemos/lint-baseline.xml
@@ -215,7 +215,7 @@
         id="NewApi"
         message="`&lt;class>` requires API level 24 (current min is 14)"
         errorLine1="    class=&quot;com.example.androidx.drawable.MyDrawable&quot;"
-        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
         <location
             file="src/main/res/drawable/my_drawable.xml"/>
     </issue>
@@ -653,6 +653,105 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
+        errorLine1="    public void onCreate(Bundle savedInstanceState) {"
+        errorLine2="                         ~~~~~~">
+        <location
+            file="src/main/java/com/example/androidx/AndroidXDemos.java"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
+        errorLine1="    protected List&lt;Map&lt;String, Object>> getData(String prefix) {"
+        errorLine2="              ~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/androidx/AndroidXDemos.java"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
+        errorLine1="    protected List&lt;Map&lt;String, Object>> getData(String prefix) {"
+        errorLine2="                                                ~~~~~~">
+        <location
+            file="src/main/java/com/example/androidx/AndroidXDemos.java"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
+        errorLine1="    protected Intent activityIntent(String pkg, String componentName) {"
+        errorLine2="              ~~~~~~">
+        <location
+            file="src/main/java/com/example/androidx/AndroidXDemos.java"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
+        errorLine1="    protected Intent activityIntent(String pkg, String componentName) {"
+        errorLine2="                                    ~~~~~~">
+        <location
+            file="src/main/java/com/example/androidx/AndroidXDemos.java"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
+        errorLine1="    protected Intent activityIntent(String pkg, String componentName) {"
+        errorLine2="                                                ~~~~~~">
+        <location
+            file="src/main/java/com/example/androidx/AndroidXDemos.java"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
+        errorLine1="    protected Intent browseIntent(String path) {"
+        errorLine2="              ~~~~~~">
+        <location
+            file="src/main/java/com/example/androidx/AndroidXDemos.java"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
+        errorLine1="    protected Intent browseIntent(String path) {"
+        errorLine2="                                  ~~~~~~">
+        <location
+            file="src/main/java/com/example/androidx/AndroidXDemos.java"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
+        errorLine1="    protected void addItem(List&lt;Map&lt;String, Object>> data, String name, Intent intent) {"
+        errorLine2="                           ~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/com/example/androidx/AndroidXDemos.java"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
+        errorLine1="    protected void addItem(List&lt;Map&lt;String, Object>> data, String name, Intent intent) {"
+        errorLine2="                                                           ~~~~~~">
+        <location
+            file="src/main/java/com/example/androidx/AndroidXDemos.java"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
+        errorLine1="    protected void addItem(List&lt;Map&lt;String, Object>> data, String name, Intent intent) {"
+        errorLine2="                                                                        ~~~~~~">
+        <location
+            file="src/main/java/com/example/androidx/AndroidXDemos.java"/>
+    </issue>
+
+    <issue
+        id="UnknownNullness"
+        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    protected void onCreate(Bundle savedInstanceState) {"
         errorLine2="                            ~~~~~~">
         <location
@@ -2984,105 +3083,6 @@
     <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
-        errorLine1="    public void onCreate(Bundle savedInstanceState) {"
-        errorLine2="                         ~~~~~~">
-        <location
-            file="src/main/java/com/example/androidx/AndroidXDemos.java"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
-        errorLine1="    protected List&lt;Map&lt;String, Object>> getData(String prefix) {"
-        errorLine2="              ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/androidx/AndroidXDemos.java"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
-        errorLine1="    protected List&lt;Map&lt;String, Object>> getData(String prefix) {"
-        errorLine2="                                                ~~~~~~">
-        <location
-            file="src/main/java/com/example/androidx/AndroidXDemos.java"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
-        errorLine1="    protected Intent activityIntent(String pkg, String componentName) {"
-        errorLine2="              ~~~~~~">
-        <location
-            file="src/main/java/com/example/androidx/AndroidXDemos.java"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
-        errorLine1="    protected Intent activityIntent(String pkg, String componentName) {"
-        errorLine2="                                    ~~~~~~">
-        <location
-            file="src/main/java/com/example/androidx/AndroidXDemos.java"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
-        errorLine1="    protected Intent activityIntent(String pkg, String componentName) {"
-        errorLine2="                                                ~~~~~~">
-        <location
-            file="src/main/java/com/example/androidx/AndroidXDemos.java"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
-        errorLine1="    protected Intent browseIntent(String path) {"
-        errorLine2="              ~~~~~~">
-        <location
-            file="src/main/java/com/example/androidx/AndroidXDemos.java"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
-        errorLine1="    protected Intent browseIntent(String path) {"
-        errorLine2="                                  ~~~~~~">
-        <location
-            file="src/main/java/com/example/androidx/AndroidXDemos.java"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
-        errorLine1="    protected void addItem(List&lt;Map&lt;String, Object>> data, String name, Intent intent) {"
-        errorLine2="                           ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/com/example/androidx/AndroidXDemos.java"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
-        errorLine1="    protected void addItem(List&lt;Map&lt;String, Object>> data, String name, Intent intent) {"
-        errorLine2="                                                           ~~~~~~">
-        <location
-            file="src/main/java/com/example/androidx/AndroidXDemos.java"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
-        errorLine1="    protected void addItem(List&lt;Map&lt;String, Object>> data, String name, Intent intent) {"
-        errorLine2="                                                                        ~~~~~~">
-        <location
-            file="src/main/java/com/example/androidx/AndroidXDemos.java"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public void onBind(ItemTouchViewHolder viewHolder) {"
         errorLine2="                       ~~~~~~~~~~~~~~~~~~~">
         <location
diff --git a/samples/SupportPreferenceDemos/lint-baseline.xml b/samples/SupportPreferenceDemos/lint-baseline.xml
index a2a2fdc..a3353c4 100644
--- a/samples/SupportPreferenceDemos/lint-baseline.xml
+++ b/samples/SupportPreferenceDemos/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="cli" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
+<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
 
     <issue
         id="MissingTvBanner"
diff --git a/samples/SupportSliceDemos/lint-baseline.xml b/samples/SupportSliceDemos/lint-baseline.xml
index 128542c..1a9fe29 100644
--- a/samples/SupportSliceDemos/lint-baseline.xml
+++ b/samples/SupportSliceDemos/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
+<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="cli" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
 
     <issue
         id="UnknownNullness"
diff --git a/samples/SupportWearDemos/lint-baseline.xml b/samples/SupportWearDemos/lint-baseline.xml
index 66e9a6c..cfbc3a4 100644
--- a/samples/SupportWearDemos/lint-baseline.xml
+++ b/samples/SupportWearDemos/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
+<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="cli" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
 
     <issue
         id="UnknownNullness"
diff --git a/security/security-crypto/lint-baseline.xml b/security/security-crypto/lint-baseline.xml
index b611da6..e23c350 100644
--- a/security/security-crypto/lint-baseline.xml
+++ b/security/security-crypto/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
+<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="cli" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
 
     <issue
         id="BanSynchronizedMethods"
diff --git a/settings.gradle b/settings.gradle
index 8a420cb..130475d 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -598,6 +598,7 @@
 includeProject(":core:uwb:uwb-rxjava3", [BuildType.MAIN])
 includeProject(":credentials:credentials", [BuildType.MAIN])
 includeProject(":credentials:credentials-play-services-auth", [BuildType.MAIN])
+includeProject(":credentials:credentials-provider", [BuildType.MAIN])
 includeProject(":cursoradapter:cursoradapter", [BuildType.MAIN])
 includeProject(":customview:customview", [BuildType.MAIN])
 includeProject(":customview:customview-poolingcontainer", [BuildType.MAIN, BuildType.COMPOSE])
@@ -848,7 +849,7 @@
 includeProject(":test:ext:junit-gtest", [BuildType.NATIVE])
 includeProject(":test:integration-tests:junit-gtest-test", [BuildType.NATIVE])
 includeProject(":test:screenshot:screenshot")
-includeProject(":test:screenshot:screenshot-paparazzi", [BuildType.MAIN, BuildType.COMPOSE])
+includeProject(":test:screenshot:screenshot-layoutlib", [BuildType.MAIN, BuildType.COMPOSE])
 includeProject(":test:screenshot:screenshot-proto")
 includeProject(":test:uiautomator:uiautomator", [BuildType.MAIN])
 includeProject(":test:uiautomator:integration-tests:testapp", [BuildType.MAIN])
diff --git a/slice/slice-builders/lint-baseline.xml b/slice/slice-builders/lint-baseline.xml
index c8166a0..0ff48cb 100644
--- a/slice/slice-builders/lint-baseline.xml
+++ b/slice/slice-builders/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
+<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="cli" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
 
     <issue
         id="WrongConstant"
diff --git a/slice/slice-core/lint-baseline.xml b/slice/slice-core/lint-baseline.xml
index 90d930b..d036494 100644
--- a/slice/slice-core/lint-baseline.xml
+++ b/slice/slice-core/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
+<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="cli" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
 
     <issue
         id="BanUncheckedReflection"
diff --git a/slice/slice-view/lint-baseline.xml b/slice/slice-view/lint-baseline.xml
index 2a146f2..d5a0743 100644
--- a/slice/slice-view/lint-baseline.xml
+++ b/slice/slice-view/lint-baseline.xml
@@ -74,60 +74,6 @@
     </issue>
 
     <issue
-        id="MissingQuantity"
-        message="For locale &quot;fr&quot; (French) the following quantity should also be defined: `many` (e.g. &quot;1000000 de jours&quot;)"
-        errorLine1="    &lt;plurals name=&quot;abc_slice_duration_min&quot; formatted=&quot;false&quot; msgid=&quot;7664017844210142826&quot;>"
-        errorLine2="    ^">
-        <location
-            file="src/main/res/values-fr-rCA/strings.xml"/>
-    </issue>
-
-    <issue
-        id="MissingQuantity"
-        message="For locale &quot;fr&quot; (French) the following quantity should also be defined: `many` (e.g. &quot;1000000 de jours&quot;)"
-        errorLine1="    &lt;plurals name=&quot;abc_slice_duration_min&quot; formatted=&quot;false&quot; msgid=&quot;7664017844210142826&quot;>"
-        errorLine2="    ^">
-        <location
-            file="src/main/res/values-fr/strings.xml"/>
-    </issue>
-
-    <issue
-        id="MissingQuantity"
-        message="For locale &quot;fr&quot; (French) the following quantity should also be defined: `many` (e.g. &quot;1000000 de jours&quot;)"
-        errorLine1="    &lt;plurals name=&quot;abc_slice_duration_years&quot; formatted=&quot;false&quot; msgid=&quot;2628491538787454021&quot;>"
-        errorLine2="    ^">
-        <location
-            file="src/main/res/values-fr-rCA/strings.xml"/>
-    </issue>
-
-    <issue
-        id="MissingQuantity"
-        message="For locale &quot;fr&quot; (French) the following quantity should also be defined: `many` (e.g. &quot;1000000 de jours&quot;)"
-        errorLine1="    &lt;plurals name=&quot;abc_slice_duration_years&quot; formatted=&quot;false&quot; msgid=&quot;2628491538787454021&quot;>"
-        errorLine2="    ^">
-        <location
-            file="src/main/res/values-fr/strings.xml"/>
-    </issue>
-
-    <issue
-        id="MissingQuantity"
-        message="For locale &quot;fr&quot; (French) the following quantity should also be defined: `many` (e.g. &quot;1000000 de jours&quot;)"
-        errorLine1="    &lt;plurals name=&quot;abc_slice_duration_days&quot; formatted=&quot;false&quot; msgid=&quot;8356547162075064530&quot;>"
-        errorLine2="    ^">
-        <location
-            file="src/main/res/values-fr-rCA/strings.xml"/>
-    </issue>
-
-    <issue
-        id="MissingQuantity"
-        message="For locale &quot;fr&quot; (French) the following quantity should also be defined: `many` (e.g. &quot;1000000 de jours&quot;)"
-        errorLine1="    &lt;plurals name=&quot;abc_slice_duration_days&quot; formatted=&quot;false&quot; msgid=&quot;8356547162075064530&quot;>"
-        errorLine2="    ^">
-        <location
-            file="src/main/res/values-fr/strings.xml"/>
-    </issue>
-
-    <issue
         id="UnknownNullness"
         message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
         errorLine1="    public ActionRow(Context context, boolean fullActions) {"
diff --git a/sqlite/integration-tests/inspection-room-testapp/lint-baseline.xml b/sqlite/integration-tests/inspection-room-testapp/lint-baseline.xml
index 719e8ec..ce89072 100644
--- a/sqlite/integration-tests/inspection-room-testapp/lint-baseline.xml
+++ b/sqlite/integration-tests/inspection-room-testapp/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="cli" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
+<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
 
     <issue
         id="MissingTestSizeAnnotation"
diff --git a/sqlite/sqlite-framework/api/2.3.0-beta01.txt b/sqlite/sqlite-framework/api/2.3.0-beta01.txt
new file mode 100644
index 0000000..f7d3aae
--- /dev/null
+++ b/sqlite/sqlite-framework/api/2.3.0-beta01.txt
@@ -0,0 +1,10 @@
+// Signature format: 4.0
+package androidx.sqlite.db.framework {
+
+  public final class FrameworkSQLiteOpenHelperFactory implements androidx.sqlite.db.SupportSQLiteOpenHelper.Factory {
+    ctor public FrameworkSQLiteOpenHelperFactory();
+    method public androidx.sqlite.db.SupportSQLiteOpenHelper create(androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration configuration);
+  }
+
+}
+
diff --git a/sqlite/sqlite-framework/api/public_plus_experimental_2.3.0-beta01.txt b/sqlite/sqlite-framework/api/public_plus_experimental_2.3.0-beta01.txt
new file mode 100644
index 0000000..f7d3aae
--- /dev/null
+++ b/sqlite/sqlite-framework/api/public_plus_experimental_2.3.0-beta01.txt
@@ -0,0 +1,10 @@
+// Signature format: 4.0
+package androidx.sqlite.db.framework {
+
+  public final class FrameworkSQLiteOpenHelperFactory implements androidx.sqlite.db.SupportSQLiteOpenHelper.Factory {
+    ctor public FrameworkSQLiteOpenHelperFactory();
+    method public androidx.sqlite.db.SupportSQLiteOpenHelper create(androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration configuration);
+  }
+
+}
+
diff --git a/sqlite/sqlite-framework/api/res-2.3.0-beta01.txt b/sqlite/sqlite-framework/api/res-2.3.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/sqlite/sqlite-framework/api/res-2.3.0-beta01.txt
diff --git a/sqlite/sqlite-framework/api/restricted_2.3.0-beta01.txt b/sqlite/sqlite-framework/api/restricted_2.3.0-beta01.txt
new file mode 100644
index 0000000..f7d3aae
--- /dev/null
+++ b/sqlite/sqlite-framework/api/restricted_2.3.0-beta01.txt
@@ -0,0 +1,10 @@
+// Signature format: 4.0
+package androidx.sqlite.db.framework {
+
+  public final class FrameworkSQLiteOpenHelperFactory implements androidx.sqlite.db.SupportSQLiteOpenHelper.Factory {
+    ctor public FrameworkSQLiteOpenHelperFactory();
+    method public androidx.sqlite.db.SupportSQLiteOpenHelper create(androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration configuration);
+  }
+
+}
+
diff --git a/sqlite/sqlite-ktx/api/2.3.0-beta01.txt b/sqlite/sqlite-ktx/api/2.3.0-beta01.txt
new file mode 100644
index 0000000..26086b4
--- /dev/null
+++ b/sqlite/sqlite-ktx/api/2.3.0-beta01.txt
@@ -0,0 +1,9 @@
+// Signature format: 4.0
+package androidx.sqlite.db {
+
+  public final class SupportSQLiteDatabaseKt {
+    method public static inline <T> T! transaction(androidx.sqlite.db.SupportSQLiteDatabase, optional boolean exclusive, kotlin.jvm.functions.Function1<? super androidx.sqlite.db.SupportSQLiteDatabase,? extends T> body);
+  }
+
+}
+
diff --git a/sqlite/sqlite-ktx/api/public_plus_experimental_2.3.0-beta01.txt b/sqlite/sqlite-ktx/api/public_plus_experimental_2.3.0-beta01.txt
new file mode 100644
index 0000000..26086b4
--- /dev/null
+++ b/sqlite/sqlite-ktx/api/public_plus_experimental_2.3.0-beta01.txt
@@ -0,0 +1,9 @@
+// Signature format: 4.0
+package androidx.sqlite.db {
+
+  public final class SupportSQLiteDatabaseKt {
+    method public static inline <T> T! transaction(androidx.sqlite.db.SupportSQLiteDatabase, optional boolean exclusive, kotlin.jvm.functions.Function1<? super androidx.sqlite.db.SupportSQLiteDatabase,? extends T> body);
+  }
+
+}
+
diff --git a/sqlite/sqlite-ktx/api/res-2.3.0-beta01.txt b/sqlite/sqlite-ktx/api/res-2.3.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/sqlite/sqlite-ktx/api/res-2.3.0-beta01.txt
diff --git a/sqlite/sqlite-ktx/api/restricted_2.3.0-beta01.txt b/sqlite/sqlite-ktx/api/restricted_2.3.0-beta01.txt
new file mode 100644
index 0000000..26086b4
--- /dev/null
+++ b/sqlite/sqlite-ktx/api/restricted_2.3.0-beta01.txt
@@ -0,0 +1,9 @@
+// Signature format: 4.0
+package androidx.sqlite.db {
+
+  public final class SupportSQLiteDatabaseKt {
+    method public static inline <T> T! transaction(androidx.sqlite.db.SupportSQLiteDatabase, optional boolean exclusive, kotlin.jvm.functions.Function1<? super androidx.sqlite.db.SupportSQLiteDatabase,? extends T> body);
+  }
+
+}
+
diff --git a/sqlite/sqlite/api/2.3.0-beta01.txt b/sqlite/sqlite/api/2.3.0-beta01.txt
new file mode 100644
index 0000000..d416831
--- /dev/null
+++ b/sqlite/sqlite/api/2.3.0-beta01.txt
@@ -0,0 +1,166 @@
+// Signature format: 4.0
+package androidx.sqlite.db {
+
+  public final class SimpleSQLiteQuery implements androidx.sqlite.db.SupportSQLiteQuery {
+    ctor public SimpleSQLiteQuery(String query, Object![]? bindArgs);
+    ctor public SimpleSQLiteQuery(String query);
+    method public static void bind(androidx.sqlite.db.SupportSQLiteProgram statement, Object![]? bindArgs);
+    method public void bindTo(androidx.sqlite.db.SupportSQLiteProgram statement);
+    method public int getArgCount();
+    method public String getSql();
+    property public int argCount;
+    property public String sql;
+    field public static final androidx.sqlite.db.SimpleSQLiteQuery.Companion Companion;
+  }
+
+  public static final class SimpleSQLiteQuery.Companion {
+    method public void bind(androidx.sqlite.db.SupportSQLiteProgram statement, Object![]? bindArgs);
+  }
+
+  public interface SupportSQLiteDatabase extends java.io.Closeable {
+    method public void beginTransaction();
+    method public void beginTransactionNonExclusive();
+    method public void beginTransactionWithListener(android.database.sqlite.SQLiteTransactionListener transactionListener);
+    method public void beginTransactionWithListenerNonExclusive(android.database.sqlite.SQLiteTransactionListener transactionListener);
+    method public androidx.sqlite.db.SupportSQLiteStatement compileStatement(String sql);
+    method public int delete(String table, String? whereClause, Object![]? whereArgs);
+    method @RequiresApi(api=android.os.Build.VERSION_CODES.JELLY_BEAN) public void disableWriteAheadLogging();
+    method public boolean enableWriteAheadLogging();
+    method public void endTransaction();
+    method public default void execPerConnectionSQL(String sql, Object![]? bindArgs);
+    method @kotlin.jvm.Throws(exceptionClasses=SQLException::class) public void execSQL(String sql) throws android.database.SQLException;
+    method @kotlin.jvm.Throws(exceptionClasses=SQLException::class) public void execSQL(String sql, Object![] bindArgs) throws android.database.SQLException;
+    method public java.util.List<android.util.Pair<java.lang.String,java.lang.String>>? getAttachedDbs();
+    method public long getMaximumSize();
+    method public long getPageSize();
+    method public String? getPath();
+    method public int getVersion();
+    method public boolean inTransaction();
+    method @kotlin.jvm.Throws(exceptionClasses=SQLException::class) public long insert(String table, int conflictAlgorithm, android.content.ContentValues values) throws android.database.SQLException;
+    method public boolean isDatabaseIntegrityOk();
+    method public boolean isDbLockedByCurrentThread();
+    method public default boolean isExecPerConnectionSQLSupported();
+    method public boolean isOpen();
+    method public boolean isReadOnly();
+    method @RequiresApi(api=android.os.Build.VERSION_CODES.JELLY_BEAN) public boolean isWriteAheadLoggingEnabled();
+    method public boolean needUpgrade(int newVersion);
+    method public android.database.Cursor query(String query);
+    method public android.database.Cursor query(String query, Object![] bindArgs);
+    method public android.database.Cursor query(androidx.sqlite.db.SupportSQLiteQuery query);
+    method @RequiresApi(api=android.os.Build.VERSION_CODES.JELLY_BEAN) public android.database.Cursor query(androidx.sqlite.db.SupportSQLiteQuery query, android.os.CancellationSignal? cancellationSignal);
+    method @RequiresApi(api=android.os.Build.VERSION_CODES.JELLY_BEAN) public void setForeignKeyConstraintsEnabled(boolean enabled);
+    method public void setLocale(java.util.Locale locale);
+    method public void setMaxSqlCacheSize(int cacheSize);
+    method public long setMaximumSize(long numBytes);
+    method public void setPageSize(long);
+    method public void setTransactionSuccessful();
+    method public void setVersion(int);
+    method public int update(String table, int conflictAlgorithm, android.content.ContentValues values, String? whereClause, Object![]? whereArgs);
+    method public boolean yieldIfContendedSafely();
+    method public boolean yieldIfContendedSafely(long sleepAfterYieldDelayMillis);
+    property public abstract java.util.List<android.util.Pair<java.lang.String,java.lang.String>>? attachedDbs;
+    property public abstract boolean isDatabaseIntegrityOk;
+    property public abstract boolean isDbLockedByCurrentThread;
+    property public default boolean isExecPerConnectionSQLSupported;
+    property public abstract boolean isOpen;
+    property public abstract boolean isReadOnly;
+    property @RequiresApi(api=android.os.Build.VERSION_CODES.JELLY_BEAN) public abstract boolean isWriteAheadLoggingEnabled;
+    property public abstract long maximumSize;
+    property public abstract long pageSize;
+    property public abstract String? path;
+    property public abstract int version;
+  }
+
+  public interface SupportSQLiteOpenHelper extends java.io.Closeable {
+    method public void close();
+    method public String? getDatabaseName();
+    method public androidx.sqlite.db.SupportSQLiteDatabase getReadableDatabase();
+    method public androidx.sqlite.db.SupportSQLiteDatabase getWritableDatabase();
+    method @RequiresApi(api=android.os.Build.VERSION_CODES.JELLY_BEAN) public void setWriteAheadLoggingEnabled(boolean enabled);
+    property public abstract String? databaseName;
+    property public abstract androidx.sqlite.db.SupportSQLiteDatabase readableDatabase;
+    property public abstract androidx.sqlite.db.SupportSQLiteDatabase writableDatabase;
+  }
+
+  public abstract static class SupportSQLiteOpenHelper.Callback {
+    ctor public SupportSQLiteOpenHelper.Callback(int version);
+    method public void onConfigure(androidx.sqlite.db.SupportSQLiteDatabase db);
+    method public void onCorruption(androidx.sqlite.db.SupportSQLiteDatabase db);
+    method public abstract void onCreate(androidx.sqlite.db.SupportSQLiteDatabase db);
+    method public void onDowngrade(androidx.sqlite.db.SupportSQLiteDatabase db, int oldVersion, int newVersion);
+    method public void onOpen(androidx.sqlite.db.SupportSQLiteDatabase db);
+    method public abstract void onUpgrade(androidx.sqlite.db.SupportSQLiteDatabase db, int oldVersion, int newVersion);
+    field public final int version;
+  }
+
+  public static final class SupportSQLiteOpenHelper.Configuration {
+    ctor public SupportSQLiteOpenHelper.Configuration(android.content.Context context, String? name, androidx.sqlite.db.SupportSQLiteOpenHelper.Callback callback, optional boolean useNoBackupDirectory, optional boolean allowDataLossOnRecovery);
+    method public static androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration.Builder builder(android.content.Context context);
+    field public static final androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration.Companion Companion;
+    field public final boolean allowDataLossOnRecovery;
+    field public final androidx.sqlite.db.SupportSQLiteOpenHelper.Callback callback;
+    field public final android.content.Context context;
+    field public final String? name;
+    field public final boolean useNoBackupDirectory;
+  }
+
+  public static class SupportSQLiteOpenHelper.Configuration.Builder {
+    method public androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration.Builder allowDataLossOnRecovery(boolean allowDataLossOnRecovery);
+    method public androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration build();
+    method public androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration.Builder callback(androidx.sqlite.db.SupportSQLiteOpenHelper.Callback callback);
+    method public androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration.Builder name(String? name);
+    method public androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration.Builder noBackupDirectory(boolean useNoBackupDirectory);
+  }
+
+  public static final class SupportSQLiteOpenHelper.Configuration.Companion {
+    method public androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration.Builder builder(android.content.Context context);
+  }
+
+  public static fun interface SupportSQLiteOpenHelper.Factory {
+    method public androidx.sqlite.db.SupportSQLiteOpenHelper create(androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration configuration);
+  }
+
+  public interface SupportSQLiteProgram extends java.io.Closeable {
+    method public void bindBlob(int index, byte[] value);
+    method public void bindDouble(int index, double value);
+    method public void bindLong(int index, long value);
+    method public void bindNull(int index);
+    method public void bindString(int index, String value);
+    method public void clearBindings();
+  }
+
+  public interface SupportSQLiteQuery {
+    method public void bindTo(androidx.sqlite.db.SupportSQLiteProgram statement);
+    method public int getArgCount();
+    method public String getSql();
+    property public abstract int argCount;
+    property public abstract String sql;
+  }
+
+  public final class SupportSQLiteQueryBuilder {
+    method public static androidx.sqlite.db.SupportSQLiteQueryBuilder builder(String tableName);
+    method public androidx.sqlite.db.SupportSQLiteQueryBuilder columns(String![]? columns);
+    method public androidx.sqlite.db.SupportSQLiteQuery create();
+    method public androidx.sqlite.db.SupportSQLiteQueryBuilder distinct();
+    method public androidx.sqlite.db.SupportSQLiteQueryBuilder groupBy(String? groupBy);
+    method public androidx.sqlite.db.SupportSQLiteQueryBuilder having(String? having);
+    method public androidx.sqlite.db.SupportSQLiteQueryBuilder limit(String limit);
+    method public androidx.sqlite.db.SupportSQLiteQueryBuilder orderBy(String? orderBy);
+    method public androidx.sqlite.db.SupportSQLiteQueryBuilder selection(String? selection, Object![]? bindArgs);
+    field public static final androidx.sqlite.db.SupportSQLiteQueryBuilder.Companion Companion;
+  }
+
+  public static final class SupportSQLiteQueryBuilder.Companion {
+    method public androidx.sqlite.db.SupportSQLiteQueryBuilder builder(String tableName);
+  }
+
+  public interface SupportSQLiteStatement extends androidx.sqlite.db.SupportSQLiteProgram {
+    method public void execute();
+    method public long executeInsert();
+    method public int executeUpdateDelete();
+    method public long simpleQueryForLong();
+    method public String? simpleQueryForString();
+  }
+
+}
+
diff --git a/sqlite/sqlite/api/public_plus_experimental_2.3.0-beta01.txt b/sqlite/sqlite/api/public_plus_experimental_2.3.0-beta01.txt
new file mode 100644
index 0000000..d416831
--- /dev/null
+++ b/sqlite/sqlite/api/public_plus_experimental_2.3.0-beta01.txt
@@ -0,0 +1,166 @@
+// Signature format: 4.0
+package androidx.sqlite.db {
+
+  public final class SimpleSQLiteQuery implements androidx.sqlite.db.SupportSQLiteQuery {
+    ctor public SimpleSQLiteQuery(String query, Object![]? bindArgs);
+    ctor public SimpleSQLiteQuery(String query);
+    method public static void bind(androidx.sqlite.db.SupportSQLiteProgram statement, Object![]? bindArgs);
+    method public void bindTo(androidx.sqlite.db.SupportSQLiteProgram statement);
+    method public int getArgCount();
+    method public String getSql();
+    property public int argCount;
+    property public String sql;
+    field public static final androidx.sqlite.db.SimpleSQLiteQuery.Companion Companion;
+  }
+
+  public static final class SimpleSQLiteQuery.Companion {
+    method public void bind(androidx.sqlite.db.SupportSQLiteProgram statement, Object![]? bindArgs);
+  }
+
+  public interface SupportSQLiteDatabase extends java.io.Closeable {
+    method public void beginTransaction();
+    method public void beginTransactionNonExclusive();
+    method public void beginTransactionWithListener(android.database.sqlite.SQLiteTransactionListener transactionListener);
+    method public void beginTransactionWithListenerNonExclusive(android.database.sqlite.SQLiteTransactionListener transactionListener);
+    method public androidx.sqlite.db.SupportSQLiteStatement compileStatement(String sql);
+    method public int delete(String table, String? whereClause, Object![]? whereArgs);
+    method @RequiresApi(api=android.os.Build.VERSION_CODES.JELLY_BEAN) public void disableWriteAheadLogging();
+    method public boolean enableWriteAheadLogging();
+    method public void endTransaction();
+    method public default void execPerConnectionSQL(String sql, Object![]? bindArgs);
+    method @kotlin.jvm.Throws(exceptionClasses=SQLException::class) public void execSQL(String sql) throws android.database.SQLException;
+    method @kotlin.jvm.Throws(exceptionClasses=SQLException::class) public void execSQL(String sql, Object![] bindArgs) throws android.database.SQLException;
+    method public java.util.List<android.util.Pair<java.lang.String,java.lang.String>>? getAttachedDbs();
+    method public long getMaximumSize();
+    method public long getPageSize();
+    method public String? getPath();
+    method public int getVersion();
+    method public boolean inTransaction();
+    method @kotlin.jvm.Throws(exceptionClasses=SQLException::class) public long insert(String table, int conflictAlgorithm, android.content.ContentValues values) throws android.database.SQLException;
+    method public boolean isDatabaseIntegrityOk();
+    method public boolean isDbLockedByCurrentThread();
+    method public default boolean isExecPerConnectionSQLSupported();
+    method public boolean isOpen();
+    method public boolean isReadOnly();
+    method @RequiresApi(api=android.os.Build.VERSION_CODES.JELLY_BEAN) public boolean isWriteAheadLoggingEnabled();
+    method public boolean needUpgrade(int newVersion);
+    method public android.database.Cursor query(String query);
+    method public android.database.Cursor query(String query, Object![] bindArgs);
+    method public android.database.Cursor query(androidx.sqlite.db.SupportSQLiteQuery query);
+    method @RequiresApi(api=android.os.Build.VERSION_CODES.JELLY_BEAN) public android.database.Cursor query(androidx.sqlite.db.SupportSQLiteQuery query, android.os.CancellationSignal? cancellationSignal);
+    method @RequiresApi(api=android.os.Build.VERSION_CODES.JELLY_BEAN) public void setForeignKeyConstraintsEnabled(boolean enabled);
+    method public void setLocale(java.util.Locale locale);
+    method public void setMaxSqlCacheSize(int cacheSize);
+    method public long setMaximumSize(long numBytes);
+    method public void setPageSize(long);
+    method public void setTransactionSuccessful();
+    method public void setVersion(int);
+    method public int update(String table, int conflictAlgorithm, android.content.ContentValues values, String? whereClause, Object![]? whereArgs);
+    method public boolean yieldIfContendedSafely();
+    method public boolean yieldIfContendedSafely(long sleepAfterYieldDelayMillis);
+    property public abstract java.util.List<android.util.Pair<java.lang.String,java.lang.String>>? attachedDbs;
+    property public abstract boolean isDatabaseIntegrityOk;
+    property public abstract boolean isDbLockedByCurrentThread;
+    property public default boolean isExecPerConnectionSQLSupported;
+    property public abstract boolean isOpen;
+    property public abstract boolean isReadOnly;
+    property @RequiresApi(api=android.os.Build.VERSION_CODES.JELLY_BEAN) public abstract boolean isWriteAheadLoggingEnabled;
+    property public abstract long maximumSize;
+    property public abstract long pageSize;
+    property public abstract String? path;
+    property public abstract int version;
+  }
+
+  public interface SupportSQLiteOpenHelper extends java.io.Closeable {
+    method public void close();
+    method public String? getDatabaseName();
+    method public androidx.sqlite.db.SupportSQLiteDatabase getReadableDatabase();
+    method public androidx.sqlite.db.SupportSQLiteDatabase getWritableDatabase();
+    method @RequiresApi(api=android.os.Build.VERSION_CODES.JELLY_BEAN) public void setWriteAheadLoggingEnabled(boolean enabled);
+    property public abstract String? databaseName;
+    property public abstract androidx.sqlite.db.SupportSQLiteDatabase readableDatabase;
+    property public abstract androidx.sqlite.db.SupportSQLiteDatabase writableDatabase;
+  }
+
+  public abstract static class SupportSQLiteOpenHelper.Callback {
+    ctor public SupportSQLiteOpenHelper.Callback(int version);
+    method public void onConfigure(androidx.sqlite.db.SupportSQLiteDatabase db);
+    method public void onCorruption(androidx.sqlite.db.SupportSQLiteDatabase db);
+    method public abstract void onCreate(androidx.sqlite.db.SupportSQLiteDatabase db);
+    method public void onDowngrade(androidx.sqlite.db.SupportSQLiteDatabase db, int oldVersion, int newVersion);
+    method public void onOpen(androidx.sqlite.db.SupportSQLiteDatabase db);
+    method public abstract void onUpgrade(androidx.sqlite.db.SupportSQLiteDatabase db, int oldVersion, int newVersion);
+    field public final int version;
+  }
+
+  public static final class SupportSQLiteOpenHelper.Configuration {
+    ctor public SupportSQLiteOpenHelper.Configuration(android.content.Context context, String? name, androidx.sqlite.db.SupportSQLiteOpenHelper.Callback callback, optional boolean useNoBackupDirectory, optional boolean allowDataLossOnRecovery);
+    method public static androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration.Builder builder(android.content.Context context);
+    field public static final androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration.Companion Companion;
+    field public final boolean allowDataLossOnRecovery;
+    field public final androidx.sqlite.db.SupportSQLiteOpenHelper.Callback callback;
+    field public final android.content.Context context;
+    field public final String? name;
+    field public final boolean useNoBackupDirectory;
+  }
+
+  public static class SupportSQLiteOpenHelper.Configuration.Builder {
+    method public androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration.Builder allowDataLossOnRecovery(boolean allowDataLossOnRecovery);
+    method public androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration build();
+    method public androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration.Builder callback(androidx.sqlite.db.SupportSQLiteOpenHelper.Callback callback);
+    method public androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration.Builder name(String? name);
+    method public androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration.Builder noBackupDirectory(boolean useNoBackupDirectory);
+  }
+
+  public static final class SupportSQLiteOpenHelper.Configuration.Companion {
+    method public androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration.Builder builder(android.content.Context context);
+  }
+
+  public static fun interface SupportSQLiteOpenHelper.Factory {
+    method public androidx.sqlite.db.SupportSQLiteOpenHelper create(androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration configuration);
+  }
+
+  public interface SupportSQLiteProgram extends java.io.Closeable {
+    method public void bindBlob(int index, byte[] value);
+    method public void bindDouble(int index, double value);
+    method public void bindLong(int index, long value);
+    method public void bindNull(int index);
+    method public void bindString(int index, String value);
+    method public void clearBindings();
+  }
+
+  public interface SupportSQLiteQuery {
+    method public void bindTo(androidx.sqlite.db.SupportSQLiteProgram statement);
+    method public int getArgCount();
+    method public String getSql();
+    property public abstract int argCount;
+    property public abstract String sql;
+  }
+
+  public final class SupportSQLiteQueryBuilder {
+    method public static androidx.sqlite.db.SupportSQLiteQueryBuilder builder(String tableName);
+    method public androidx.sqlite.db.SupportSQLiteQueryBuilder columns(String![]? columns);
+    method public androidx.sqlite.db.SupportSQLiteQuery create();
+    method public androidx.sqlite.db.SupportSQLiteQueryBuilder distinct();
+    method public androidx.sqlite.db.SupportSQLiteQueryBuilder groupBy(String? groupBy);
+    method public androidx.sqlite.db.SupportSQLiteQueryBuilder having(String? having);
+    method public androidx.sqlite.db.SupportSQLiteQueryBuilder limit(String limit);
+    method public androidx.sqlite.db.SupportSQLiteQueryBuilder orderBy(String? orderBy);
+    method public androidx.sqlite.db.SupportSQLiteQueryBuilder selection(String? selection, Object![]? bindArgs);
+    field public static final androidx.sqlite.db.SupportSQLiteQueryBuilder.Companion Companion;
+  }
+
+  public static final class SupportSQLiteQueryBuilder.Companion {
+    method public androidx.sqlite.db.SupportSQLiteQueryBuilder builder(String tableName);
+  }
+
+  public interface SupportSQLiteStatement extends androidx.sqlite.db.SupportSQLiteProgram {
+    method public void execute();
+    method public long executeInsert();
+    method public int executeUpdateDelete();
+    method public long simpleQueryForLong();
+    method public String? simpleQueryForString();
+  }
+
+}
+
diff --git a/sqlite/sqlite/api/res-2.3.0-beta01.txt b/sqlite/sqlite/api/res-2.3.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/sqlite/sqlite/api/res-2.3.0-beta01.txt
diff --git a/sqlite/sqlite/api/restricted_2.3.0-beta01.txt b/sqlite/sqlite/api/restricted_2.3.0-beta01.txt
new file mode 100644
index 0000000..d416831
--- /dev/null
+++ b/sqlite/sqlite/api/restricted_2.3.0-beta01.txt
@@ -0,0 +1,166 @@
+// Signature format: 4.0
+package androidx.sqlite.db {
+
+  public final class SimpleSQLiteQuery implements androidx.sqlite.db.SupportSQLiteQuery {
+    ctor public SimpleSQLiteQuery(String query, Object![]? bindArgs);
+    ctor public SimpleSQLiteQuery(String query);
+    method public static void bind(androidx.sqlite.db.SupportSQLiteProgram statement, Object![]? bindArgs);
+    method public void bindTo(androidx.sqlite.db.SupportSQLiteProgram statement);
+    method public int getArgCount();
+    method public String getSql();
+    property public int argCount;
+    property public String sql;
+    field public static final androidx.sqlite.db.SimpleSQLiteQuery.Companion Companion;
+  }
+
+  public static final class SimpleSQLiteQuery.Companion {
+    method public void bind(androidx.sqlite.db.SupportSQLiteProgram statement, Object![]? bindArgs);
+  }
+
+  public interface SupportSQLiteDatabase extends java.io.Closeable {
+    method public void beginTransaction();
+    method public void beginTransactionNonExclusive();
+    method public void beginTransactionWithListener(android.database.sqlite.SQLiteTransactionListener transactionListener);
+    method public void beginTransactionWithListenerNonExclusive(android.database.sqlite.SQLiteTransactionListener transactionListener);
+    method public androidx.sqlite.db.SupportSQLiteStatement compileStatement(String sql);
+    method public int delete(String table, String? whereClause, Object![]? whereArgs);
+    method @RequiresApi(api=android.os.Build.VERSION_CODES.JELLY_BEAN) public void disableWriteAheadLogging();
+    method public boolean enableWriteAheadLogging();
+    method public void endTransaction();
+    method public default void execPerConnectionSQL(String sql, Object![]? bindArgs);
+    method @kotlin.jvm.Throws(exceptionClasses=SQLException::class) public void execSQL(String sql) throws android.database.SQLException;
+    method @kotlin.jvm.Throws(exceptionClasses=SQLException::class) public void execSQL(String sql, Object![] bindArgs) throws android.database.SQLException;
+    method public java.util.List<android.util.Pair<java.lang.String,java.lang.String>>? getAttachedDbs();
+    method public long getMaximumSize();
+    method public long getPageSize();
+    method public String? getPath();
+    method public int getVersion();
+    method public boolean inTransaction();
+    method @kotlin.jvm.Throws(exceptionClasses=SQLException::class) public long insert(String table, int conflictAlgorithm, android.content.ContentValues values) throws android.database.SQLException;
+    method public boolean isDatabaseIntegrityOk();
+    method public boolean isDbLockedByCurrentThread();
+    method public default boolean isExecPerConnectionSQLSupported();
+    method public boolean isOpen();
+    method public boolean isReadOnly();
+    method @RequiresApi(api=android.os.Build.VERSION_CODES.JELLY_BEAN) public boolean isWriteAheadLoggingEnabled();
+    method public boolean needUpgrade(int newVersion);
+    method public android.database.Cursor query(String query);
+    method public android.database.Cursor query(String query, Object![] bindArgs);
+    method public android.database.Cursor query(androidx.sqlite.db.SupportSQLiteQuery query);
+    method @RequiresApi(api=android.os.Build.VERSION_CODES.JELLY_BEAN) public android.database.Cursor query(androidx.sqlite.db.SupportSQLiteQuery query, android.os.CancellationSignal? cancellationSignal);
+    method @RequiresApi(api=android.os.Build.VERSION_CODES.JELLY_BEAN) public void setForeignKeyConstraintsEnabled(boolean enabled);
+    method public void setLocale(java.util.Locale locale);
+    method public void setMaxSqlCacheSize(int cacheSize);
+    method public long setMaximumSize(long numBytes);
+    method public void setPageSize(long);
+    method public void setTransactionSuccessful();
+    method public void setVersion(int);
+    method public int update(String table, int conflictAlgorithm, android.content.ContentValues values, String? whereClause, Object![]? whereArgs);
+    method public boolean yieldIfContendedSafely();
+    method public boolean yieldIfContendedSafely(long sleepAfterYieldDelayMillis);
+    property public abstract java.util.List<android.util.Pair<java.lang.String,java.lang.String>>? attachedDbs;
+    property public abstract boolean isDatabaseIntegrityOk;
+    property public abstract boolean isDbLockedByCurrentThread;
+    property public default boolean isExecPerConnectionSQLSupported;
+    property public abstract boolean isOpen;
+    property public abstract boolean isReadOnly;
+    property @RequiresApi(api=android.os.Build.VERSION_CODES.JELLY_BEAN) public abstract boolean isWriteAheadLoggingEnabled;
+    property public abstract long maximumSize;
+    property public abstract long pageSize;
+    property public abstract String? path;
+    property public abstract int version;
+  }
+
+  public interface SupportSQLiteOpenHelper extends java.io.Closeable {
+    method public void close();
+    method public String? getDatabaseName();
+    method public androidx.sqlite.db.SupportSQLiteDatabase getReadableDatabase();
+    method public androidx.sqlite.db.SupportSQLiteDatabase getWritableDatabase();
+    method @RequiresApi(api=android.os.Build.VERSION_CODES.JELLY_BEAN) public void setWriteAheadLoggingEnabled(boolean enabled);
+    property public abstract String? databaseName;
+    property public abstract androidx.sqlite.db.SupportSQLiteDatabase readableDatabase;
+    property public abstract androidx.sqlite.db.SupportSQLiteDatabase writableDatabase;
+  }
+
+  public abstract static class SupportSQLiteOpenHelper.Callback {
+    ctor public SupportSQLiteOpenHelper.Callback(int version);
+    method public void onConfigure(androidx.sqlite.db.SupportSQLiteDatabase db);
+    method public void onCorruption(androidx.sqlite.db.SupportSQLiteDatabase db);
+    method public abstract void onCreate(androidx.sqlite.db.SupportSQLiteDatabase db);
+    method public void onDowngrade(androidx.sqlite.db.SupportSQLiteDatabase db, int oldVersion, int newVersion);
+    method public void onOpen(androidx.sqlite.db.SupportSQLiteDatabase db);
+    method public abstract void onUpgrade(androidx.sqlite.db.SupportSQLiteDatabase db, int oldVersion, int newVersion);
+    field public final int version;
+  }
+
+  public static final class SupportSQLiteOpenHelper.Configuration {
+    ctor public SupportSQLiteOpenHelper.Configuration(android.content.Context context, String? name, androidx.sqlite.db.SupportSQLiteOpenHelper.Callback callback, optional boolean useNoBackupDirectory, optional boolean allowDataLossOnRecovery);
+    method public static androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration.Builder builder(android.content.Context context);
+    field public static final androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration.Companion Companion;
+    field public final boolean allowDataLossOnRecovery;
+    field public final androidx.sqlite.db.SupportSQLiteOpenHelper.Callback callback;
+    field public final android.content.Context context;
+    field public final String? name;
+    field public final boolean useNoBackupDirectory;
+  }
+
+  public static class SupportSQLiteOpenHelper.Configuration.Builder {
+    method public androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration.Builder allowDataLossOnRecovery(boolean allowDataLossOnRecovery);
+    method public androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration build();
+    method public androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration.Builder callback(androidx.sqlite.db.SupportSQLiteOpenHelper.Callback callback);
+    method public androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration.Builder name(String? name);
+    method public androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration.Builder noBackupDirectory(boolean useNoBackupDirectory);
+  }
+
+  public static final class SupportSQLiteOpenHelper.Configuration.Companion {
+    method public androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration.Builder builder(android.content.Context context);
+  }
+
+  public static fun interface SupportSQLiteOpenHelper.Factory {
+    method public androidx.sqlite.db.SupportSQLiteOpenHelper create(androidx.sqlite.db.SupportSQLiteOpenHelper.Configuration configuration);
+  }
+
+  public interface SupportSQLiteProgram extends java.io.Closeable {
+    method public void bindBlob(int index, byte[] value);
+    method public void bindDouble(int index, double value);
+    method public void bindLong(int index, long value);
+    method public void bindNull(int index);
+    method public void bindString(int index, String value);
+    method public void clearBindings();
+  }
+
+  public interface SupportSQLiteQuery {
+    method public void bindTo(androidx.sqlite.db.SupportSQLiteProgram statement);
+    method public int getArgCount();
+    method public String getSql();
+    property public abstract int argCount;
+    property public abstract String sql;
+  }
+
+  public final class SupportSQLiteQueryBuilder {
+    method public static androidx.sqlite.db.SupportSQLiteQueryBuilder builder(String tableName);
+    method public androidx.sqlite.db.SupportSQLiteQueryBuilder columns(String![]? columns);
+    method public androidx.sqlite.db.SupportSQLiteQuery create();
+    method public androidx.sqlite.db.SupportSQLiteQueryBuilder distinct();
+    method public androidx.sqlite.db.SupportSQLiteQueryBuilder groupBy(String? groupBy);
+    method public androidx.sqlite.db.SupportSQLiteQueryBuilder having(String? having);
+    method public androidx.sqlite.db.SupportSQLiteQueryBuilder limit(String limit);
+    method public androidx.sqlite.db.SupportSQLiteQueryBuilder orderBy(String? orderBy);
+    method public androidx.sqlite.db.SupportSQLiteQueryBuilder selection(String? selection, Object![]? bindArgs);
+    field public static final androidx.sqlite.db.SupportSQLiteQueryBuilder.Companion Companion;
+  }
+
+  public static final class SupportSQLiteQueryBuilder.Companion {
+    method public androidx.sqlite.db.SupportSQLiteQueryBuilder builder(String tableName);
+  }
+
+  public interface SupportSQLiteStatement extends androidx.sqlite.db.SupportSQLiteProgram {
+    method public void execute();
+    method public long executeInsert();
+    method public int executeUpdateDelete();
+    method public long simpleQueryForLong();
+    method public String? simpleQueryForString();
+  }
+
+}
+
diff --git a/sqlite/sqlite/lint-baseline.xml b/sqlite/sqlite/lint-baseline.xml
deleted file mode 100644
index 58c8b41..0000000
--- a/sqlite/sqlite/lint-baseline.xml
+++ /dev/null
@@ -1,157 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
-        errorLine1="    public static SupportSQLiteQueryBuilder builder(String tableName) {"
-        errorLine2="                  ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/sqlite/db/SupportSQLiteQueryBuilder.java"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
-        errorLine1="    public static SupportSQLiteQueryBuilder builder(String tableName) {"
-        errorLine2="                                                    ~~~~~~">
-        <location
-            file="src/main/java/androidx/sqlite/db/SupportSQLiteQueryBuilder.java"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
-        errorLine1="    public SupportSQLiteQueryBuilder distinct() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/sqlite/db/SupportSQLiteQueryBuilder.java"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
-        errorLine1="    public SupportSQLiteQueryBuilder columns(String[] columns) {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/sqlite/db/SupportSQLiteQueryBuilder.java"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
-        errorLine1="    public SupportSQLiteQueryBuilder columns(String[] columns) {"
-        errorLine2="                                             ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/sqlite/db/SupportSQLiteQueryBuilder.java"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
-        errorLine1="    public SupportSQLiteQueryBuilder selection(String selection, Object[] bindArgs) {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/sqlite/db/SupportSQLiteQueryBuilder.java"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
-        errorLine1="    public SupportSQLiteQueryBuilder selection(String selection, Object[] bindArgs) {"
-        errorLine2="                                               ~~~~~~">
-        <location
-            file="src/main/java/androidx/sqlite/db/SupportSQLiteQueryBuilder.java"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
-        errorLine1="    public SupportSQLiteQueryBuilder selection(String selection, Object[] bindArgs) {"
-        errorLine2="                                                                 ~~~~~~~~">
-        <location
-            file="src/main/java/androidx/sqlite/db/SupportSQLiteQueryBuilder.java"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
-        errorLine1="    public SupportSQLiteQueryBuilder groupBy(String groupBy) {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/sqlite/db/SupportSQLiteQueryBuilder.java"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
-        errorLine1="    public SupportSQLiteQueryBuilder groupBy(String groupBy) {"
-        errorLine2="                                             ~~~~~~">
-        <location
-            file="src/main/java/androidx/sqlite/db/SupportSQLiteQueryBuilder.java"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
-        errorLine1="    public SupportSQLiteQueryBuilder having(String having) {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/sqlite/db/SupportSQLiteQueryBuilder.java"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
-        errorLine1="    public SupportSQLiteQueryBuilder having(String having) {"
-        errorLine2="                                            ~~~~~~">
-        <location
-            file="src/main/java/androidx/sqlite/db/SupportSQLiteQueryBuilder.java"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
-        errorLine1="    public SupportSQLiteQueryBuilder orderBy(String orderBy) {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/sqlite/db/SupportSQLiteQueryBuilder.java"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
-        errorLine1="    public SupportSQLiteQueryBuilder orderBy(String orderBy) {"
-        errorLine2="                                             ~~~~~~">
-        <location
-            file="src/main/java/androidx/sqlite/db/SupportSQLiteQueryBuilder.java"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
-        errorLine1="    public SupportSQLiteQueryBuilder limit(String limit) {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/sqlite/db/SupportSQLiteQueryBuilder.java"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
-        errorLine1="    public SupportSQLiteQueryBuilder limit(String limit) {"
-        errorLine2="                                           ~~~~~~">
-        <location
-            file="src/main/java/androidx/sqlite/db/SupportSQLiteQueryBuilder.java"/>
-    </issue>
-
-    <issue
-        id="UnknownNullness"
-        message="Unknown nullability; explicitly declare as `@Nullable` or `@NonNull` to improve Kotlin interoperability; see https://developer.android.com/kotlin/interop#nullability_annotations"
-        errorLine1="    public SupportSQLiteQuery create() {"
-        errorLine2="           ~~~~~~~~~~~~~~~~~~">
-        <location
-            file="src/main/java/androidx/sqlite/db/SupportSQLiteQueryBuilder.java"/>
-    </issue>
-
-</issues>
diff --git a/test/screenshot/screenshot-paparazzi/build.gradle b/test/screenshot/screenshot-layoutlib/build.gradle
similarity index 100%
rename from test/screenshot/screenshot-paparazzi/build.gradle
rename to test/screenshot/screenshot-layoutlib/build.gradle
diff --git a/test/screenshot/screenshot-paparazzi/src/main/kotlin/androidx/test/screenshot/paparazzi/AndroidXPaparazziTestRule.kt b/test/screenshot/screenshot-layoutlib/src/main/kotlin/androidx/test/screenshot/layoutlib/AndroidXLayoutlibTestRule.kt
similarity index 91%
rename from test/screenshot/screenshot-paparazzi/src/main/kotlin/androidx/test/screenshot/paparazzi/AndroidXPaparazziTestRule.kt
rename to test/screenshot/screenshot-layoutlib/src/main/kotlin/androidx/test/screenshot/layoutlib/AndroidXLayoutlibTestRule.kt
index aa727e0..3ae6ebf 100644
--- a/test/screenshot/screenshot-paparazzi/src/main/kotlin/androidx/test/screenshot/paparazzi/AndroidXPaparazziTestRule.kt
+++ b/test/screenshot/screenshot-layoutlib/src/main/kotlin/androidx/test/screenshot/layoutlib/AndroidXLayoutlibTestRule.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.test.screenshot.paparazzi
+package androidx.test.screenshot.layoutlib
 
 import app.cash.paparazzi.DeviceConfig
 import app.cash.paparazzi.Environment
@@ -25,7 +25,7 @@
 /**
  * Creates a [Paparazzi] test rule configured from system properties for AndroidX tests.
  */
-fun AndroidXPaparazziTestRule(
+fun AndroidXLayoutlibTestRule(
     deviceConfig: DeviceConfig = DeviceConfig.NEXUS_5.copy(softButtons = false),
     theme: String = "android:Theme.Material.NoActionBar.Fullscreen",
     renderingMode: RenderingMode = RenderingMode.NORMAL,
@@ -51,13 +51,13 @@
 )
 
 /** Package name used for resolving system properties */
-private const val PACKAGE_NAME = "androidx.test.screenshot.paparazzi"
+private const val PACKAGE_NAME = "androidx.test.screenshot.layoutlib"
 
 /** Read a system property with [PACKAGE_NAME] prefix, throwing an exception if missing */
 private fun systemProperty(name: String) =
     requireNotNull(System.getProperty("$PACKAGE_NAME.$name")) {
         "System property $PACKAGE_NAME.$name is not set. You may need to apply " +
-            "AndroidXPaparazziPlugin to your Gradle build."
+            "AndroidXLayoutlibPlugin to your Gradle build."
     }
 
 /** Little helper to convert string path to [File] to improve readability */
diff --git a/test/screenshot/screenshot-paparazzi/src/main/kotlin/androidx/test/screenshot/paparazzi/GoldenVerifier.kt b/test/screenshot/screenshot-layoutlib/src/main/kotlin/androidx/test/screenshot/layoutlib/GoldenVerifier.kt
similarity index 99%
rename from test/screenshot/screenshot-paparazzi/src/main/kotlin/androidx/test/screenshot/paparazzi/GoldenVerifier.kt
rename to test/screenshot/screenshot-layoutlib/src/main/kotlin/androidx/test/screenshot/layoutlib/GoldenVerifier.kt
index 1e58c90..f58a421 100644
--- a/test/screenshot/screenshot-paparazzi/src/main/kotlin/androidx/test/screenshot/paparazzi/GoldenVerifier.kt
+++ b/test/screenshot/screenshot-layoutlib/src/main/kotlin/androidx/test/screenshot/layoutlib/GoldenVerifier.kt
@@ -14,7 +14,7 @@
  * limitations under the License.
  */
 
-package androidx.test.screenshot.paparazzi
+package androidx.test.screenshot.layoutlib
 
 import androidx.test.screenshot.proto.ScreenshotResultProto.ScreenshotResult
 import androidx.test.screenshot.proto.ScreenshotResultProto.ScreenshotResult.Status
diff --git a/test/screenshot/screenshot-paparazzi/src/main/kotlin/androidx/test/screenshot/paparazzi/ImageDiffer.kt b/test/screenshot/screenshot-layoutlib/src/main/kotlin/androidx/test/screenshot/layoutlib/ImageDiffer.kt
similarity index 97%
rename from test/screenshot/screenshot-paparazzi/src/main/kotlin/androidx/test/screenshot/paparazzi/ImageDiffer.kt
rename to test/screenshot/screenshot-layoutlib/src/main/kotlin/androidx/test/screenshot/layoutlib/ImageDiffer.kt
index 72e9e99..d82adce 100644
--- a/test/screenshot/screenshot-paparazzi/src/main/kotlin/androidx/test/screenshot/paparazzi/ImageDiffer.kt
+++ b/test/screenshot/screenshot-layoutlib/src/main/kotlin/androidx/test/screenshot/layoutlib/ImageDiffer.kt
@@ -14,9 +14,9 @@
  * limitations under the License.
  */
 
-package androidx.test.screenshot.paparazzi
+package androidx.test.screenshot.layoutlib
 
-import androidx.test.screenshot.paparazzi.ImageDiffer.DiffResult.Similar
+import androidx.test.screenshot.layoutlib.ImageDiffer.DiffResult.Similar
 import java.awt.image.BufferedImage
 
 /**
diff --git a/test/screenshot/screenshot-paparazzi/src/test/kotlin/androidx/test/screenshot/paparazzi/GoldenVerifierTest.kt b/test/screenshot/screenshot-layoutlib/src/test/kotlin/androidx/test/screenshot/paparazzi/GoldenVerifierTest.kt
similarity index 98%
rename from test/screenshot/screenshot-paparazzi/src/test/kotlin/androidx/test/screenshot/paparazzi/GoldenVerifierTest.kt
rename to test/screenshot/screenshot-layoutlib/src/test/kotlin/androidx/test/screenshot/paparazzi/GoldenVerifierTest.kt
index cbaa845..1200d53 100644
--- a/test/screenshot/screenshot-paparazzi/src/test/kotlin/androidx/test/screenshot/paparazzi/GoldenVerifierTest.kt
+++ b/test/screenshot/screenshot-layoutlib/src/test/kotlin/androidx/test/screenshot/paparazzi/GoldenVerifierTest.kt
@@ -16,6 +16,8 @@
 
 package androidx.test.screenshot.paparazzi
 
+import androidx.test.screenshot.layoutlib.GoldenVerifier
+import androidx.test.screenshot.layoutlib.ImageDiffer
 import androidx.test.screenshot.proto.ScreenshotResultProto.ScreenshotResult
 import androidx.test.screenshot.proto.ScreenshotResultProto.ScreenshotResult.Status
 import app.cash.paparazzi.Snapshot
diff --git a/test/screenshot/screenshot-paparazzi/src/test/kotlin/androidx/test/screenshot/paparazzi/ImageDifferTest.kt b/test/screenshot/screenshot-layoutlib/src/test/kotlin/androidx/test/screenshot/paparazzi/ImageDifferTest.kt
similarity index 89%
rename from test/screenshot/screenshot-paparazzi/src/test/kotlin/androidx/test/screenshot/paparazzi/ImageDifferTest.kt
rename to test/screenshot/screenshot-layoutlib/src/test/kotlin/androidx/test/screenshot/paparazzi/ImageDifferTest.kt
index 341d454..092a5c9 100644
--- a/test/screenshot/screenshot-paparazzi/src/test/kotlin/androidx/test/screenshot/paparazzi/ImageDifferTest.kt
+++ b/test/screenshot/screenshot-layoutlib/src/test/kotlin/androidx/test/screenshot/paparazzi/ImageDifferTest.kt
@@ -16,9 +16,9 @@
 
 package androidx.test.screenshot.paparazzi
 
-import androidx.test.screenshot.paparazzi.ImageDiffer.DiffResult.Different
-import androidx.test.screenshot.paparazzi.ImageDiffer.DiffResult.Similar
-import androidx.test.screenshot.paparazzi.ImageDiffer.PixelPerfect
+import androidx.test.screenshot.layoutlib.ImageDiffer.DiffResult.Different
+import androidx.test.screenshot.layoutlib.ImageDiffer.DiffResult.Similar
+import androidx.test.screenshot.layoutlib.ImageDiffer.PixelPerfect
 import javax.imageio.ImageIO
 import kotlin.test.Test
 import kotlin.test.assertEquals
diff --git a/test/screenshot/screenshot-paparazzi/src/test/resources/androidx/test/screenshot/paparazzi/PixelPerfect_diff.png b/test/screenshot/screenshot-layoutlib/src/test/resources/androidx/test/screenshot/paparazzi/PixelPerfect_diff.png
similarity index 100%
rename from test/screenshot/screenshot-paparazzi/src/test/resources/androidx/test/screenshot/paparazzi/PixelPerfect_diff.png
rename to test/screenshot/screenshot-layoutlib/src/test/resources/androidx/test/screenshot/paparazzi/PixelPerfect_diff.png
Binary files differ
diff --git a/test/screenshot/screenshot-paparazzi/src/test/resources/androidx/test/screenshot/paparazzi/circle.png b/test/screenshot/screenshot-layoutlib/src/test/resources/androidx/test/screenshot/paparazzi/circle.png
similarity index 100%
rename from test/screenshot/screenshot-paparazzi/src/test/resources/androidx/test/screenshot/paparazzi/circle.png
rename to test/screenshot/screenshot-layoutlib/src/test/resources/androidx/test/screenshot/paparazzi/circle.png
Binary files differ
diff --git a/test/screenshot/screenshot-paparazzi/src/test/resources/androidx/test/screenshot/paparazzi/horizontal_rectangle.png b/test/screenshot/screenshot-layoutlib/src/test/resources/androidx/test/screenshot/paparazzi/horizontal_rectangle.png
similarity index 100%
rename from test/screenshot/screenshot-paparazzi/src/test/resources/androidx/test/screenshot/paparazzi/horizontal_rectangle.png
rename to test/screenshot/screenshot-layoutlib/src/test/resources/androidx/test/screenshot/paparazzi/horizontal_rectangle.png
Binary files differ
diff --git a/test/screenshot/screenshot-paparazzi/src/test/resources/androidx/test/screenshot/paparazzi/star.png b/test/screenshot/screenshot-layoutlib/src/test/resources/androidx/test/screenshot/paparazzi/star.png
similarity index 100%
rename from test/screenshot/screenshot-paparazzi/src/test/resources/androidx/test/screenshot/paparazzi/star.png
rename to test/screenshot/screenshot-layoutlib/src/test/resources/androidx/test/screenshot/paparazzi/star.png
Binary files differ
diff --git a/test/screenshot/screenshot-paparazzi/src/test/resources/androidx/test/screenshot/paparazzi/vertical_rectangle.png b/test/screenshot/screenshot-layoutlib/src/test/resources/androidx/test/screenshot/paparazzi/vertical_rectangle.png
similarity index 100%
rename from test/screenshot/screenshot-paparazzi/src/test/resources/androidx/test/screenshot/paparazzi/vertical_rectangle.png
rename to test/screenshot/screenshot-layoutlib/src/test/resources/androidx/test/screenshot/paparazzi/vertical_rectangle.png
Binary files differ
diff --git a/testutils/testutils-paging/src/main/java/androidx/paging/TestPagingSource.kt b/testutils/testutils-paging/src/main/java/androidx/paging/TestPagingSource.kt
index 786092d..a035f82 100644
--- a/testutils/testutils-paging/src/main/java/androidx/paging/TestPagingSource.kt
+++ b/testutils/testutils-paging/src/main/java/androidx/paging/TestPagingSource.kt
@@ -33,7 +33,8 @@
     override val jumpingSupported: Boolean = true,
     val items: List<Int> = ITEMS,
     private val loadDelay: Long = 1000,
-    private val loadDispatcher: CoroutineDispatcher = DirectDispatcher
+    private val loadDispatcher: CoroutineDispatcher = DirectDispatcher,
+    private val placeholdersEnabled: Boolean = true,
 ) : PagingSource<Int, Int>() {
     var errorNextLoad = false
     var nextLoadResult: LoadResult<Int, Int>? = null
@@ -86,8 +87,8 @@
             items.subList(start, end),
             if (start > 0) start - 1 else null,
             if (end < items.size) end else null,
-            start,
-            items.size - end
+            if (placeholdersEnabled) start else Int.MIN_VALUE,
+            if (placeholdersEnabled) (items.size - end) else Int.MIN_VALUE
         ).also {
             loadedPages.add(it)
         }
diff --git a/testutils/testutils-runtime/lint-baseline.xml b/testutils/testutils-runtime/lint-baseline.xml
index 2d2a7d3..8f6f992 100644
--- a/testutils/testutils-runtime/lint-baseline.xml
+++ b/testutils/testutils-runtime/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
+<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="cli" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
 
     <issue
         id="BanUncheckedReflection"
diff --git a/tv/tv-foundation/src/androidTest/java/androidx/tv/foundation/lazy/grid/LazyGridPrefetcherTest.kt b/tv/tv-foundation/src/androidTest/java/androidx/tv/foundation/lazy/grid/LazyGridPrefetcherTest.kt
index a2d095d..914a8d7 100644
--- a/tv/tv-foundation/src/androidTest/java/androidx/tv/foundation/lazy/grid/LazyGridPrefetcherTest.kt
+++ b/tv/tv-foundation/src/androidTest/java/androidx/tv/foundation/lazy/grid/LazyGridPrefetcherTest.kt
@@ -32,6 +32,7 @@
 import androidx.compose.ui.unit.dp
 import androidx.test.filters.LargeTest
 import androidx.tv.foundation.lazy.AutoTestFrameClock
+import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.runBlocking
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -59,7 +60,7 @@
 
     @Test
     fun notPrefetchingForwardInitially() {
-        composeList()
+        composeGrid()
 
         rule.onNodeWithTag("4")
             .assertDoesNotExist()
@@ -67,7 +68,7 @@
 
     @Test
     fun notPrefetchingBackwardInitially() {
-        composeList(firstItem = 4)
+        composeGrid(firstItem = 4)
 
         rule.onNodeWithTag("0")
             .assertDoesNotExist()
@@ -75,7 +76,7 @@
 
     @Test
     fun prefetchingForwardAfterSmallScroll() {
-        composeList()
+        composeGrid()
 
         rule.runOnIdle {
             runBlocking {
@@ -95,7 +96,7 @@
 
     @Test
     fun prefetchingBackwardAfterSmallScroll() {
-        composeList(firstItem = 4, itemOffset = 10)
+        composeGrid(firstItem = 4, itemOffset = 10)
 
         rule.runOnIdle {
             runBlocking {
@@ -115,7 +116,7 @@
 
     @Test
     fun prefetchingForwardAndBackward() {
-        composeList(firstItem = 2)
+        composeGrid(firstItem = 2)
 
         rule.runOnIdle {
             runBlocking {
@@ -151,7 +152,7 @@
 
     @Test
     fun prefetchingForwardTwice() {
-        composeList()
+        composeGrid()
 
         rule.runOnIdle {
             runBlocking {
@@ -180,7 +181,7 @@
 
     @Test
     fun prefetchingBackwardTwice() {
-        composeList(firstItem = 8)
+        composeGrid(firstItem = 8)
 
         rule.runOnIdle {
             runBlocking {
@@ -211,7 +212,7 @@
 
     @Test
     fun prefetchingForwardAndBackwardReverseLayout() {
-        composeList(firstItem = 2, reverseLayout = true)
+        composeGrid(firstItem = 2, reverseLayout = true)
 
         rule.runOnIdle {
             runBlocking {
@@ -252,7 +253,7 @@
     @Test
     fun prefetchingForwardAndBackwardWithContentPadding() {
         val halfItemSize = itemsSizeDp / 2f
-        composeList(
+        composeGrid(
             firstItem = 4,
             itemOffset = 5,
             contentPadding = PaddingValues(mainAxis = halfItemSize)
@@ -343,6 +344,40 @@
         rule.runOnIdle { }
     }
 
+    @Test
+    fun scrollingByListSizeCancelsPreviousPrefetch() {
+        composeGrid()
+
+        // now we have items 0-3 visible
+        rule.runOnIdle {
+            runBlocking(AutoTestFrameClock()) {
+                // this will move the viewport so items 2-5 are visible
+                // and schedule a prefetching for 6-7
+                state.scrollBy(itemsSizePx.toFloat())
+
+                // move viewport by screen size to items 8-11, so item 6 is just behind
+                // the first visible item
+                state.scrollBy(itemsSizePx * 3f)
+
+                // move scroll further to items 10-13, so item 6 is reused
+                state.scrollBy(itemsSizePx.toFloat())
+            }
+        }
+
+        waitForPrefetch(13)
+
+        rule.runOnIdle {
+            runBlocking(AutoTestFrameClock()) {
+                // scroll again to ensure item 6 was dropped
+                state.scrollBy(itemsSizePx * 100f)
+            }
+        }
+
+        rule.runOnIdle {
+            assertThat(activeNodes).doesNotContain(6)
+        }
+    }
+
     private fun waitForPrefetch(index: Int) {
         rule.waitUntil {
             activeNodes.contains(index) && activeMeasuredNodes.contains(index)
@@ -352,7 +387,7 @@
     private val activeNodes = mutableSetOf<Int>()
     private val activeMeasuredNodes = mutableSetOf<Int>()
 
-    private fun composeList(
+    private fun composeGrid(
         firstItem: Int = 0,
         itemOffset: Int = 0,
         reverseLayout: Boolean = false,
diff --git a/tv/tv-foundation/src/androidTest/java/androidx/tv/foundation/lazy/list/LazyListPrefetcherTest.kt b/tv/tv-foundation/src/androidTest/java/androidx/tv/foundation/lazy/list/LazyListPrefetcherTest.kt
index 14401a4..13f31cf 100644
--- a/tv/tv-foundation/src/androidTest/java/androidx/tv/foundation/lazy/list/LazyListPrefetcherTest.kt
+++ b/tv/tv-foundation/src/androidTest/java/androidx/tv/foundation/lazy/list/LazyListPrefetcherTest.kt
@@ -32,6 +32,7 @@
 import androidx.compose.ui.test.onNodeWithTag
 import androidx.compose.ui.unit.dp
 import androidx.test.filters.LargeTest
+import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.runBlocking
 import org.junit.Test
 import org.junit.runner.RunWith
@@ -326,6 +327,40 @@
         rule.runOnIdle { }
     }
 
+    @Test
+    fun scrollingByListSizeCancelsPreviousPrefetch() {
+        composeList()
+
+        // now we have items 0-1 visible
+        rule.runOnIdle {
+            runBlocking(AutoTestFrameClock()) {
+                // this will move the viewport so items 1-2 are visible
+                // and schedule a prefetching for 3
+                state.scrollBy(itemsSizePx.toFloat())
+
+                // move viewport by screen size to items 4-5, so item 3 is just behind
+                // the first visible item
+                state.scrollBy(itemsSizePx * 3f)
+
+                // move scroll further to items 5-6, so item 3 is reused
+                state.scrollBy(itemsSizePx.toFloat())
+            }
+        }
+
+        waitForPrefetch(7)
+
+        rule.runOnIdle {
+            runBlocking(AutoTestFrameClock()) {
+                // scroll again to ensure item 3 was dropped
+                state.scrollBy(itemsSizePx * 100f)
+            }
+        }
+
+        rule.runOnIdle {
+            assertThat(activeNodes).doesNotContain(3)
+        }
+    }
+
     private fun waitForPrefetch(index: Int) {
         rule.waitUntil {
             activeNodes.contains(index) && activeMeasuredNodes.contains(index)
diff --git a/tv/tv-foundation/src/main/java/androidx/tv/foundation/lazy/grid/TvLazyGridState.kt b/tv/tv-foundation/src/main/java/androidx/tv/foundation/lazy/grid/TvLazyGridState.kt
index df4e4c2..42f4e83 100644
--- a/tv/tv-foundation/src/main/java/androidx/tv/foundation/lazy/grid/TvLazyGridState.kt
+++ b/tv/tv-foundation/src/main/java/androidx/tv/foundation/lazy/grid/TvLazyGridState.kt
@@ -343,6 +343,25 @@
         }
     }
 
+    private fun cancelPrefetchIfVisibleItemsChanged(info: TvLazyGridLayoutInfo) {
+        if (lineToPrefetch != -1 && info.visibleItemsInfo.isNotEmpty()) {
+            val expectedLineToPrefetch = if (wasScrollingForward) {
+                info.visibleItemsInfo.last().let {
+                    if (isVertical) it.row else it.column
+                } + 1
+            } else {
+                info.visibleItemsInfo.first().let {
+                    if (isVertical) it.row else it.column
+                } - 1
+            }
+            if (lineToPrefetch != expectedLineToPrefetch) {
+                lineToPrefetch = -1
+                currentLinePrefetchHandles.forEach { it.cancel() }
+                currentLinePrefetchHandles.clear()
+            }
+        }
+    }
+
     internal val prefetchState = LazyLayoutPrefetchState()
 
     /**
@@ -374,6 +393,8 @@
             result.firstVisibleLineScrollOffset != 0
 
         numMeasurePasses++
+
+        cancelPrefetchIfVisibleItemsChanged(result)
     }
 
     /**
diff --git a/tv/tv-foundation/src/main/java/androidx/tv/foundation/lazy/list/LazyListState.kt b/tv/tv-foundation/src/main/java/androidx/tv/foundation/lazy/list/LazyListState.kt
index 3328e28..6330923 100644
--- a/tv/tv-foundation/src/main/java/androidx/tv/foundation/lazy/list/LazyListState.kt
+++ b/tv/tv-foundation/src/main/java/androidx/tv/foundation/lazy/list/LazyListState.kt
@@ -365,6 +365,23 @@
             result.firstVisibleItemScrollOffset != 0
 
         numMeasurePasses++
+
+        cancelPrefetchIfVisibleItemsChanged(result)
+    }
+
+    private fun cancelPrefetchIfVisibleItemsChanged(info: TvLazyListLayoutInfo) {
+        if (indexToPrefetch != -1 && info.visibleItemsInfo.isNotEmpty()) {
+            val expectedPrefetchIndex = if (wasScrollingForward) {
+                info.visibleItemsInfo.last().index + 1
+            } else {
+                info.visibleItemsInfo.first().index - 1
+            }
+            if (indexToPrefetch != expectedPrefetchIndex) {
+                indexToPrefetch = -1
+                currentPrefetchHandle?.cancel()
+                currentPrefetchHandle = null
+            }
+        }
     }
 
     /**
diff --git a/vectordrawable/vectordrawable/lint-baseline.xml b/vectordrawable/vectordrawable/lint-baseline.xml
index a918dbd..f647f1f 100644
--- a/vectordrawable/vectordrawable/lint-baseline.xml
+++ b/vectordrawable/vectordrawable/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="cli" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
+<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
 
     <issue
         id="UnknownNullness"
diff --git a/viewpager/viewpager/lint-baseline.xml b/viewpager/viewpager/lint-baseline.xml
index c9974a1..a252977 100644
--- a/viewpager/viewpager/lint-baseline.xml
+++ b/viewpager/viewpager/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="cli" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
+<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
 
     <issue
         id="UnknownNullness"
diff --git a/wear/watchface/watchface-complications-data/lint-baseline.xml b/wear/watchface/watchface-complications-data/lint-baseline.xml
deleted file mode 100644
index af4f75c..0000000
--- a/wear/watchface/watchface-complications-data/lint-baseline.xml
+++ /dev/null
@@ -1,112 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
-
-    <issue
-        id="MissingQuantity"
-        message="For locale &quot;fr&quot; (French) the following quantity should also be defined: `many` (e.g. &quot;1000000 de jours&quot;)"
-        errorLine1="    &lt;plurals name=&quot;time_difference_short_days&quot; formatted=&quot;false&quot; msgid=&quot;3878057769320887026&quot;>"
-        errorLine2="    ^">
-        <location
-            file="src/main/res/values-fr-rCA/complication_strings.xml"/>
-    </issue>
-
-    <issue
-        id="MissingQuantity"
-        message="For locale &quot;fr&quot; (French) the following quantity should also be defined: `many` (e.g. &quot;1000000 de jours&quot;)"
-        errorLine1="    &lt;plurals name=&quot;time_difference_short_days&quot; formatted=&quot;false&quot; msgid=&quot;3878057769320887026&quot;>"
-        errorLine2="    ^">
-        <location
-            file="src/main/res/values-fr/complication_strings.xml"/>
-    </issue>
-
-    <issue
-        id="MissingQuantity"
-        message="For locale &quot;fr&quot; (French) the following quantity should also be defined: `many` (e.g. &quot;1000000 de jours&quot;)"
-        errorLine1="    &lt;plurals name=&quot;time_difference_short_hours&quot; formatted=&quot;false&quot; msgid=&quot;6016687406802669982&quot;>"
-        errorLine2="    ^">
-        <location
-            file="src/main/res/values-fr-rCA/complication_strings.xml"/>
-    </issue>
-
-    <issue
-        id="MissingQuantity"
-        message="For locale &quot;fr&quot; (French) the following quantity should also be defined: `many` (e.g. &quot;1000000 de jours&quot;)"
-        errorLine1="    &lt;plurals name=&quot;time_difference_short_hours&quot; formatted=&quot;false&quot; msgid=&quot;6016687406802669982&quot;>"
-        errorLine2="    ^">
-        <location
-            file="src/main/res/values-fr/complication_strings.xml"/>
-    </issue>
-
-    <issue
-        id="MissingQuantity"
-        message="For locale &quot;fr&quot; (French) the following quantity should also be defined: `many` (e.g. &quot;1000000 de jours&quot;)"
-        errorLine1="    &lt;plurals name=&quot;time_difference_short_minutes&quot; formatted=&quot;false&quot; msgid=&quot;6752732458902810711&quot;>"
-        errorLine2="    ^">
-        <location
-            file="src/main/res/values-fr-rCA/complication_strings.xml"/>
-    </issue>
-
-    <issue
-        id="MissingQuantity"
-        message="For locale &quot;fr&quot; (French) the following quantity should also be defined: `many` (e.g. &quot;1000000 de jours&quot;)"
-        errorLine1="    &lt;plurals name=&quot;time_difference_short_minutes&quot; formatted=&quot;false&quot; msgid=&quot;6752732458902810711&quot;>"
-        errorLine2="    ^">
-        <location
-            file="src/main/res/values-fr/complication_strings.xml"/>
-    </issue>
-
-    <issue
-        id="MissingQuantity"
-        message="For locale &quot;fr&quot; (French) the following quantity should also be defined: `many` (e.g. &quot;1000000 de jours&quot;)"
-        errorLine1="    &lt;plurals name=&quot;time_difference_words_days&quot; formatted=&quot;false&quot; msgid=&quot;5109682345086392533&quot;>"
-        errorLine2="    ^">
-        <location
-            file="src/main/res/values-fr-rCA/complication_strings.xml"/>
-    </issue>
-
-    <issue
-        id="MissingQuantity"
-        message="For locale &quot;fr&quot; (French) the following quantity should also be defined: `many` (e.g. &quot;1000000 de jours&quot;)"
-        errorLine1="    &lt;plurals name=&quot;time_difference_words_days&quot; formatted=&quot;false&quot; msgid=&quot;5109682345086392533&quot;>"
-        errorLine2="    ^">
-        <location
-            file="src/main/res/values-fr/complication_strings.xml"/>
-    </issue>
-
-    <issue
-        id="MissingQuantity"
-        message="For locale &quot;fr&quot; (French) the following quantity should also be defined: `many` (e.g. &quot;1000000 de jours&quot;)"
-        errorLine1="    &lt;plurals name=&quot;time_difference_words_hours&quot; formatted=&quot;false&quot; msgid=&quot;3172220157267000186&quot;>"
-        errorLine2="    ^">
-        <location
-            file="src/main/res/values-fr-rCA/complication_strings.xml"/>
-    </issue>
-
-    <issue
-        id="MissingQuantity"
-        message="For locale &quot;fr&quot; (French) the following quantity should also be defined: `many` (e.g. &quot;1000000 de jours&quot;)"
-        errorLine1="    &lt;plurals name=&quot;time_difference_words_hours&quot; formatted=&quot;false&quot; msgid=&quot;3172220157267000186&quot;>"
-        errorLine2="    ^">
-        <location
-            file="src/main/res/values-fr/complication_strings.xml"/>
-    </issue>
-
-    <issue
-        id="MissingQuantity"
-        message="For locale &quot;fr&quot; (French) the following quantity should also be defined: `many` (e.g. &quot;1000000 de jours&quot;)"
-        errorLine1="    &lt;plurals name=&quot;time_difference_words_minutes&quot; formatted=&quot;false&quot; msgid=&quot;529404827937478243&quot;>"
-        errorLine2="    ^">
-        <location
-            file="src/main/res/values-fr-rCA/complication_strings.xml"/>
-    </issue>
-
-    <issue
-        id="MissingQuantity"
-        message="For locale &quot;fr&quot; (French) the following quantity should also be defined: `many` (e.g. &quot;1000000 de jours&quot;)"
-        errorLine1="    &lt;plurals name=&quot;time_difference_words_minutes&quot; formatted=&quot;false&quot; msgid=&quot;529404827937478243&quot;>"
-        errorLine2="    ^">
-        <location
-            file="src/main/res/values-fr/complication_strings.xml"/>
-    </issue>
-
-</issues>
diff --git a/wear/watchface/watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditorSessionTest.kt b/wear/watchface/watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditorSessionTest.kt
index 3c698b7c..cc749b9 100644
--- a/wear/watchface/watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditorSessionTest.kt
+++ b/wear/watchface/watchface-editor/src/androidTest/java/androidx/wear/watchface/editor/EditorSessionTest.kt
@@ -670,7 +670,7 @@
         lateinit var activity: OnWatchFaceEditingTestActivity
         scenario.onActivity { activity = it }
         activity.creationLatch.await(EDITING_SESSION_TIMEOUT.toMillis() + 500, MILLISECONDS)
-        assert(activity.onCreateException is TimeoutCancellationException)
+        assertThat(activity.onCreateException is TimeoutCancellationException).isTrue()
     }
 
     @Test
diff --git a/wear/watchface/watchface-style/src/test/java/androidx/wear/watchface/style/StyleParcelableTest.kt b/wear/watchface/watchface-style/src/test/java/androidx/wear/watchface/style/StyleParcelableTest.kt
index 3623cce..7dc6cb4 100644
--- a/wear/watchface/watchface-style/src/test/java/androidx/wear/watchface/style/StyleParcelableTest.kt
+++ b/wear/watchface/watchface-style/src/test/java/androidx/wear/watchface/style/StyleParcelableTest.kt
@@ -105,7 +105,7 @@
             )
         parcel.recycle()
 
-        assert(unparceled is ListUserStyleSetting)
+        assertThat(unparceled is ListUserStyleSetting).isTrue()
 
         assertThat(unparceled.id.value).isEqualTo("id")
         assertThat(unparceled.displayName).isEqualTo("displayName")
@@ -203,7 +203,7 @@
             UserStyleSchema(UserStyleSchemaWireFormat.CREATOR.createFromParcel(parcel))
         parcel.recycle()
 
-        assert(schema.userStyleSettings[0] is ListUserStyleSetting)
+        assertThat(schema.userStyleSettings[0] is ListUserStyleSetting).isTrue()
         assertThat(schema.userStyleSettings[0].id.value).isEqualTo("id1")
         assertThat(schema.userStyleSettings[0].displayName).isEqualTo("displayName1")
         assertThat(schema.userStyleSettings[0].description).isEqualTo("description1")
@@ -227,7 +227,7 @@
         assertThat(optionArray1[1].icon!!.uri.toString()).isEqualTo("icon2")
         assertThat(optionArray1[1].watchFaceEditorData!!.icon!!.uri.toString()).isEqualTo("wfIcon2")
 
-        assert(schema.userStyleSettings[1] is ListUserStyleSetting)
+        assertThat(schema.userStyleSettings[2] is BooleanUserStyleSetting).isTrue()
         assertThat(schema.userStyleSettings[1].id.value).isEqualTo("id2")
         assertThat(schema.userStyleSettings[1].displayName).isEqualTo("displayName2")
         assertThat(schema.userStyleSettings[1].description).isEqualTo("description2")
@@ -251,7 +251,7 @@
         assertThat(optionArray2[1].icon!!.uri.toString()).isEqualTo("icon4")
         assertThat(optionArray2[1].watchFaceEditorData!!.icon!!.uri.toString()).isEqualTo("wfIcon4")
 
-        assert(schema.userStyleSettings[2] is BooleanUserStyleSetting)
+        assertThat(schema.userStyleSettings[2] is BooleanUserStyleSetting).isTrue()
         assertThat(schema.userStyleSettings[2].id.value).isEqualTo("id3")
         assertThat(schema.userStyleSettings[2].displayName).isEqualTo("displayName3")
         assertThat(schema.userStyleSettings[2].description).isEqualTo("description3")
@@ -262,7 +262,7 @@
             WatchFaceLayer.BASE
         )
 
-        assert(schema.userStyleSettings[3] is CustomValueUserStyleSetting)
+        assertThat(schema.userStyleSettings[3] is CustomValueUserStyleSetting).isTrue()
         assertThat(schema.userStyleSettings[3].defaultOption.id.value.decodeToString())
             .isEqualTo("default")
         assertThat(schema.userStyleSettings[3].affectedWatchFaceLayers.size).isEqualTo(1)
@@ -630,7 +630,7 @@
             )
         parcel.recycle()
 
-        assert(unparceled is ComplicationSlotsUserStyleSetting)
+        assertThat(unparceled is ComplicationSlotsUserStyleSetting).isTrue()
         assertThat(unparceled.id.value).isEqualTo("complications_style_setting")
 
         val options = unparceled.options.filterIsInstance<
diff --git a/wear/watchface/watchface/lint-baseline.xml b/wear/watchface/watchface/lint-baseline.xml
new file mode 100644
index 0000000..3e45aa6
--- /dev/null
+++ b/wear/watchface/watchface/lint-baseline.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
+
+    <issue
+        id="SupportAnnotationUsage"
+        message="Did you mean `@get:RestrictTo`? Without `get:` this annotates the constructor parameter itself instead of the associated getter."
+        errorLine1="    @RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/wear/watchface/ComplicationSlot.kt"/>
+    </issue>
+
+</issues>
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/ComplicationSlot.kt b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/ComplicationSlot.kt
index 18896d4..18c41fe 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/ComplicationSlot.kt
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/ComplicationSlot.kt
@@ -422,6 +422,8 @@
         )
     }
 
+    private var lastComplicationUpdate = Instant.EPOCH
+
     private class ComplicationDataHistoryEntry(
         val complicationData: ComplicationData,
         val time: Instant
@@ -986,6 +988,7 @@
         loadDrawablesAsynchronous: Boolean,
         instant: Instant
     ) {
+        lastComplicationUpdate = instant
         complicationHistory?.push(ComplicationDataHistoryEntry(complicationData, instant))
         timelineComplicationData = complicationData
         timelineEntries = complicationData.asWireComplicationData().timelineEntries?.map {
@@ -1210,6 +1213,7 @@
         @OptIn(ComplicationExperimental::class)
         writer.println("boundingArc=$boundingArc")
         writer.println("complicationSlotBounds=$complicationSlotBounds")
+        writer.println("lastComplicationUpdate=$lastComplicationUpdate")
         writer.println("data history")
         complicationHistory?.let {
             writer.increaseIndent()
diff --git a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFaceService.kt b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFaceService.kt
index da9b873..9fdf2f5 100644
--- a/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFaceService.kt
+++ b/wear/watchface/watchface/src/main/java/androidx/wear/watchface/WatchFaceService.kt
@@ -1340,6 +1340,10 @@
                     } catch (e: Exception) {
                         InteractiveInstanceManager
                             .takePendingWallpaperInteractiveWatchFaceInstance()?.let {
+                                Log.e(
+                                    TAG,
+                                    "takePendingWallpaperInteractiveWatchFaceInstance failed"
+                                )
                                 it.callback.onInteractiveWatchFaceCrashed(
                                     CrashInfoParcel(e)
                                 )
@@ -1362,6 +1366,7 @@
                     pendingWallpaperInstance.callback.onInteractiveWatchFaceCreated(instance)
                     instance
                 } catch (e: Exception) {
+                    Log.e(TAG, "createInteractiveInstance failed")
                     pendingWallpaperInstance.callback.onInteractiveWatchFaceCrashed(
                         CrashInfoParcel(e)
                     )
@@ -2391,10 +2396,18 @@
 
         override fun sendPreviewImageNeedsUpdateRequest() {
             synchronized(lock) {
-                lastPreviewImageNeedsUpdateRequest = interactiveInstanceId
+                if (this::interactiveInstanceId.isInitialized) {
+                    lastPreviewImageNeedsUpdateRequest = interactiveInstanceId
 
-                forEachListener("sendPreviewImageNeedsUpdateRequest") {
-                    it.onPreviewImageUpdateRequested(interactiveInstanceId)
+                    forEachListener("sendPreviewImageNeedsUpdateRequest") {
+                        it.onPreviewImageUpdateRequested(interactiveInstanceId)
+                    }
+                } else {
+                    Log.w(
+                        TAG,
+                        "Ignoring sendPreviewImageNeedsUpdateRequest because " +
+                            "interactiveInstanceId not initialized"
+                    )
                 }
             }
         }
diff --git a/wear/watchface/watchface/src/test/java/androidx/wear/watchface/WatchFaceServiceTest.kt b/wear/watchface/watchface/src/test/java/androidx/wear/watchface/WatchFaceServiceTest.kt
index eaa09a4..b77e904 100644
--- a/wear/watchface/watchface/src/test/java/androidx/wear/watchface/WatchFaceServiceTest.kt
+++ b/wear/watchface/watchface/src/test/java/androidx/wear/watchface/WatchFaceServiceTest.kt
@@ -5841,6 +5841,176 @@
         engineWrapper.onDestroy()
     }
 
+    @Test
+    public fun onPreviewImageUpdateRequested_earlyCall() {
+        @Suppress("DEPRECATION")
+        lateinit var renderer: Renderer.CanvasRenderer
+        testWatchFaceService = TestWatchFaceService(
+            WatchFaceType.DIGITAL,
+            emptyList(),
+            { _, currentUserStyleRepository, watchState ->
+                @Suppress("DEPRECATION")
+                renderer = object : Renderer.CanvasRenderer(
+                    surfaceHolder,
+                    currentUserStyleRepository,
+                    watchState,
+                    CanvasType.HARDWARE,
+                    INTERACTIVE_UPDATE_RATE_MS
+                ) {
+                    init {
+                        sendPreviewImageNeedsUpdateRequest()
+                    }
+
+                    override fun render(
+                        canvas: Canvas,
+                        bounds: Rect,
+                        zonedDateTime: ZonedDateTime
+                    ) {
+                    }
+
+                    override fun renderHighlightLayer(
+                        canvas: Canvas,
+                        bounds: Rect,
+                        zonedDateTime: ZonedDateTime
+                    ) {
+                    }
+                }
+                renderer
+            },
+            UserStyleSchema(emptyList()),
+            null,
+            handler,
+            null,
+            false,
+            null,
+            choreographer,
+            forceIsVisible = true
+        )
+
+        InteractiveInstanceManager
+            .getExistingInstanceOrSetPendingWallpaperInteractiveWatchFaceInstance(
+                InteractiveInstanceManager.PendingWallpaperInteractiveWatchFaceInstance(
+                    WallpaperInteractiveWatchFaceInstanceParams(
+                        SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Interactive",
+                        DeviceConfig(
+                            false,
+                            false,
+                            0,
+                            0
+                        ),
+                        WatchUiState(false, 0),
+                        UserStyle(emptyMap()).toWireFormat(),
+                        emptyList()
+                    ),
+                    object : IPendingInteractiveWatchFace.Stub() {
+                        override fun getApiVersion() =
+                            IPendingInteractiveWatchFace.API_VERSION
+
+                        override fun onInteractiveWatchFaceCreated(
+                            iInteractiveWatchFace: IInteractiveWatchFace
+                        ) {
+                            interactiveWatchFaceInstance = iInteractiveWatchFace
+                        }
+
+                        override fun onInteractiveWatchFaceCrashed(exception: CrashInfoParcel?) {
+                            fail("WatchFace crashed: $exception")
+                        }
+                    }
+                )
+            )
+
+        var lastPreviewImageUpdateRequestedWatchFaceId: String? = null
+        val listener = object : IWatchfaceListener.Stub() {
+            override fun getApiVersion() = 1
+
+            override fun onWatchfaceReady() {}
+
+            override fun onWatchfaceColorsChanged(watchFaceColors: WatchFaceColorsWireFormat?) {}
+
+            override fun onPreviewImageUpdateRequested(watchFaceId: String) {
+                lastPreviewImageUpdateRequestedWatchFaceId = watchFaceId
+            }
+
+            override fun onEngineDetached() {}
+        }
+
+        engineWrapper = testWatchFaceService.onCreateEngine() as WatchFaceService.EngineWrapper
+        engineWrapper.onCreate(surfaceHolder)
+        engineWrapper.onSurfaceChanged(surfaceHolder, 0, 100, 100)
+
+        interactiveWatchFaceInstance.addWatchFaceListener(listener)
+
+        assertThat(lastPreviewImageUpdateRequestedWatchFaceId).isEqualTo(
+            SYSTEM_SUPPORTS_CONSISTENT_IDS_PREFIX + "Interactive"
+        )
+    }
+
+    @Test
+    @RequiresApi(Build.VERSION_CODES.O_MR1)
+    public fun sendPreviewImageNeedsUpdateRequest_headlessInstance() {
+        @Suppress("DEPRECATION")
+        lateinit var renderer: Renderer.CanvasRenderer
+        testWatchFaceService = TestWatchFaceService(
+            WatchFaceType.DIGITAL,
+            emptyList(),
+            { _, currentUserStyleRepository, watchState ->
+                @Suppress("DEPRECATION")
+                renderer = object : Renderer.CanvasRenderer(
+                    surfaceHolder,
+                    currentUserStyleRepository,
+                    watchState,
+                    CanvasType.HARDWARE,
+                    INTERACTIVE_UPDATE_RATE_MS
+                ) {
+                    init {
+                        sendPreviewImageNeedsUpdateRequest()
+                    }
+                    override fun render(
+                        canvas: Canvas,
+                        bounds: Rect,
+                        zonedDateTime: ZonedDateTime
+                    ) { }
+
+                    override fun renderHighlightLayer(
+                        canvas: Canvas,
+                        bounds: Rect,
+                        zonedDateTime: ZonedDateTime
+                    ) {
+                    }
+                }
+                renderer
+            },
+            UserStyleSchema(emptyList()),
+            null,
+            handler,
+            null,
+            false,
+            null,
+            choreographer,
+            forceIsVisible = true
+        )
+
+        engineWrapper =
+            testWatchFaceService.createHeadlessEngine() as WatchFaceService.EngineWrapper
+
+        engineWrapper.createHeadlessInstance(
+            HeadlessWatchFaceInstanceParams(
+                ComponentName("test.watchface.app", "test.watchface.class"),
+                DeviceConfig(false, false, 100, 200),
+                100,
+                100,
+                null
+            )
+        )
+
+        // This shouldn't crash.
+        runBlocking {
+            watchFaceImpl = engineWrapper.deferredWatchFaceImpl.await()
+        }
+
+        engineWrapper.onDestroy()
+    }
+
     private fun getLeftShortTextComplicationDataText(): CharSequence {
         val complication = complicationSlotsManager[
             LEFT_COMPLICATION_ID
diff --git a/window/window/lint-baseline.xml b/window/window/lint-baseline.xml
new file mode 100644
index 0000000..a84ae6d
--- /dev/null
+++ b/window/window/lint-baseline.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
+
+    <issue
+        id="SupportAnnotationUsage"
+        message="Did you mean `@get:VisibleForTesting`? Without `get:` this annotates the constructor parameter itself instead of the associated getter."
+        errorLine1="    @VisibleForTesting"
+        errorLine2="    ~~~~~~~~~~~~~~~~~~">
+        <location
+            file="src/main/java/androidx/window/layout/SidecarCompat.kt"/>
+    </issue>
+
+</issues>
diff --git a/work/integration-tests/testapp/src/main/java/androidx/work/integration/testapp/MainActivity.java b/work/integration-tests/testapp/src/main/java/androidx/work/integration/testapp/MainActivity.java
index d86f336..ddc135e 100644
--- a/work/integration-tests/testapp/src/main/java/androidx/work/integration/testapp/MainActivity.java
+++ b/work/integration-tests/testapp/src/main/java/androidx/work/integration/testapp/MainActivity.java
@@ -569,6 +569,17 @@
             }
         });
 
+        findViewById(R.id.enqueue_infinite_work_charging).setOnClickListener(
+                new View.OnClickListener() {
+                    @Override
+                    public void onClick(View v) {
+                        StressTest.queueLotsOfWorkers(
+                                WorkManager.getInstance(MainActivity.this)
+                        );
+                    }
+                });
+
+
         Button hundredJobExceptionButton = findViewById(R.id.create_hundred_job_exception);
         // 100 Job limits are only enforced on API 24+.
         if (Build.VERSION.SDK_INT >= 24) {
diff --git a/work/integration-tests/testapp/src/main/java/androidx/work/integration/testapp/StressTest.kt b/work/integration-tests/testapp/src/main/java/androidx/work/integration/testapp/StressTest.kt
new file mode 100644
index 0000000..48389e2
--- /dev/null
+++ b/work/integration-tests/testapp/src/main/java/androidx/work/integration/testapp/StressTest.kt
@@ -0,0 +1,51 @@
+/*
+ * Copyright 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.
+ */
+@file:JvmName("StressTest")
+package androidx.work.integration.testapp
+
+import android.util.Log
+import androidx.work.Constraints
+import androidx.work.ExistingWorkPolicy
+import androidx.work.NetworkType
+import androidx.work.OneTimeWorkRequestBuilder
+import androidx.work.WorkManager
+
+fun queueLotsOfWorkers(workManager: WorkManager) {
+    for (i in 1..1000) {
+        Log.i("TestWM", "Queueing $i worker")
+        val constraint = Constraints.Builder()
+            .setRequiredNetworkType(NetworkType.CONNECTED)
+            .build()
+        val uniqueName = "Worker-$i"
+
+        val worker = OneTimeWorkRequestBuilder<TestWorker>()
+            .setConstraints(constraint)
+            .build()
+
+        val worker2 = OneTimeWorkRequestBuilder<TestWorker>()
+            .setConstraints(constraint)
+            .build()
+
+        val worker3 = OneTimeWorkRequestBuilder<TestWorker>()
+            .setConstraints(constraint)
+            .build()
+
+        workManager.beginUniqueWork(uniqueName, ExistingWorkPolicy.KEEP, worker)
+            .then(worker2)
+            .then(worker3)
+            .enqueue()
+    }
+}
diff --git a/work/integration-tests/testapp/src/main/res/layout/activity_main.xml b/work/integration-tests/testapp/src/main/res/layout/activity_main.xml
index ced7f94..789d68f 100644
--- a/work/integration-tests/testapp/src/main/res/layout/activity_main.xml
+++ b/work/integration-tests/testapp/src/main/res/layout/activity_main.xml
@@ -343,5 +343,13 @@
             android:layout_marginLeft="16dp"
             android:layout_marginStart="16dp"/>
 
+        <Button android:text="@string/stress_test"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:id="@+id/stress_test"
+            android:layout_marginTop="12dp"
+            android:layout_marginLeft="16dp"
+            android:layout_marginStart="16dp"/>
+
     </LinearLayout>
 </ScrollView>
diff --git a/work/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml b/work/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml
index f56d600..91c735f 100644
--- a/work/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml
+++ b/work/integration-tests/testapp/src/main/res/values/donottranslate-strings.xml
@@ -50,4 +50,5 @@
     <integer name="notification_id">1</integer>
     <string name="notification_title">Working</string>
     <string name="cancel_constraint_tracking_worker">Cancel Constraint Tracking Worker</string>
+    <string name="stress_test">Stress Test</string>
 </resources>
\ No newline at end of file
diff --git a/work/work-gcm/api/2.8.0-beta01.txt b/work/work-gcm/api/2.8.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/work/work-gcm/api/2.8.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/work/work-gcm/api/public_plus_experimental_2.8.0-beta01.txt b/work/work-gcm/api/public_plus_experimental_2.8.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/work/work-gcm/api/public_plus_experimental_2.8.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/work/work-gcm/api/res-2.8.0-beta01.txt b/work/work-gcm/api/res-2.8.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/work/work-gcm/api/res-2.8.0-beta01.txt
diff --git a/work/work-gcm/api/restricted_2.8.0-beta01.txt b/work/work-gcm/api/restricted_2.8.0-beta01.txt
new file mode 100644
index 0000000..e6f50d0
--- /dev/null
+++ b/work/work-gcm/api/restricted_2.8.0-beta01.txt
@@ -0,0 +1 @@
+// Signature format: 4.0
diff --git a/work/work-inspection/lint-baseline.xml b/work/work-inspection/lint-baseline.xml
index 677478e..2ddb484 100644
--- a/work/work-inspection/lint-baseline.xml
+++ b/work/work-inspection/lint-baseline.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="cli" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
+<issues format="6" by="lint 7.4.0-alpha08" type="baseline" client="gradle" dependencies="false" name="AGP (7.4.0-alpha08)" variant="all" version="7.4.0-alpha08">
 
     <issue
         id="RemoveWorkManagerInitializer"
diff --git a/work/work-multiprocess/api/2.8.0-beta01.txt b/work/work-multiprocess/api/2.8.0-beta01.txt
new file mode 100644
index 0000000..bd27cfb
--- /dev/null
+++ b/work/work-multiprocess/api/2.8.0-beta01.txt
@@ -0,0 +1,26 @@
+// Signature format: 4.0
+package androidx.work.multiprocess {
+
+  public abstract class RemoteCoroutineWorker extends androidx.work.multiprocess.RemoteListenableWorker {
+    ctor public RemoteCoroutineWorker(android.content.Context context, androidx.work.WorkerParameters parameters);
+    method public abstract suspend Object? doRemoteWork(kotlin.coroutines.Continuation<? super androidx.work.ListenableWorker.Result>);
+    method public final void onStopped();
+    method public final suspend Object? setProgress(androidx.work.Data data, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result> startRemoteWork();
+  }
+
+  public abstract class RemoteListenableWorker extends androidx.work.ListenableWorker {
+    ctor public RemoteListenableWorker(android.content.Context, androidx.work.WorkerParameters);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result!> startRemoteWork();
+    method public final com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result!> startWork();
+    field public static final String ARGUMENT_CLASS_NAME = "androidx.work.impl.workers.RemoteListenableWorker.ARGUMENT_CLASS_NAME";
+    field public static final String ARGUMENT_PACKAGE_NAME = "androidx.work.impl.workers.RemoteListenableWorker.ARGUMENT_PACKAGE_NAME";
+  }
+
+  public class RemoteWorkerService extends android.app.Service {
+    ctor public RemoteWorkerService();
+    method public android.os.IBinder? onBind(android.content.Intent);
+  }
+
+}
+
diff --git a/work/work-multiprocess/api/public_plus_experimental_2.8.0-beta01.txt b/work/work-multiprocess/api/public_plus_experimental_2.8.0-beta01.txt
new file mode 100644
index 0000000..bd27cfb
--- /dev/null
+++ b/work/work-multiprocess/api/public_plus_experimental_2.8.0-beta01.txt
@@ -0,0 +1,26 @@
+// Signature format: 4.0
+package androidx.work.multiprocess {
+
+  public abstract class RemoteCoroutineWorker extends androidx.work.multiprocess.RemoteListenableWorker {
+    ctor public RemoteCoroutineWorker(android.content.Context context, androidx.work.WorkerParameters parameters);
+    method public abstract suspend Object? doRemoteWork(kotlin.coroutines.Continuation<? super androidx.work.ListenableWorker.Result>);
+    method public final void onStopped();
+    method public final suspend Object? setProgress(androidx.work.Data data, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result> startRemoteWork();
+  }
+
+  public abstract class RemoteListenableWorker extends androidx.work.ListenableWorker {
+    ctor public RemoteListenableWorker(android.content.Context, androidx.work.WorkerParameters);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result!> startRemoteWork();
+    method public final com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result!> startWork();
+    field public static final String ARGUMENT_CLASS_NAME = "androidx.work.impl.workers.RemoteListenableWorker.ARGUMENT_CLASS_NAME";
+    field public static final String ARGUMENT_PACKAGE_NAME = "androidx.work.impl.workers.RemoteListenableWorker.ARGUMENT_PACKAGE_NAME";
+  }
+
+  public class RemoteWorkerService extends android.app.Service {
+    ctor public RemoteWorkerService();
+    method public android.os.IBinder? onBind(android.content.Intent);
+  }
+
+}
+
diff --git a/work/work-multiprocess/api/res-2.8.0-beta01.txt b/work/work-multiprocess/api/res-2.8.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/work/work-multiprocess/api/res-2.8.0-beta01.txt
diff --git a/work/work-multiprocess/api/restricted_2.8.0-beta01.txt b/work/work-multiprocess/api/restricted_2.8.0-beta01.txt
new file mode 100644
index 0000000..bd27cfb
--- /dev/null
+++ b/work/work-multiprocess/api/restricted_2.8.0-beta01.txt
@@ -0,0 +1,26 @@
+// Signature format: 4.0
+package androidx.work.multiprocess {
+
+  public abstract class RemoteCoroutineWorker extends androidx.work.multiprocess.RemoteListenableWorker {
+    ctor public RemoteCoroutineWorker(android.content.Context context, androidx.work.WorkerParameters parameters);
+    method public abstract suspend Object? doRemoteWork(kotlin.coroutines.Continuation<? super androidx.work.ListenableWorker.Result>);
+    method public final void onStopped();
+    method public final suspend Object? setProgress(androidx.work.Data data, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result> startRemoteWork();
+  }
+
+  public abstract class RemoteListenableWorker extends androidx.work.ListenableWorker {
+    ctor public RemoteListenableWorker(android.content.Context, androidx.work.WorkerParameters);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result!> startRemoteWork();
+    method public final com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result!> startWork();
+    field public static final String ARGUMENT_CLASS_NAME = "androidx.work.impl.workers.RemoteListenableWorker.ARGUMENT_CLASS_NAME";
+    field public static final String ARGUMENT_PACKAGE_NAME = "androidx.work.impl.workers.RemoteListenableWorker.ARGUMENT_PACKAGE_NAME";
+  }
+
+  public class RemoteWorkerService extends android.app.Service {
+    ctor public RemoteWorkerService();
+    method public android.os.IBinder? onBind(android.content.Intent);
+  }
+
+}
+
diff --git a/work/work-runtime-ktx/api/2.8.0-beta01.txt b/work/work-runtime-ktx/api/2.8.0-beta01.txt
new file mode 100644
index 0000000..efdea4c
--- /dev/null
+++ b/work/work-runtime-ktx/api/2.8.0-beta01.txt
@@ -0,0 +1,30 @@
+// Signature format: 4.0
+package androidx.work {
+
+  public abstract class CoroutineWorker extends androidx.work.ListenableWorker {
+    ctor public CoroutineWorker(android.content.Context appContext, androidx.work.WorkerParameters params);
+    method public abstract suspend Object? doWork(kotlin.coroutines.Continuation<? super androidx.work.ListenableWorker.Result>);
+    method @Deprecated public kotlinx.coroutines.CoroutineDispatcher getCoroutineContext();
+    method public suspend Object? getForegroundInfo(kotlin.coroutines.Continuation<? super androidx.work.ForegroundInfo>);
+    method public final com.google.common.util.concurrent.ListenableFuture<androidx.work.ForegroundInfo> getForegroundInfoAsync();
+    method public final void onStopped();
+    method public final suspend Object? setForeground(androidx.work.ForegroundInfo foregroundInfo, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public final suspend Object? setProgress(androidx.work.Data data, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public final com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result> startWork();
+    property @Deprecated public kotlinx.coroutines.CoroutineDispatcher coroutineContext;
+  }
+
+  public final class DataKt {
+    method public static inline <reified T> boolean hasKeyWithValueOfType(androidx.work.Data, String key);
+    method public static inline androidx.work.Data workDataOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class ListenableFutureKt {
+  }
+
+  public final class OperationKt {
+    method public static suspend inline Object? await(androidx.work.Operation, kotlin.coroutines.Continuation<? super androidx.work.Operation.State.SUCCESS>);
+  }
+
+}
+
diff --git a/work/work-runtime-ktx/api/public_plus_experimental_2.8.0-beta01.txt b/work/work-runtime-ktx/api/public_plus_experimental_2.8.0-beta01.txt
new file mode 100644
index 0000000..efdea4c
--- /dev/null
+++ b/work/work-runtime-ktx/api/public_plus_experimental_2.8.0-beta01.txt
@@ -0,0 +1,30 @@
+// Signature format: 4.0
+package androidx.work {
+
+  public abstract class CoroutineWorker extends androidx.work.ListenableWorker {
+    ctor public CoroutineWorker(android.content.Context appContext, androidx.work.WorkerParameters params);
+    method public abstract suspend Object? doWork(kotlin.coroutines.Continuation<? super androidx.work.ListenableWorker.Result>);
+    method @Deprecated public kotlinx.coroutines.CoroutineDispatcher getCoroutineContext();
+    method public suspend Object? getForegroundInfo(kotlin.coroutines.Continuation<? super androidx.work.ForegroundInfo>);
+    method public final com.google.common.util.concurrent.ListenableFuture<androidx.work.ForegroundInfo> getForegroundInfoAsync();
+    method public final void onStopped();
+    method public final suspend Object? setForeground(androidx.work.ForegroundInfo foregroundInfo, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public final suspend Object? setProgress(androidx.work.Data data, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public final com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result> startWork();
+    property @Deprecated public kotlinx.coroutines.CoroutineDispatcher coroutineContext;
+  }
+
+  public final class DataKt {
+    method public static inline <reified T> boolean hasKeyWithValueOfType(androidx.work.Data, String key);
+    method public static inline androidx.work.Data workDataOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class ListenableFutureKt {
+  }
+
+  public final class OperationKt {
+    method public static suspend inline Object? await(androidx.work.Operation, kotlin.coroutines.Continuation<? super androidx.work.Operation.State.SUCCESS>);
+  }
+
+}
+
diff --git a/work/work-runtime-ktx/api/res-2.8.0-beta01.txt b/work/work-runtime-ktx/api/res-2.8.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/work/work-runtime-ktx/api/res-2.8.0-beta01.txt
diff --git a/work/work-runtime-ktx/api/restricted_2.8.0-beta01.txt b/work/work-runtime-ktx/api/restricted_2.8.0-beta01.txt
new file mode 100644
index 0000000..efdea4c
--- /dev/null
+++ b/work/work-runtime-ktx/api/restricted_2.8.0-beta01.txt
@@ -0,0 +1,30 @@
+// Signature format: 4.0
+package androidx.work {
+
+  public abstract class CoroutineWorker extends androidx.work.ListenableWorker {
+    ctor public CoroutineWorker(android.content.Context appContext, androidx.work.WorkerParameters params);
+    method public abstract suspend Object? doWork(kotlin.coroutines.Continuation<? super androidx.work.ListenableWorker.Result>);
+    method @Deprecated public kotlinx.coroutines.CoroutineDispatcher getCoroutineContext();
+    method public suspend Object? getForegroundInfo(kotlin.coroutines.Continuation<? super androidx.work.ForegroundInfo>);
+    method public final com.google.common.util.concurrent.ListenableFuture<androidx.work.ForegroundInfo> getForegroundInfoAsync();
+    method public final void onStopped();
+    method public final suspend Object? setForeground(androidx.work.ForegroundInfo foregroundInfo, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public final suspend Object? setProgress(androidx.work.Data data, kotlin.coroutines.Continuation<? super kotlin.Unit>);
+    method public final com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result> startWork();
+    property @Deprecated public kotlinx.coroutines.CoroutineDispatcher coroutineContext;
+  }
+
+  public final class DataKt {
+    method public static inline <reified T> boolean hasKeyWithValueOfType(androidx.work.Data, String key);
+    method public static inline androidx.work.Data workDataOf(kotlin.Pair<java.lang.String,?>... pairs);
+  }
+
+  public final class ListenableFutureKt {
+  }
+
+  public final class OperationKt {
+    method public static suspend inline Object? await(androidx.work.Operation, kotlin.coroutines.Continuation<? super androidx.work.Operation.State.SUCCESS>);
+  }
+
+}
+
diff --git a/work/work-runtime/api/2.8.0-beta01.txt b/work/work-runtime/api/2.8.0-beta01.txt
new file mode 100644
index 0000000..4519d02
--- /dev/null
+++ b/work/work-runtime/api/2.8.0-beta01.txt
@@ -0,0 +1,499 @@
+// Signature format: 4.0
+package androidx.work {
+
+  public final class ArrayCreatingInputMerger extends androidx.work.InputMerger {
+    ctor public ArrayCreatingInputMerger();
+    method public androidx.work.Data merge(java.util.List<androidx.work.Data> inputs);
+  }
+
+  public enum BackoffPolicy {
+    method public static androidx.work.BackoffPolicy valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.work.BackoffPolicy[] values();
+    enum_constant public static final androidx.work.BackoffPolicy EXPONENTIAL;
+    enum_constant public static final androidx.work.BackoffPolicy LINEAR;
+  }
+
+  public final class Configuration {
+    method public String? getDefaultProcessName();
+    method public java.util.concurrent.Executor getExecutor();
+    method public androidx.work.InitializationExceptionHandler? getInitializationExceptionHandler();
+    method public androidx.work.InputMergerFactory getInputMergerFactory();
+    method public int getMaxJobSchedulerId();
+    method public int getMinJobSchedulerId();
+    method public androidx.work.RunnableScheduler getRunnableScheduler();
+    method public androidx.work.SchedulingExceptionHandler? getSchedulingExceptionHandler();
+    method public java.util.concurrent.Executor getTaskExecutor();
+    method public androidx.work.WorkerFactory getWorkerFactory();
+    field public static final int MIN_SCHEDULER_LIMIT = 20; // 0x14
+  }
+
+  public static final class Configuration.Builder {
+    ctor public Configuration.Builder();
+    method public androidx.work.Configuration build();
+    method public androidx.work.Configuration.Builder setDefaultProcessName(String);
+    method public androidx.work.Configuration.Builder setExecutor(java.util.concurrent.Executor);
+    method public androidx.work.Configuration.Builder setInitializationExceptionHandler(androidx.work.InitializationExceptionHandler);
+    method public androidx.work.Configuration.Builder setInputMergerFactory(androidx.work.InputMergerFactory);
+    method public androidx.work.Configuration.Builder setJobSchedulerJobIdRange(int, int);
+    method public androidx.work.Configuration.Builder setMaxSchedulerLimit(int);
+    method public androidx.work.Configuration.Builder setMinimumLoggingLevel(int);
+    method public androidx.work.Configuration.Builder setRunnableScheduler(androidx.work.RunnableScheduler);
+    method public androidx.work.Configuration.Builder setSchedulingExceptionHandler(androidx.work.SchedulingExceptionHandler);
+    method public androidx.work.Configuration.Builder setTaskExecutor(java.util.concurrent.Executor);
+    method public androidx.work.Configuration.Builder setWorkerFactory(androidx.work.WorkerFactory);
+  }
+
+  public static interface Configuration.Provider {
+    method public androidx.work.Configuration getWorkManagerConfiguration();
+  }
+
+  public final class Constraints {
+    ctor public Constraints(optional @androidx.room.ColumnInfo(name="required_network_type") androidx.work.NetworkType requiredNetworkType, optional @androidx.room.ColumnInfo(name="requires_charging") boolean requiresCharging, optional @androidx.room.ColumnInfo(name="requires_device_idle") boolean requiresDeviceIdle, optional @androidx.room.ColumnInfo(name="requires_battery_not_low") boolean requiresBatteryNotLow, optional @androidx.room.ColumnInfo(name="requires_storage_not_low") boolean requiresStorageNotLow, optional @androidx.room.ColumnInfo(name="trigger_content_update_delay") long contentTriggerUpdateDelayMillis, optional @androidx.room.ColumnInfo(name="trigger_max_content_delay") long contentTriggerMaxDelayMillis, optional @androidx.room.ColumnInfo(name="content_uri_triggers") java.util.Set<androidx.work.Constraints.ContentUriTrigger> contentUriTriggers);
+    ctor public Constraints(androidx.work.Constraints other);
+    method public long getContentTriggerMaxDelayMillis();
+    method public long getContentTriggerUpdateDelayMillis();
+    method public java.util.Set<androidx.work.Constraints.ContentUriTrigger> getContentUriTriggers();
+    method public androidx.work.NetworkType getRequiredNetworkType();
+    method public boolean requiresBatteryNotLow();
+    method public boolean requiresCharging();
+    method @RequiresApi(23) public boolean requiresDeviceIdle();
+    method public boolean requiresStorageNotLow();
+    property public final long contentTriggerMaxDelayMillis;
+    property public final long contentTriggerUpdateDelayMillis;
+    property public final java.util.Set<androidx.work.Constraints.ContentUriTrigger> contentUriTriggers;
+    property public final androidx.work.NetworkType requiredNetworkType;
+    field public static final androidx.work.Constraints.Companion Companion;
+    field public static final androidx.work.Constraints NONE;
+  }
+
+  public static final class Constraints.Builder {
+    ctor public Constraints.Builder();
+    method @RequiresApi(24) public androidx.work.Constraints.Builder addContentUriTrigger(android.net.Uri uri, boolean triggerForDescendants);
+    method public androidx.work.Constraints build();
+    method public androidx.work.Constraints.Builder setRequiredNetworkType(androidx.work.NetworkType networkType);
+    method public androidx.work.Constraints.Builder setRequiresBatteryNotLow(boolean requiresBatteryNotLow);
+    method public androidx.work.Constraints.Builder setRequiresCharging(boolean requiresCharging);
+    method @RequiresApi(23) public androidx.work.Constraints.Builder setRequiresDeviceIdle(boolean requiresDeviceIdle);
+    method public androidx.work.Constraints.Builder setRequiresStorageNotLow(boolean requiresStorageNotLow);
+    method @RequiresApi(24) public androidx.work.Constraints.Builder setTriggerContentMaxDelay(long duration, java.util.concurrent.TimeUnit timeUnit);
+    method @RequiresApi(26) public androidx.work.Constraints.Builder setTriggerContentMaxDelay(java.time.Duration duration);
+    method @RequiresApi(24) public androidx.work.Constraints.Builder setTriggerContentUpdateDelay(long duration, java.util.concurrent.TimeUnit timeUnit);
+    method @RequiresApi(26) public androidx.work.Constraints.Builder setTriggerContentUpdateDelay(java.time.Duration duration);
+  }
+
+  public static final class Constraints.Companion {
+  }
+
+  public static final class Constraints.ContentUriTrigger {
+    ctor public Constraints.ContentUriTrigger(android.net.Uri uri, boolean isTriggeredForDescendants);
+    method public android.net.Uri getUri();
+    method public boolean isTriggeredForDescendants();
+    property public final boolean isTriggeredForDescendants;
+    property public final android.net.Uri uri;
+  }
+
+  public final class Data {
+    ctor public Data(androidx.work.Data);
+    method @androidx.room.TypeConverter public static androidx.work.Data fromByteArray(byte[]);
+    method public boolean getBoolean(String, boolean);
+    method public boolean[]? getBooleanArray(String);
+    method public byte getByte(String, byte);
+    method public byte[]? getByteArray(String);
+    method public double getDouble(String, double);
+    method public double[]? getDoubleArray(String);
+    method public float getFloat(String, float);
+    method public float[]? getFloatArray(String);
+    method public int getInt(String, int);
+    method public int[]? getIntArray(String);
+    method public java.util.Map<java.lang.String!,java.lang.Object!> getKeyValueMap();
+    method public long getLong(String, long);
+    method public long[]? getLongArray(String);
+    method public String? getString(String);
+    method public String![]? getStringArray(String);
+    method public <T> boolean hasKeyWithValueOfType(String, Class<T!>);
+    method public byte[] toByteArray();
+    field public static final androidx.work.Data EMPTY;
+    field public static final int MAX_DATA_BYTES = 10240; // 0x2800
+  }
+
+  public static final class Data.Builder {
+    ctor public Data.Builder();
+    method public androidx.work.Data build();
+    method public androidx.work.Data.Builder putAll(androidx.work.Data);
+    method public androidx.work.Data.Builder putAll(java.util.Map<java.lang.String!,java.lang.Object!>);
+    method public androidx.work.Data.Builder putBoolean(String, boolean);
+    method public androidx.work.Data.Builder putBooleanArray(String, boolean[]);
+    method public androidx.work.Data.Builder putByte(String, byte);
+    method public androidx.work.Data.Builder putByteArray(String, byte[]);
+    method public androidx.work.Data.Builder putDouble(String, double);
+    method public androidx.work.Data.Builder putDoubleArray(String, double[]);
+    method public androidx.work.Data.Builder putFloat(String, float);
+    method public androidx.work.Data.Builder putFloatArray(String, float[]);
+    method public androidx.work.Data.Builder putInt(String, int);
+    method public androidx.work.Data.Builder putIntArray(String, int[]);
+    method public androidx.work.Data.Builder putLong(String, long);
+    method public androidx.work.Data.Builder putLongArray(String, long[]);
+    method public androidx.work.Data.Builder putString(String, String?);
+    method public androidx.work.Data.Builder putStringArray(String, String![]);
+  }
+
+  public class DelegatingWorkerFactory extends androidx.work.WorkerFactory {
+    ctor public DelegatingWorkerFactory();
+    method public final void addFactory(androidx.work.WorkerFactory);
+    method public final androidx.work.ListenableWorker? createWorker(android.content.Context, String, androidx.work.WorkerParameters);
+  }
+
+  public enum ExistingPeriodicWorkPolicy {
+    method public static androidx.work.ExistingPeriodicWorkPolicy valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.work.ExistingPeriodicWorkPolicy[] values();
+    enum_constant public static final androidx.work.ExistingPeriodicWorkPolicy CANCEL_AND_REENQUEUE;
+    enum_constant public static final androidx.work.ExistingPeriodicWorkPolicy KEEP;
+    enum_constant @Deprecated public static final androidx.work.ExistingPeriodicWorkPolicy REPLACE;
+    enum_constant public static final androidx.work.ExistingPeriodicWorkPolicy UPDATE;
+  }
+
+  public enum ExistingWorkPolicy {
+    method public static androidx.work.ExistingWorkPolicy valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.work.ExistingWorkPolicy[] values();
+    enum_constant public static final androidx.work.ExistingWorkPolicy APPEND;
+    enum_constant public static final androidx.work.ExistingWorkPolicy APPEND_OR_REPLACE;
+    enum_constant public static final androidx.work.ExistingWorkPolicy KEEP;
+    enum_constant public static final androidx.work.ExistingWorkPolicy REPLACE;
+  }
+
+  public final class ForegroundInfo {
+    ctor public ForegroundInfo(int, android.app.Notification);
+    ctor public ForegroundInfo(int, android.app.Notification, int);
+    method public int getForegroundServiceType();
+    method public android.app.Notification getNotification();
+    method public int getNotificationId();
+  }
+
+  public interface ForegroundUpdater {
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setForegroundAsync(android.content.Context, java.util.UUID, androidx.work.ForegroundInfo);
+  }
+
+  public interface InitializationExceptionHandler {
+    method public void handleException(Throwable);
+  }
+
+  public abstract class InputMerger {
+    ctor public InputMerger();
+    method public abstract androidx.work.Data merge(java.util.List<androidx.work.Data!>);
+  }
+
+  public abstract class InputMergerFactory {
+    ctor public InputMergerFactory();
+    method public abstract androidx.work.InputMerger? createInputMerger(String);
+  }
+
+  public abstract class ListenableWorker {
+    ctor public ListenableWorker(android.content.Context, androidx.work.WorkerParameters);
+    method public final android.content.Context getApplicationContext();
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.work.ForegroundInfo!> getForegroundInfoAsync();
+    method public final java.util.UUID getId();
+    method public final androidx.work.Data getInputData();
+    method @RequiresApi(28) public final android.net.Network? getNetwork();
+    method @IntRange(from=0) public final int getRunAttemptCount();
+    method public final java.util.Set<java.lang.String!> getTags();
+    method @RequiresApi(24) public final java.util.List<java.lang.String!> getTriggeredContentAuthorities();
+    method @RequiresApi(24) public final java.util.List<android.net.Uri!> getTriggeredContentUris();
+    method public final boolean isStopped();
+    method public void onStopped();
+    method public final com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setForegroundAsync(androidx.work.ForegroundInfo);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setProgressAsync(androidx.work.Data);
+    method @MainThread public abstract com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result!> startWork();
+  }
+
+  public abstract static class ListenableWorker.Result {
+    method public static androidx.work.ListenableWorker.Result failure();
+    method public static androidx.work.ListenableWorker.Result failure(androidx.work.Data);
+    method public abstract androidx.work.Data getOutputData();
+    method public static androidx.work.ListenableWorker.Result retry();
+    method public static androidx.work.ListenableWorker.Result success();
+    method public static androidx.work.ListenableWorker.Result success(androidx.work.Data);
+  }
+
+  public enum NetworkType {
+    method public static androidx.work.NetworkType valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.work.NetworkType[] values();
+    enum_constant public static final androidx.work.NetworkType CONNECTED;
+    enum_constant public static final androidx.work.NetworkType METERED;
+    enum_constant public static final androidx.work.NetworkType NOT_REQUIRED;
+    enum_constant public static final androidx.work.NetworkType NOT_ROAMING;
+    enum_constant @RequiresApi(30) public static final androidx.work.NetworkType TEMPORARILY_UNMETERED;
+    enum_constant public static final androidx.work.NetworkType UNMETERED;
+  }
+
+  public final class OneTimeWorkRequest extends androidx.work.WorkRequest {
+    method public static androidx.work.OneTimeWorkRequest from(Class<? extends androidx.work.ListenableWorker> workerClass);
+    method public static java.util.List<androidx.work.OneTimeWorkRequest> from(java.util.List<? extends java.lang.Class<? extends androidx.work.ListenableWorker>> workerClasses);
+    field public static final androidx.work.OneTimeWorkRequest.Companion Companion;
+  }
+
+  public static final class OneTimeWorkRequest.Builder extends androidx.work.WorkRequest.Builder<androidx.work.OneTimeWorkRequest.Builder,androidx.work.OneTimeWorkRequest> {
+    ctor public OneTimeWorkRequest.Builder(Class<? extends androidx.work.ListenableWorker> workerClass);
+    method public androidx.work.OneTimeWorkRequest.Builder setInputMerger(Class<? extends androidx.work.InputMerger> inputMerger);
+  }
+
+  public static final class OneTimeWorkRequest.Companion {
+    method public androidx.work.OneTimeWorkRequest from(Class<? extends androidx.work.ListenableWorker> workerClass);
+    method public java.util.List<androidx.work.OneTimeWorkRequest> from(java.util.List<? extends java.lang.Class<? extends androidx.work.ListenableWorker>> workerClasses);
+  }
+
+  public final class OneTimeWorkRequestKt {
+    method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.OneTimeWorkRequest.Builder! OneTimeWorkRequestBuilder();
+    method public static inline androidx.work.OneTimeWorkRequest.Builder setInputMerger(androidx.work.OneTimeWorkRequest.Builder, kotlin.reflect.KClass<? extends androidx.work.InputMerger> inputMerger);
+  }
+
+  public interface Operation {
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.work.Operation.State.SUCCESS!> getResult();
+    method public androidx.lifecycle.LiveData<androidx.work.Operation.State!> getState();
+  }
+
+  public abstract static class Operation.State {
+  }
+
+  public static final class Operation.State.FAILURE extends androidx.work.Operation.State {
+    ctor public Operation.State.FAILURE(Throwable);
+    method public Throwable getThrowable();
+  }
+
+  public static final class Operation.State.IN_PROGRESS extends androidx.work.Operation.State {
+  }
+
+  public static final class Operation.State.SUCCESS extends androidx.work.Operation.State {
+  }
+
+  public enum OutOfQuotaPolicy {
+    method public static androidx.work.OutOfQuotaPolicy valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.work.OutOfQuotaPolicy[] values();
+    enum_constant public static final androidx.work.OutOfQuotaPolicy DROP_WORK_REQUEST;
+    enum_constant public static final androidx.work.OutOfQuotaPolicy RUN_AS_NON_EXPEDITED_WORK_REQUEST;
+  }
+
+  public final class OverwritingInputMerger extends androidx.work.InputMerger {
+    ctor public OverwritingInputMerger();
+    method public androidx.work.Data merge(java.util.List<androidx.work.Data!>);
+  }
+
+  public final class PeriodicWorkRequest extends androidx.work.WorkRequest {
+    field public static final androidx.work.PeriodicWorkRequest.Companion Companion;
+    field public static final long MIN_PERIODIC_FLEX_MILLIS = 300000L; // 0x493e0L
+    field public static final long MIN_PERIODIC_INTERVAL_MILLIS = 900000L; // 0xdbba0L
+  }
+
+  public static final class PeriodicWorkRequest.Builder extends androidx.work.WorkRequest.Builder<androidx.work.PeriodicWorkRequest.Builder,androidx.work.PeriodicWorkRequest> {
+    ctor public PeriodicWorkRequest.Builder(Class<? extends androidx.work.ListenableWorker> workerClass, long repeatInterval, java.util.concurrent.TimeUnit repeatIntervalTimeUnit);
+    ctor @RequiresApi(26) public PeriodicWorkRequest.Builder(Class<? extends androidx.work.ListenableWorker> workerClass, java.time.Duration repeatInterval);
+    ctor public PeriodicWorkRequest.Builder(Class<? extends androidx.work.ListenableWorker> workerClass, long repeatInterval, java.util.concurrent.TimeUnit repeatIntervalTimeUnit, long flexInterval, java.util.concurrent.TimeUnit flexIntervalTimeUnit);
+    ctor @RequiresApi(26) public PeriodicWorkRequest.Builder(Class<? extends androidx.work.ListenableWorker> workerClass, java.time.Duration repeatInterval, java.time.Duration flexInterval);
+  }
+
+  public static final class PeriodicWorkRequest.Companion {
+  }
+
+  public final class PeriodicWorkRequestKt {
+    method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder! PeriodicWorkRequestBuilder(long repeatInterval, java.util.concurrent.TimeUnit repeatIntervalTimeUnit);
+    method @RequiresApi(26) public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder! PeriodicWorkRequestBuilder(java.time.Duration repeatInterval);
+    method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder! PeriodicWorkRequestBuilder(long repeatInterval, java.util.concurrent.TimeUnit repeatIntervalTimeUnit, long flexTimeInterval, java.util.concurrent.TimeUnit flexTimeIntervalUnit);
+    method @RequiresApi(26) public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder! PeriodicWorkRequestBuilder(java.time.Duration repeatInterval, java.time.Duration flexTimeInterval);
+  }
+
+  public interface ProgressUpdater {
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> updateProgress(android.content.Context, java.util.UUID, androidx.work.Data);
+  }
+
+  public interface RunnableScheduler {
+    method public void cancel(Runnable);
+    method public void scheduleWithDelay(@IntRange(from=0) long, Runnable);
+  }
+
+  public interface SchedulingExceptionHandler {
+    method public void handleException(Throwable);
+  }
+
+  public abstract class WorkContinuation {
+    ctor public WorkContinuation();
+    method public static androidx.work.WorkContinuation combine(java.util.List<androidx.work.WorkContinuation!>);
+    method public abstract androidx.work.Operation enqueue();
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.util.List<androidx.work.WorkInfo!>!> getWorkInfos();
+    method public abstract androidx.lifecycle.LiveData<java.util.List<androidx.work.WorkInfo!>!> getWorkInfosLiveData();
+    method public final androidx.work.WorkContinuation then(androidx.work.OneTimeWorkRequest);
+    method public abstract androidx.work.WorkContinuation then(java.util.List<androidx.work.OneTimeWorkRequest!>);
+  }
+
+  public final class WorkInfo {
+    method public int getGeneration();
+    method public java.util.UUID getId();
+    method public androidx.work.Data getOutputData();
+    method public androidx.work.Data getProgress();
+    method @IntRange(from=0) public int getRunAttemptCount();
+    method public androidx.work.WorkInfo.State getState();
+    method public java.util.Set<java.lang.String!> getTags();
+  }
+
+  public enum WorkInfo.State {
+    method public boolean isFinished();
+    enum_constant public static final androidx.work.WorkInfo.State BLOCKED;
+    enum_constant public static final androidx.work.WorkInfo.State CANCELLED;
+    enum_constant public static final androidx.work.WorkInfo.State ENQUEUED;
+    enum_constant public static final androidx.work.WorkInfo.State FAILED;
+    enum_constant public static final androidx.work.WorkInfo.State RUNNING;
+    enum_constant public static final androidx.work.WorkInfo.State SUCCEEDED;
+  }
+
+  public abstract class WorkManager {
+    method public final androidx.work.WorkContinuation beginUniqueWork(String, androidx.work.ExistingWorkPolicy, androidx.work.OneTimeWorkRequest);
+    method public abstract androidx.work.WorkContinuation beginUniqueWork(String, androidx.work.ExistingWorkPolicy, java.util.List<androidx.work.OneTimeWorkRequest!>);
+    method public final androidx.work.WorkContinuation beginWith(androidx.work.OneTimeWorkRequest);
+    method public abstract androidx.work.WorkContinuation beginWith(java.util.List<androidx.work.OneTimeWorkRequest!>);
+    method public abstract androidx.work.Operation cancelAllWork();
+    method public abstract androidx.work.Operation cancelAllWorkByTag(String);
+    method public abstract androidx.work.Operation cancelUniqueWork(String);
+    method public abstract androidx.work.Operation cancelWorkById(java.util.UUID);
+    method public abstract android.app.PendingIntent createCancelPendingIntent(java.util.UUID);
+    method public final androidx.work.Operation enqueue(androidx.work.WorkRequest);
+    method public abstract androidx.work.Operation enqueue(java.util.List<? extends androidx.work.WorkRequest>);
+    method public abstract androidx.work.Operation enqueueUniquePeriodicWork(String, androidx.work.ExistingPeriodicWorkPolicy, androidx.work.PeriodicWorkRequest);
+    method public androidx.work.Operation enqueueUniqueWork(String, androidx.work.ExistingWorkPolicy, androidx.work.OneTimeWorkRequest);
+    method public abstract androidx.work.Operation enqueueUniqueWork(String, androidx.work.ExistingWorkPolicy, java.util.List<androidx.work.OneTimeWorkRequest!>);
+    method public abstract androidx.work.Configuration getConfiguration();
+    method @Deprecated public static androidx.work.WorkManager getInstance();
+    method public static androidx.work.WorkManager getInstance(android.content.Context);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Long!> getLastCancelAllTimeMillis();
+    method public abstract androidx.lifecycle.LiveData<java.lang.Long!> getLastCancelAllTimeMillisLiveData();
+    method public abstract com.google.common.util.concurrent.ListenableFuture<androidx.work.WorkInfo!> getWorkInfoById(java.util.UUID);
+    method public abstract androidx.lifecycle.LiveData<androidx.work.WorkInfo!> getWorkInfoByIdLiveData(java.util.UUID);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.util.List<androidx.work.WorkInfo!>!> getWorkInfos(androidx.work.WorkQuery);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.util.List<androidx.work.WorkInfo!>!> getWorkInfosByTag(String);
+    method public abstract androidx.lifecycle.LiveData<java.util.List<androidx.work.WorkInfo!>!> getWorkInfosByTagLiveData(String);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.util.List<androidx.work.WorkInfo!>!> getWorkInfosForUniqueWork(String);
+    method public abstract androidx.lifecycle.LiveData<java.util.List<androidx.work.WorkInfo!>!> getWorkInfosForUniqueWorkLiveData(String);
+    method public abstract androidx.lifecycle.LiveData<java.util.List<androidx.work.WorkInfo!>!> getWorkInfosLiveData(androidx.work.WorkQuery);
+    method public static void initialize(android.content.Context, androidx.work.Configuration);
+    method public static boolean isInitialized();
+    method public abstract androidx.work.Operation pruneWork();
+    method public abstract com.google.common.util.concurrent.ListenableFuture<androidx.work.WorkManager.UpdateResult!> updateWork(androidx.work.WorkRequest);
+  }
+
+  public enum WorkManager.UpdateResult {
+    enum_constant public static final androidx.work.WorkManager.UpdateResult APPLIED_FOR_NEXT_RUN;
+    enum_constant public static final androidx.work.WorkManager.UpdateResult APPLIED_IMMEDIATELY;
+    enum_constant public static final androidx.work.WorkManager.UpdateResult NOT_APPLIED;
+  }
+
+  public final class WorkManagerInitializer implements androidx.startup.Initializer<androidx.work.WorkManager> {
+    ctor public WorkManagerInitializer();
+    method public androidx.work.WorkManager create(android.content.Context);
+    method public java.util.List<java.lang.Class<? extends androidx.startup.Initializer<?>>!> dependencies();
+  }
+
+  public final class WorkQuery {
+    method public static androidx.work.WorkQuery fromIds(java.util.List<java.util.UUID!>);
+    method public static androidx.work.WorkQuery fromIds(java.util.UUID!...);
+    method public static androidx.work.WorkQuery fromStates(java.util.List<androidx.work.WorkInfo.State!>);
+    method public static androidx.work.WorkQuery fromStates(androidx.work.WorkInfo.State!...);
+    method public static androidx.work.WorkQuery fromTags(java.util.List<java.lang.String!>);
+    method public static androidx.work.WorkQuery fromTags(java.lang.String!...);
+    method public static androidx.work.WorkQuery fromUniqueWorkNames(java.lang.String!...);
+    method public static androidx.work.WorkQuery fromUniqueWorkNames(java.util.List<java.lang.String!>);
+    method public java.util.List<java.util.UUID!> getIds();
+    method public java.util.List<androidx.work.WorkInfo.State!> getStates();
+    method public java.util.List<java.lang.String!> getTags();
+    method public java.util.List<java.lang.String!> getUniqueWorkNames();
+  }
+
+  public static final class WorkQuery.Builder {
+    method public androidx.work.WorkQuery.Builder addIds(java.util.List<java.util.UUID!>);
+    method public androidx.work.WorkQuery.Builder addStates(java.util.List<androidx.work.WorkInfo.State!>);
+    method public androidx.work.WorkQuery.Builder addTags(java.util.List<java.lang.String!>);
+    method public androidx.work.WorkQuery.Builder addUniqueWorkNames(java.util.List<java.lang.String!>);
+    method public androidx.work.WorkQuery build();
+    method public static androidx.work.WorkQuery.Builder fromIds(java.util.List<java.util.UUID!>);
+    method public static androidx.work.WorkQuery.Builder fromStates(java.util.List<androidx.work.WorkInfo.State!>);
+    method public static androidx.work.WorkQuery.Builder fromTags(java.util.List<java.lang.String!>);
+    method public static androidx.work.WorkQuery.Builder fromUniqueWorkNames(java.util.List<java.lang.String!>);
+  }
+
+  public abstract class WorkRequest {
+    method public java.util.UUID getId();
+    property public java.util.UUID id;
+    field public static final androidx.work.WorkRequest.Companion Companion;
+    field public static final long DEFAULT_BACKOFF_DELAY_MILLIS = 30000L; // 0x7530L
+    field public static final long MAX_BACKOFF_MILLIS = 18000000L; // 0x112a880L
+    field public static final long MIN_BACKOFF_MILLIS = 10000L; // 0x2710L
+  }
+
+  public abstract static class WorkRequest.Builder<B extends androidx.work.WorkRequest.Builder<B, ?>, W extends androidx.work.WorkRequest> {
+    method public final B addTag(String tag);
+    method public final W build();
+    method public final B keepResultsForAtLeast(long duration, java.util.concurrent.TimeUnit timeUnit);
+    method @RequiresApi(26) public final B keepResultsForAtLeast(java.time.Duration duration);
+    method public final B setBackoffCriteria(androidx.work.BackoffPolicy backoffPolicy, long backoffDelay, java.util.concurrent.TimeUnit timeUnit);
+    method @RequiresApi(26) public final B setBackoffCriteria(androidx.work.BackoffPolicy backoffPolicy, java.time.Duration duration);
+    method public final B setConstraints(androidx.work.Constraints constraints);
+    method public B setExpedited(androidx.work.OutOfQuotaPolicy policy);
+    method public final B setId(java.util.UUID id);
+    method public B setInitialDelay(long duration, java.util.concurrent.TimeUnit timeUnit);
+    method @RequiresApi(26) public B setInitialDelay(java.time.Duration duration);
+    method public final B setInputData(androidx.work.Data inputData);
+  }
+
+  public static final class WorkRequest.Companion {
+  }
+
+  public abstract class Worker extends androidx.work.ListenableWorker {
+    ctor public Worker(android.content.Context, androidx.work.WorkerParameters);
+    method @WorkerThread public abstract androidx.work.ListenableWorker.Result doWork();
+    method @WorkerThread public androidx.work.ForegroundInfo getForegroundInfo();
+    method public final com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result!> startWork();
+  }
+
+  public abstract class WorkerFactory {
+    ctor public WorkerFactory();
+    method public abstract androidx.work.ListenableWorker? createWorker(android.content.Context, String, androidx.work.WorkerParameters);
+  }
+
+  public final class WorkerParameters {
+    method @IntRange(from=0) public int getGeneration();
+    method public java.util.UUID getId();
+    method public androidx.work.Data getInputData();
+    method @RequiresApi(28) public android.net.Network? getNetwork();
+    method @IntRange(from=0) public int getRunAttemptCount();
+    method public java.util.Set<java.lang.String!> getTags();
+    method @RequiresApi(24) public java.util.List<java.lang.String!> getTriggeredContentAuthorities();
+    method @RequiresApi(24) public java.util.List<android.net.Uri!> getTriggeredContentUris();
+  }
+
+}
+
+package androidx.work.multiprocess {
+
+  public abstract class RemoteWorkContinuation {
+    method public static androidx.work.multiprocess.RemoteWorkContinuation combine(java.util.List<androidx.work.multiprocess.RemoteWorkContinuation!>);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enqueue();
+    method public final androidx.work.multiprocess.RemoteWorkContinuation then(androidx.work.OneTimeWorkRequest);
+    method public abstract androidx.work.multiprocess.RemoteWorkContinuation then(java.util.List<androidx.work.OneTimeWorkRequest!>);
+  }
+
+  public abstract class RemoteWorkManager {
+    method public final androidx.work.multiprocess.RemoteWorkContinuation beginUniqueWork(String, androidx.work.ExistingWorkPolicy, androidx.work.OneTimeWorkRequest);
+    method public abstract androidx.work.multiprocess.RemoteWorkContinuation beginUniqueWork(String, androidx.work.ExistingWorkPolicy, java.util.List<androidx.work.OneTimeWorkRequest!>);
+    method public final androidx.work.multiprocess.RemoteWorkContinuation beginWith(androidx.work.OneTimeWorkRequest);
+    method public abstract androidx.work.multiprocess.RemoteWorkContinuation beginWith(java.util.List<androidx.work.OneTimeWorkRequest!>);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> cancelAllWork();
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> cancelAllWorkByTag(String);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> cancelUniqueWork(String);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> cancelWorkById(java.util.UUID);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enqueue(androidx.work.WorkRequest);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enqueue(java.util.List<androidx.work.WorkRequest!>);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enqueueUniquePeriodicWork(String, androidx.work.ExistingPeriodicWorkPolicy, androidx.work.PeriodicWorkRequest);
+    method public final com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enqueueUniqueWork(String, androidx.work.ExistingWorkPolicy, androidx.work.OneTimeWorkRequest);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enqueueUniqueWork(String, androidx.work.ExistingWorkPolicy, java.util.List<androidx.work.OneTimeWorkRequest!>);
+    method public static androidx.work.multiprocess.RemoteWorkManager getInstance(android.content.Context);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.util.List<androidx.work.WorkInfo!>!> getWorkInfos(androidx.work.WorkQuery);
+  }
+
+}
+
diff --git a/work/work-runtime/api/public_plus_experimental_2.8.0-beta01.txt b/work/work-runtime/api/public_plus_experimental_2.8.0-beta01.txt
new file mode 100644
index 0000000..4519d02
--- /dev/null
+++ b/work/work-runtime/api/public_plus_experimental_2.8.0-beta01.txt
@@ -0,0 +1,499 @@
+// Signature format: 4.0
+package androidx.work {
+
+  public final class ArrayCreatingInputMerger extends androidx.work.InputMerger {
+    ctor public ArrayCreatingInputMerger();
+    method public androidx.work.Data merge(java.util.List<androidx.work.Data> inputs);
+  }
+
+  public enum BackoffPolicy {
+    method public static androidx.work.BackoffPolicy valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.work.BackoffPolicy[] values();
+    enum_constant public static final androidx.work.BackoffPolicy EXPONENTIAL;
+    enum_constant public static final androidx.work.BackoffPolicy LINEAR;
+  }
+
+  public final class Configuration {
+    method public String? getDefaultProcessName();
+    method public java.util.concurrent.Executor getExecutor();
+    method public androidx.work.InitializationExceptionHandler? getInitializationExceptionHandler();
+    method public androidx.work.InputMergerFactory getInputMergerFactory();
+    method public int getMaxJobSchedulerId();
+    method public int getMinJobSchedulerId();
+    method public androidx.work.RunnableScheduler getRunnableScheduler();
+    method public androidx.work.SchedulingExceptionHandler? getSchedulingExceptionHandler();
+    method public java.util.concurrent.Executor getTaskExecutor();
+    method public androidx.work.WorkerFactory getWorkerFactory();
+    field public static final int MIN_SCHEDULER_LIMIT = 20; // 0x14
+  }
+
+  public static final class Configuration.Builder {
+    ctor public Configuration.Builder();
+    method public androidx.work.Configuration build();
+    method public androidx.work.Configuration.Builder setDefaultProcessName(String);
+    method public androidx.work.Configuration.Builder setExecutor(java.util.concurrent.Executor);
+    method public androidx.work.Configuration.Builder setInitializationExceptionHandler(androidx.work.InitializationExceptionHandler);
+    method public androidx.work.Configuration.Builder setInputMergerFactory(androidx.work.InputMergerFactory);
+    method public androidx.work.Configuration.Builder setJobSchedulerJobIdRange(int, int);
+    method public androidx.work.Configuration.Builder setMaxSchedulerLimit(int);
+    method public androidx.work.Configuration.Builder setMinimumLoggingLevel(int);
+    method public androidx.work.Configuration.Builder setRunnableScheduler(androidx.work.RunnableScheduler);
+    method public androidx.work.Configuration.Builder setSchedulingExceptionHandler(androidx.work.SchedulingExceptionHandler);
+    method public androidx.work.Configuration.Builder setTaskExecutor(java.util.concurrent.Executor);
+    method public androidx.work.Configuration.Builder setWorkerFactory(androidx.work.WorkerFactory);
+  }
+
+  public static interface Configuration.Provider {
+    method public androidx.work.Configuration getWorkManagerConfiguration();
+  }
+
+  public final class Constraints {
+    ctor public Constraints(optional @androidx.room.ColumnInfo(name="required_network_type") androidx.work.NetworkType requiredNetworkType, optional @androidx.room.ColumnInfo(name="requires_charging") boolean requiresCharging, optional @androidx.room.ColumnInfo(name="requires_device_idle") boolean requiresDeviceIdle, optional @androidx.room.ColumnInfo(name="requires_battery_not_low") boolean requiresBatteryNotLow, optional @androidx.room.ColumnInfo(name="requires_storage_not_low") boolean requiresStorageNotLow, optional @androidx.room.ColumnInfo(name="trigger_content_update_delay") long contentTriggerUpdateDelayMillis, optional @androidx.room.ColumnInfo(name="trigger_max_content_delay") long contentTriggerMaxDelayMillis, optional @androidx.room.ColumnInfo(name="content_uri_triggers") java.util.Set<androidx.work.Constraints.ContentUriTrigger> contentUriTriggers);
+    ctor public Constraints(androidx.work.Constraints other);
+    method public long getContentTriggerMaxDelayMillis();
+    method public long getContentTriggerUpdateDelayMillis();
+    method public java.util.Set<androidx.work.Constraints.ContentUriTrigger> getContentUriTriggers();
+    method public androidx.work.NetworkType getRequiredNetworkType();
+    method public boolean requiresBatteryNotLow();
+    method public boolean requiresCharging();
+    method @RequiresApi(23) public boolean requiresDeviceIdle();
+    method public boolean requiresStorageNotLow();
+    property public final long contentTriggerMaxDelayMillis;
+    property public final long contentTriggerUpdateDelayMillis;
+    property public final java.util.Set<androidx.work.Constraints.ContentUriTrigger> contentUriTriggers;
+    property public final androidx.work.NetworkType requiredNetworkType;
+    field public static final androidx.work.Constraints.Companion Companion;
+    field public static final androidx.work.Constraints NONE;
+  }
+
+  public static final class Constraints.Builder {
+    ctor public Constraints.Builder();
+    method @RequiresApi(24) public androidx.work.Constraints.Builder addContentUriTrigger(android.net.Uri uri, boolean triggerForDescendants);
+    method public androidx.work.Constraints build();
+    method public androidx.work.Constraints.Builder setRequiredNetworkType(androidx.work.NetworkType networkType);
+    method public androidx.work.Constraints.Builder setRequiresBatteryNotLow(boolean requiresBatteryNotLow);
+    method public androidx.work.Constraints.Builder setRequiresCharging(boolean requiresCharging);
+    method @RequiresApi(23) public androidx.work.Constraints.Builder setRequiresDeviceIdle(boolean requiresDeviceIdle);
+    method public androidx.work.Constraints.Builder setRequiresStorageNotLow(boolean requiresStorageNotLow);
+    method @RequiresApi(24) public androidx.work.Constraints.Builder setTriggerContentMaxDelay(long duration, java.util.concurrent.TimeUnit timeUnit);
+    method @RequiresApi(26) public androidx.work.Constraints.Builder setTriggerContentMaxDelay(java.time.Duration duration);
+    method @RequiresApi(24) public androidx.work.Constraints.Builder setTriggerContentUpdateDelay(long duration, java.util.concurrent.TimeUnit timeUnit);
+    method @RequiresApi(26) public androidx.work.Constraints.Builder setTriggerContentUpdateDelay(java.time.Duration duration);
+  }
+
+  public static final class Constraints.Companion {
+  }
+
+  public static final class Constraints.ContentUriTrigger {
+    ctor public Constraints.ContentUriTrigger(android.net.Uri uri, boolean isTriggeredForDescendants);
+    method public android.net.Uri getUri();
+    method public boolean isTriggeredForDescendants();
+    property public final boolean isTriggeredForDescendants;
+    property public final android.net.Uri uri;
+  }
+
+  public final class Data {
+    ctor public Data(androidx.work.Data);
+    method @androidx.room.TypeConverter public static androidx.work.Data fromByteArray(byte[]);
+    method public boolean getBoolean(String, boolean);
+    method public boolean[]? getBooleanArray(String);
+    method public byte getByte(String, byte);
+    method public byte[]? getByteArray(String);
+    method public double getDouble(String, double);
+    method public double[]? getDoubleArray(String);
+    method public float getFloat(String, float);
+    method public float[]? getFloatArray(String);
+    method public int getInt(String, int);
+    method public int[]? getIntArray(String);
+    method public java.util.Map<java.lang.String!,java.lang.Object!> getKeyValueMap();
+    method public long getLong(String, long);
+    method public long[]? getLongArray(String);
+    method public String? getString(String);
+    method public String![]? getStringArray(String);
+    method public <T> boolean hasKeyWithValueOfType(String, Class<T!>);
+    method public byte[] toByteArray();
+    field public static final androidx.work.Data EMPTY;
+    field public static final int MAX_DATA_BYTES = 10240; // 0x2800
+  }
+
+  public static final class Data.Builder {
+    ctor public Data.Builder();
+    method public androidx.work.Data build();
+    method public androidx.work.Data.Builder putAll(androidx.work.Data);
+    method public androidx.work.Data.Builder putAll(java.util.Map<java.lang.String!,java.lang.Object!>);
+    method public androidx.work.Data.Builder putBoolean(String, boolean);
+    method public androidx.work.Data.Builder putBooleanArray(String, boolean[]);
+    method public androidx.work.Data.Builder putByte(String, byte);
+    method public androidx.work.Data.Builder putByteArray(String, byte[]);
+    method public androidx.work.Data.Builder putDouble(String, double);
+    method public androidx.work.Data.Builder putDoubleArray(String, double[]);
+    method public androidx.work.Data.Builder putFloat(String, float);
+    method public androidx.work.Data.Builder putFloatArray(String, float[]);
+    method public androidx.work.Data.Builder putInt(String, int);
+    method public androidx.work.Data.Builder putIntArray(String, int[]);
+    method public androidx.work.Data.Builder putLong(String, long);
+    method public androidx.work.Data.Builder putLongArray(String, long[]);
+    method public androidx.work.Data.Builder putString(String, String?);
+    method public androidx.work.Data.Builder putStringArray(String, String![]);
+  }
+
+  public class DelegatingWorkerFactory extends androidx.work.WorkerFactory {
+    ctor public DelegatingWorkerFactory();
+    method public final void addFactory(androidx.work.WorkerFactory);
+    method public final androidx.work.ListenableWorker? createWorker(android.content.Context, String, androidx.work.WorkerParameters);
+  }
+
+  public enum ExistingPeriodicWorkPolicy {
+    method public static androidx.work.ExistingPeriodicWorkPolicy valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.work.ExistingPeriodicWorkPolicy[] values();
+    enum_constant public static final androidx.work.ExistingPeriodicWorkPolicy CANCEL_AND_REENQUEUE;
+    enum_constant public static final androidx.work.ExistingPeriodicWorkPolicy KEEP;
+    enum_constant @Deprecated public static final androidx.work.ExistingPeriodicWorkPolicy REPLACE;
+    enum_constant public static final androidx.work.ExistingPeriodicWorkPolicy UPDATE;
+  }
+
+  public enum ExistingWorkPolicy {
+    method public static androidx.work.ExistingWorkPolicy valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.work.ExistingWorkPolicy[] values();
+    enum_constant public static final androidx.work.ExistingWorkPolicy APPEND;
+    enum_constant public static final androidx.work.ExistingWorkPolicy APPEND_OR_REPLACE;
+    enum_constant public static final androidx.work.ExistingWorkPolicy KEEP;
+    enum_constant public static final androidx.work.ExistingWorkPolicy REPLACE;
+  }
+
+  public final class ForegroundInfo {
+    ctor public ForegroundInfo(int, android.app.Notification);
+    ctor public ForegroundInfo(int, android.app.Notification, int);
+    method public int getForegroundServiceType();
+    method public android.app.Notification getNotification();
+    method public int getNotificationId();
+  }
+
+  public interface ForegroundUpdater {
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setForegroundAsync(android.content.Context, java.util.UUID, androidx.work.ForegroundInfo);
+  }
+
+  public interface InitializationExceptionHandler {
+    method public void handleException(Throwable);
+  }
+
+  public abstract class InputMerger {
+    ctor public InputMerger();
+    method public abstract androidx.work.Data merge(java.util.List<androidx.work.Data!>);
+  }
+
+  public abstract class InputMergerFactory {
+    ctor public InputMergerFactory();
+    method public abstract androidx.work.InputMerger? createInputMerger(String);
+  }
+
+  public abstract class ListenableWorker {
+    ctor public ListenableWorker(android.content.Context, androidx.work.WorkerParameters);
+    method public final android.content.Context getApplicationContext();
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.work.ForegroundInfo!> getForegroundInfoAsync();
+    method public final java.util.UUID getId();
+    method public final androidx.work.Data getInputData();
+    method @RequiresApi(28) public final android.net.Network? getNetwork();
+    method @IntRange(from=0) public final int getRunAttemptCount();
+    method public final java.util.Set<java.lang.String!> getTags();
+    method @RequiresApi(24) public final java.util.List<java.lang.String!> getTriggeredContentAuthorities();
+    method @RequiresApi(24) public final java.util.List<android.net.Uri!> getTriggeredContentUris();
+    method public final boolean isStopped();
+    method public void onStopped();
+    method public final com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setForegroundAsync(androidx.work.ForegroundInfo);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setProgressAsync(androidx.work.Data);
+    method @MainThread public abstract com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result!> startWork();
+  }
+
+  public abstract static class ListenableWorker.Result {
+    method public static androidx.work.ListenableWorker.Result failure();
+    method public static androidx.work.ListenableWorker.Result failure(androidx.work.Data);
+    method public abstract androidx.work.Data getOutputData();
+    method public static androidx.work.ListenableWorker.Result retry();
+    method public static androidx.work.ListenableWorker.Result success();
+    method public static androidx.work.ListenableWorker.Result success(androidx.work.Data);
+  }
+
+  public enum NetworkType {
+    method public static androidx.work.NetworkType valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.work.NetworkType[] values();
+    enum_constant public static final androidx.work.NetworkType CONNECTED;
+    enum_constant public static final androidx.work.NetworkType METERED;
+    enum_constant public static final androidx.work.NetworkType NOT_REQUIRED;
+    enum_constant public static final androidx.work.NetworkType NOT_ROAMING;
+    enum_constant @RequiresApi(30) public static final androidx.work.NetworkType TEMPORARILY_UNMETERED;
+    enum_constant public static final androidx.work.NetworkType UNMETERED;
+  }
+
+  public final class OneTimeWorkRequest extends androidx.work.WorkRequest {
+    method public static androidx.work.OneTimeWorkRequest from(Class<? extends androidx.work.ListenableWorker> workerClass);
+    method public static java.util.List<androidx.work.OneTimeWorkRequest> from(java.util.List<? extends java.lang.Class<? extends androidx.work.ListenableWorker>> workerClasses);
+    field public static final androidx.work.OneTimeWorkRequest.Companion Companion;
+  }
+
+  public static final class OneTimeWorkRequest.Builder extends androidx.work.WorkRequest.Builder<androidx.work.OneTimeWorkRequest.Builder,androidx.work.OneTimeWorkRequest> {
+    ctor public OneTimeWorkRequest.Builder(Class<? extends androidx.work.ListenableWorker> workerClass);
+    method public androidx.work.OneTimeWorkRequest.Builder setInputMerger(Class<? extends androidx.work.InputMerger> inputMerger);
+  }
+
+  public static final class OneTimeWorkRequest.Companion {
+    method public androidx.work.OneTimeWorkRequest from(Class<? extends androidx.work.ListenableWorker> workerClass);
+    method public java.util.List<androidx.work.OneTimeWorkRequest> from(java.util.List<? extends java.lang.Class<? extends androidx.work.ListenableWorker>> workerClasses);
+  }
+
+  public final class OneTimeWorkRequestKt {
+    method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.OneTimeWorkRequest.Builder! OneTimeWorkRequestBuilder();
+    method public static inline androidx.work.OneTimeWorkRequest.Builder setInputMerger(androidx.work.OneTimeWorkRequest.Builder, kotlin.reflect.KClass<? extends androidx.work.InputMerger> inputMerger);
+  }
+
+  public interface Operation {
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.work.Operation.State.SUCCESS!> getResult();
+    method public androidx.lifecycle.LiveData<androidx.work.Operation.State!> getState();
+  }
+
+  public abstract static class Operation.State {
+  }
+
+  public static final class Operation.State.FAILURE extends androidx.work.Operation.State {
+    ctor public Operation.State.FAILURE(Throwable);
+    method public Throwable getThrowable();
+  }
+
+  public static final class Operation.State.IN_PROGRESS extends androidx.work.Operation.State {
+  }
+
+  public static final class Operation.State.SUCCESS extends androidx.work.Operation.State {
+  }
+
+  public enum OutOfQuotaPolicy {
+    method public static androidx.work.OutOfQuotaPolicy valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.work.OutOfQuotaPolicy[] values();
+    enum_constant public static final androidx.work.OutOfQuotaPolicy DROP_WORK_REQUEST;
+    enum_constant public static final androidx.work.OutOfQuotaPolicy RUN_AS_NON_EXPEDITED_WORK_REQUEST;
+  }
+
+  public final class OverwritingInputMerger extends androidx.work.InputMerger {
+    ctor public OverwritingInputMerger();
+    method public androidx.work.Data merge(java.util.List<androidx.work.Data!>);
+  }
+
+  public final class PeriodicWorkRequest extends androidx.work.WorkRequest {
+    field public static final androidx.work.PeriodicWorkRequest.Companion Companion;
+    field public static final long MIN_PERIODIC_FLEX_MILLIS = 300000L; // 0x493e0L
+    field public static final long MIN_PERIODIC_INTERVAL_MILLIS = 900000L; // 0xdbba0L
+  }
+
+  public static final class PeriodicWorkRequest.Builder extends androidx.work.WorkRequest.Builder<androidx.work.PeriodicWorkRequest.Builder,androidx.work.PeriodicWorkRequest> {
+    ctor public PeriodicWorkRequest.Builder(Class<? extends androidx.work.ListenableWorker> workerClass, long repeatInterval, java.util.concurrent.TimeUnit repeatIntervalTimeUnit);
+    ctor @RequiresApi(26) public PeriodicWorkRequest.Builder(Class<? extends androidx.work.ListenableWorker> workerClass, java.time.Duration repeatInterval);
+    ctor public PeriodicWorkRequest.Builder(Class<? extends androidx.work.ListenableWorker> workerClass, long repeatInterval, java.util.concurrent.TimeUnit repeatIntervalTimeUnit, long flexInterval, java.util.concurrent.TimeUnit flexIntervalTimeUnit);
+    ctor @RequiresApi(26) public PeriodicWorkRequest.Builder(Class<? extends androidx.work.ListenableWorker> workerClass, java.time.Duration repeatInterval, java.time.Duration flexInterval);
+  }
+
+  public static final class PeriodicWorkRequest.Companion {
+  }
+
+  public final class PeriodicWorkRequestKt {
+    method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder! PeriodicWorkRequestBuilder(long repeatInterval, java.util.concurrent.TimeUnit repeatIntervalTimeUnit);
+    method @RequiresApi(26) public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder! PeriodicWorkRequestBuilder(java.time.Duration repeatInterval);
+    method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder! PeriodicWorkRequestBuilder(long repeatInterval, java.util.concurrent.TimeUnit repeatIntervalTimeUnit, long flexTimeInterval, java.util.concurrent.TimeUnit flexTimeIntervalUnit);
+    method @RequiresApi(26) public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder! PeriodicWorkRequestBuilder(java.time.Duration repeatInterval, java.time.Duration flexTimeInterval);
+  }
+
+  public interface ProgressUpdater {
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> updateProgress(android.content.Context, java.util.UUID, androidx.work.Data);
+  }
+
+  public interface RunnableScheduler {
+    method public void cancel(Runnable);
+    method public void scheduleWithDelay(@IntRange(from=0) long, Runnable);
+  }
+
+  public interface SchedulingExceptionHandler {
+    method public void handleException(Throwable);
+  }
+
+  public abstract class WorkContinuation {
+    ctor public WorkContinuation();
+    method public static androidx.work.WorkContinuation combine(java.util.List<androidx.work.WorkContinuation!>);
+    method public abstract androidx.work.Operation enqueue();
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.util.List<androidx.work.WorkInfo!>!> getWorkInfos();
+    method public abstract androidx.lifecycle.LiveData<java.util.List<androidx.work.WorkInfo!>!> getWorkInfosLiveData();
+    method public final androidx.work.WorkContinuation then(androidx.work.OneTimeWorkRequest);
+    method public abstract androidx.work.WorkContinuation then(java.util.List<androidx.work.OneTimeWorkRequest!>);
+  }
+
+  public final class WorkInfo {
+    method public int getGeneration();
+    method public java.util.UUID getId();
+    method public androidx.work.Data getOutputData();
+    method public androidx.work.Data getProgress();
+    method @IntRange(from=0) public int getRunAttemptCount();
+    method public androidx.work.WorkInfo.State getState();
+    method public java.util.Set<java.lang.String!> getTags();
+  }
+
+  public enum WorkInfo.State {
+    method public boolean isFinished();
+    enum_constant public static final androidx.work.WorkInfo.State BLOCKED;
+    enum_constant public static final androidx.work.WorkInfo.State CANCELLED;
+    enum_constant public static final androidx.work.WorkInfo.State ENQUEUED;
+    enum_constant public static final androidx.work.WorkInfo.State FAILED;
+    enum_constant public static final androidx.work.WorkInfo.State RUNNING;
+    enum_constant public static final androidx.work.WorkInfo.State SUCCEEDED;
+  }
+
+  public abstract class WorkManager {
+    method public final androidx.work.WorkContinuation beginUniqueWork(String, androidx.work.ExistingWorkPolicy, androidx.work.OneTimeWorkRequest);
+    method public abstract androidx.work.WorkContinuation beginUniqueWork(String, androidx.work.ExistingWorkPolicy, java.util.List<androidx.work.OneTimeWorkRequest!>);
+    method public final androidx.work.WorkContinuation beginWith(androidx.work.OneTimeWorkRequest);
+    method public abstract androidx.work.WorkContinuation beginWith(java.util.List<androidx.work.OneTimeWorkRequest!>);
+    method public abstract androidx.work.Operation cancelAllWork();
+    method public abstract androidx.work.Operation cancelAllWorkByTag(String);
+    method public abstract androidx.work.Operation cancelUniqueWork(String);
+    method public abstract androidx.work.Operation cancelWorkById(java.util.UUID);
+    method public abstract android.app.PendingIntent createCancelPendingIntent(java.util.UUID);
+    method public final androidx.work.Operation enqueue(androidx.work.WorkRequest);
+    method public abstract androidx.work.Operation enqueue(java.util.List<? extends androidx.work.WorkRequest>);
+    method public abstract androidx.work.Operation enqueueUniquePeriodicWork(String, androidx.work.ExistingPeriodicWorkPolicy, androidx.work.PeriodicWorkRequest);
+    method public androidx.work.Operation enqueueUniqueWork(String, androidx.work.ExistingWorkPolicy, androidx.work.OneTimeWorkRequest);
+    method public abstract androidx.work.Operation enqueueUniqueWork(String, androidx.work.ExistingWorkPolicy, java.util.List<androidx.work.OneTimeWorkRequest!>);
+    method public abstract androidx.work.Configuration getConfiguration();
+    method @Deprecated public static androidx.work.WorkManager getInstance();
+    method public static androidx.work.WorkManager getInstance(android.content.Context);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Long!> getLastCancelAllTimeMillis();
+    method public abstract androidx.lifecycle.LiveData<java.lang.Long!> getLastCancelAllTimeMillisLiveData();
+    method public abstract com.google.common.util.concurrent.ListenableFuture<androidx.work.WorkInfo!> getWorkInfoById(java.util.UUID);
+    method public abstract androidx.lifecycle.LiveData<androidx.work.WorkInfo!> getWorkInfoByIdLiveData(java.util.UUID);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.util.List<androidx.work.WorkInfo!>!> getWorkInfos(androidx.work.WorkQuery);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.util.List<androidx.work.WorkInfo!>!> getWorkInfosByTag(String);
+    method public abstract androidx.lifecycle.LiveData<java.util.List<androidx.work.WorkInfo!>!> getWorkInfosByTagLiveData(String);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.util.List<androidx.work.WorkInfo!>!> getWorkInfosForUniqueWork(String);
+    method public abstract androidx.lifecycle.LiveData<java.util.List<androidx.work.WorkInfo!>!> getWorkInfosForUniqueWorkLiveData(String);
+    method public abstract androidx.lifecycle.LiveData<java.util.List<androidx.work.WorkInfo!>!> getWorkInfosLiveData(androidx.work.WorkQuery);
+    method public static void initialize(android.content.Context, androidx.work.Configuration);
+    method public static boolean isInitialized();
+    method public abstract androidx.work.Operation pruneWork();
+    method public abstract com.google.common.util.concurrent.ListenableFuture<androidx.work.WorkManager.UpdateResult!> updateWork(androidx.work.WorkRequest);
+  }
+
+  public enum WorkManager.UpdateResult {
+    enum_constant public static final androidx.work.WorkManager.UpdateResult APPLIED_FOR_NEXT_RUN;
+    enum_constant public static final androidx.work.WorkManager.UpdateResult APPLIED_IMMEDIATELY;
+    enum_constant public static final androidx.work.WorkManager.UpdateResult NOT_APPLIED;
+  }
+
+  public final class WorkManagerInitializer implements androidx.startup.Initializer<androidx.work.WorkManager> {
+    ctor public WorkManagerInitializer();
+    method public androidx.work.WorkManager create(android.content.Context);
+    method public java.util.List<java.lang.Class<? extends androidx.startup.Initializer<?>>!> dependencies();
+  }
+
+  public final class WorkQuery {
+    method public static androidx.work.WorkQuery fromIds(java.util.List<java.util.UUID!>);
+    method public static androidx.work.WorkQuery fromIds(java.util.UUID!...);
+    method public static androidx.work.WorkQuery fromStates(java.util.List<androidx.work.WorkInfo.State!>);
+    method public static androidx.work.WorkQuery fromStates(androidx.work.WorkInfo.State!...);
+    method public static androidx.work.WorkQuery fromTags(java.util.List<java.lang.String!>);
+    method public static androidx.work.WorkQuery fromTags(java.lang.String!...);
+    method public static androidx.work.WorkQuery fromUniqueWorkNames(java.lang.String!...);
+    method public static androidx.work.WorkQuery fromUniqueWorkNames(java.util.List<java.lang.String!>);
+    method public java.util.List<java.util.UUID!> getIds();
+    method public java.util.List<androidx.work.WorkInfo.State!> getStates();
+    method public java.util.List<java.lang.String!> getTags();
+    method public java.util.List<java.lang.String!> getUniqueWorkNames();
+  }
+
+  public static final class WorkQuery.Builder {
+    method public androidx.work.WorkQuery.Builder addIds(java.util.List<java.util.UUID!>);
+    method public androidx.work.WorkQuery.Builder addStates(java.util.List<androidx.work.WorkInfo.State!>);
+    method public androidx.work.WorkQuery.Builder addTags(java.util.List<java.lang.String!>);
+    method public androidx.work.WorkQuery.Builder addUniqueWorkNames(java.util.List<java.lang.String!>);
+    method public androidx.work.WorkQuery build();
+    method public static androidx.work.WorkQuery.Builder fromIds(java.util.List<java.util.UUID!>);
+    method public static androidx.work.WorkQuery.Builder fromStates(java.util.List<androidx.work.WorkInfo.State!>);
+    method public static androidx.work.WorkQuery.Builder fromTags(java.util.List<java.lang.String!>);
+    method public static androidx.work.WorkQuery.Builder fromUniqueWorkNames(java.util.List<java.lang.String!>);
+  }
+
+  public abstract class WorkRequest {
+    method public java.util.UUID getId();
+    property public java.util.UUID id;
+    field public static final androidx.work.WorkRequest.Companion Companion;
+    field public static final long DEFAULT_BACKOFF_DELAY_MILLIS = 30000L; // 0x7530L
+    field public static final long MAX_BACKOFF_MILLIS = 18000000L; // 0x112a880L
+    field public static final long MIN_BACKOFF_MILLIS = 10000L; // 0x2710L
+  }
+
+  public abstract static class WorkRequest.Builder<B extends androidx.work.WorkRequest.Builder<B, ?>, W extends androidx.work.WorkRequest> {
+    method public final B addTag(String tag);
+    method public final W build();
+    method public final B keepResultsForAtLeast(long duration, java.util.concurrent.TimeUnit timeUnit);
+    method @RequiresApi(26) public final B keepResultsForAtLeast(java.time.Duration duration);
+    method public final B setBackoffCriteria(androidx.work.BackoffPolicy backoffPolicy, long backoffDelay, java.util.concurrent.TimeUnit timeUnit);
+    method @RequiresApi(26) public final B setBackoffCriteria(androidx.work.BackoffPolicy backoffPolicy, java.time.Duration duration);
+    method public final B setConstraints(androidx.work.Constraints constraints);
+    method public B setExpedited(androidx.work.OutOfQuotaPolicy policy);
+    method public final B setId(java.util.UUID id);
+    method public B setInitialDelay(long duration, java.util.concurrent.TimeUnit timeUnit);
+    method @RequiresApi(26) public B setInitialDelay(java.time.Duration duration);
+    method public final B setInputData(androidx.work.Data inputData);
+  }
+
+  public static final class WorkRequest.Companion {
+  }
+
+  public abstract class Worker extends androidx.work.ListenableWorker {
+    ctor public Worker(android.content.Context, androidx.work.WorkerParameters);
+    method @WorkerThread public abstract androidx.work.ListenableWorker.Result doWork();
+    method @WorkerThread public androidx.work.ForegroundInfo getForegroundInfo();
+    method public final com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result!> startWork();
+  }
+
+  public abstract class WorkerFactory {
+    ctor public WorkerFactory();
+    method public abstract androidx.work.ListenableWorker? createWorker(android.content.Context, String, androidx.work.WorkerParameters);
+  }
+
+  public final class WorkerParameters {
+    method @IntRange(from=0) public int getGeneration();
+    method public java.util.UUID getId();
+    method public androidx.work.Data getInputData();
+    method @RequiresApi(28) public android.net.Network? getNetwork();
+    method @IntRange(from=0) public int getRunAttemptCount();
+    method public java.util.Set<java.lang.String!> getTags();
+    method @RequiresApi(24) public java.util.List<java.lang.String!> getTriggeredContentAuthorities();
+    method @RequiresApi(24) public java.util.List<android.net.Uri!> getTriggeredContentUris();
+  }
+
+}
+
+package androidx.work.multiprocess {
+
+  public abstract class RemoteWorkContinuation {
+    method public static androidx.work.multiprocess.RemoteWorkContinuation combine(java.util.List<androidx.work.multiprocess.RemoteWorkContinuation!>);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enqueue();
+    method public final androidx.work.multiprocess.RemoteWorkContinuation then(androidx.work.OneTimeWorkRequest);
+    method public abstract androidx.work.multiprocess.RemoteWorkContinuation then(java.util.List<androidx.work.OneTimeWorkRequest!>);
+  }
+
+  public abstract class RemoteWorkManager {
+    method public final androidx.work.multiprocess.RemoteWorkContinuation beginUniqueWork(String, androidx.work.ExistingWorkPolicy, androidx.work.OneTimeWorkRequest);
+    method public abstract androidx.work.multiprocess.RemoteWorkContinuation beginUniqueWork(String, androidx.work.ExistingWorkPolicy, java.util.List<androidx.work.OneTimeWorkRequest!>);
+    method public final androidx.work.multiprocess.RemoteWorkContinuation beginWith(androidx.work.OneTimeWorkRequest);
+    method public abstract androidx.work.multiprocess.RemoteWorkContinuation beginWith(java.util.List<androidx.work.OneTimeWorkRequest!>);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> cancelAllWork();
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> cancelAllWorkByTag(String);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> cancelUniqueWork(String);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> cancelWorkById(java.util.UUID);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enqueue(androidx.work.WorkRequest);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enqueue(java.util.List<androidx.work.WorkRequest!>);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enqueueUniquePeriodicWork(String, androidx.work.ExistingPeriodicWorkPolicy, androidx.work.PeriodicWorkRequest);
+    method public final com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enqueueUniqueWork(String, androidx.work.ExistingWorkPolicy, androidx.work.OneTimeWorkRequest);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enqueueUniqueWork(String, androidx.work.ExistingWorkPolicy, java.util.List<androidx.work.OneTimeWorkRequest!>);
+    method public static androidx.work.multiprocess.RemoteWorkManager getInstance(android.content.Context);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.util.List<androidx.work.WorkInfo!>!> getWorkInfos(androidx.work.WorkQuery);
+  }
+
+}
+
diff --git a/work/work-runtime/api/res-2.8.0-beta01.txt b/work/work-runtime/api/res-2.8.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/work/work-runtime/api/res-2.8.0-beta01.txt
diff --git a/work/work-runtime/api/restricted_2.8.0-beta01.txt b/work/work-runtime/api/restricted_2.8.0-beta01.txt
new file mode 100644
index 0000000..4519d02
--- /dev/null
+++ b/work/work-runtime/api/restricted_2.8.0-beta01.txt
@@ -0,0 +1,499 @@
+// Signature format: 4.0
+package androidx.work {
+
+  public final class ArrayCreatingInputMerger extends androidx.work.InputMerger {
+    ctor public ArrayCreatingInputMerger();
+    method public androidx.work.Data merge(java.util.List<androidx.work.Data> inputs);
+  }
+
+  public enum BackoffPolicy {
+    method public static androidx.work.BackoffPolicy valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.work.BackoffPolicy[] values();
+    enum_constant public static final androidx.work.BackoffPolicy EXPONENTIAL;
+    enum_constant public static final androidx.work.BackoffPolicy LINEAR;
+  }
+
+  public final class Configuration {
+    method public String? getDefaultProcessName();
+    method public java.util.concurrent.Executor getExecutor();
+    method public androidx.work.InitializationExceptionHandler? getInitializationExceptionHandler();
+    method public androidx.work.InputMergerFactory getInputMergerFactory();
+    method public int getMaxJobSchedulerId();
+    method public int getMinJobSchedulerId();
+    method public androidx.work.RunnableScheduler getRunnableScheduler();
+    method public androidx.work.SchedulingExceptionHandler? getSchedulingExceptionHandler();
+    method public java.util.concurrent.Executor getTaskExecutor();
+    method public androidx.work.WorkerFactory getWorkerFactory();
+    field public static final int MIN_SCHEDULER_LIMIT = 20; // 0x14
+  }
+
+  public static final class Configuration.Builder {
+    ctor public Configuration.Builder();
+    method public androidx.work.Configuration build();
+    method public androidx.work.Configuration.Builder setDefaultProcessName(String);
+    method public androidx.work.Configuration.Builder setExecutor(java.util.concurrent.Executor);
+    method public androidx.work.Configuration.Builder setInitializationExceptionHandler(androidx.work.InitializationExceptionHandler);
+    method public androidx.work.Configuration.Builder setInputMergerFactory(androidx.work.InputMergerFactory);
+    method public androidx.work.Configuration.Builder setJobSchedulerJobIdRange(int, int);
+    method public androidx.work.Configuration.Builder setMaxSchedulerLimit(int);
+    method public androidx.work.Configuration.Builder setMinimumLoggingLevel(int);
+    method public androidx.work.Configuration.Builder setRunnableScheduler(androidx.work.RunnableScheduler);
+    method public androidx.work.Configuration.Builder setSchedulingExceptionHandler(androidx.work.SchedulingExceptionHandler);
+    method public androidx.work.Configuration.Builder setTaskExecutor(java.util.concurrent.Executor);
+    method public androidx.work.Configuration.Builder setWorkerFactory(androidx.work.WorkerFactory);
+  }
+
+  public static interface Configuration.Provider {
+    method public androidx.work.Configuration getWorkManagerConfiguration();
+  }
+
+  public final class Constraints {
+    ctor public Constraints(optional @androidx.room.ColumnInfo(name="required_network_type") androidx.work.NetworkType requiredNetworkType, optional @androidx.room.ColumnInfo(name="requires_charging") boolean requiresCharging, optional @androidx.room.ColumnInfo(name="requires_device_idle") boolean requiresDeviceIdle, optional @androidx.room.ColumnInfo(name="requires_battery_not_low") boolean requiresBatteryNotLow, optional @androidx.room.ColumnInfo(name="requires_storage_not_low") boolean requiresStorageNotLow, optional @androidx.room.ColumnInfo(name="trigger_content_update_delay") long contentTriggerUpdateDelayMillis, optional @androidx.room.ColumnInfo(name="trigger_max_content_delay") long contentTriggerMaxDelayMillis, optional @androidx.room.ColumnInfo(name="content_uri_triggers") java.util.Set<androidx.work.Constraints.ContentUriTrigger> contentUriTriggers);
+    ctor public Constraints(androidx.work.Constraints other);
+    method public long getContentTriggerMaxDelayMillis();
+    method public long getContentTriggerUpdateDelayMillis();
+    method public java.util.Set<androidx.work.Constraints.ContentUriTrigger> getContentUriTriggers();
+    method public androidx.work.NetworkType getRequiredNetworkType();
+    method public boolean requiresBatteryNotLow();
+    method public boolean requiresCharging();
+    method @RequiresApi(23) public boolean requiresDeviceIdle();
+    method public boolean requiresStorageNotLow();
+    property public final long contentTriggerMaxDelayMillis;
+    property public final long contentTriggerUpdateDelayMillis;
+    property public final java.util.Set<androidx.work.Constraints.ContentUriTrigger> contentUriTriggers;
+    property public final androidx.work.NetworkType requiredNetworkType;
+    field public static final androidx.work.Constraints.Companion Companion;
+    field public static final androidx.work.Constraints NONE;
+  }
+
+  public static final class Constraints.Builder {
+    ctor public Constraints.Builder();
+    method @RequiresApi(24) public androidx.work.Constraints.Builder addContentUriTrigger(android.net.Uri uri, boolean triggerForDescendants);
+    method public androidx.work.Constraints build();
+    method public androidx.work.Constraints.Builder setRequiredNetworkType(androidx.work.NetworkType networkType);
+    method public androidx.work.Constraints.Builder setRequiresBatteryNotLow(boolean requiresBatteryNotLow);
+    method public androidx.work.Constraints.Builder setRequiresCharging(boolean requiresCharging);
+    method @RequiresApi(23) public androidx.work.Constraints.Builder setRequiresDeviceIdle(boolean requiresDeviceIdle);
+    method public androidx.work.Constraints.Builder setRequiresStorageNotLow(boolean requiresStorageNotLow);
+    method @RequiresApi(24) public androidx.work.Constraints.Builder setTriggerContentMaxDelay(long duration, java.util.concurrent.TimeUnit timeUnit);
+    method @RequiresApi(26) public androidx.work.Constraints.Builder setTriggerContentMaxDelay(java.time.Duration duration);
+    method @RequiresApi(24) public androidx.work.Constraints.Builder setTriggerContentUpdateDelay(long duration, java.util.concurrent.TimeUnit timeUnit);
+    method @RequiresApi(26) public androidx.work.Constraints.Builder setTriggerContentUpdateDelay(java.time.Duration duration);
+  }
+
+  public static final class Constraints.Companion {
+  }
+
+  public static final class Constraints.ContentUriTrigger {
+    ctor public Constraints.ContentUriTrigger(android.net.Uri uri, boolean isTriggeredForDescendants);
+    method public android.net.Uri getUri();
+    method public boolean isTriggeredForDescendants();
+    property public final boolean isTriggeredForDescendants;
+    property public final android.net.Uri uri;
+  }
+
+  public final class Data {
+    ctor public Data(androidx.work.Data);
+    method @androidx.room.TypeConverter public static androidx.work.Data fromByteArray(byte[]);
+    method public boolean getBoolean(String, boolean);
+    method public boolean[]? getBooleanArray(String);
+    method public byte getByte(String, byte);
+    method public byte[]? getByteArray(String);
+    method public double getDouble(String, double);
+    method public double[]? getDoubleArray(String);
+    method public float getFloat(String, float);
+    method public float[]? getFloatArray(String);
+    method public int getInt(String, int);
+    method public int[]? getIntArray(String);
+    method public java.util.Map<java.lang.String!,java.lang.Object!> getKeyValueMap();
+    method public long getLong(String, long);
+    method public long[]? getLongArray(String);
+    method public String? getString(String);
+    method public String![]? getStringArray(String);
+    method public <T> boolean hasKeyWithValueOfType(String, Class<T!>);
+    method public byte[] toByteArray();
+    field public static final androidx.work.Data EMPTY;
+    field public static final int MAX_DATA_BYTES = 10240; // 0x2800
+  }
+
+  public static final class Data.Builder {
+    ctor public Data.Builder();
+    method public androidx.work.Data build();
+    method public androidx.work.Data.Builder putAll(androidx.work.Data);
+    method public androidx.work.Data.Builder putAll(java.util.Map<java.lang.String!,java.lang.Object!>);
+    method public androidx.work.Data.Builder putBoolean(String, boolean);
+    method public androidx.work.Data.Builder putBooleanArray(String, boolean[]);
+    method public androidx.work.Data.Builder putByte(String, byte);
+    method public androidx.work.Data.Builder putByteArray(String, byte[]);
+    method public androidx.work.Data.Builder putDouble(String, double);
+    method public androidx.work.Data.Builder putDoubleArray(String, double[]);
+    method public androidx.work.Data.Builder putFloat(String, float);
+    method public androidx.work.Data.Builder putFloatArray(String, float[]);
+    method public androidx.work.Data.Builder putInt(String, int);
+    method public androidx.work.Data.Builder putIntArray(String, int[]);
+    method public androidx.work.Data.Builder putLong(String, long);
+    method public androidx.work.Data.Builder putLongArray(String, long[]);
+    method public androidx.work.Data.Builder putString(String, String?);
+    method public androidx.work.Data.Builder putStringArray(String, String![]);
+  }
+
+  public class DelegatingWorkerFactory extends androidx.work.WorkerFactory {
+    ctor public DelegatingWorkerFactory();
+    method public final void addFactory(androidx.work.WorkerFactory);
+    method public final androidx.work.ListenableWorker? createWorker(android.content.Context, String, androidx.work.WorkerParameters);
+  }
+
+  public enum ExistingPeriodicWorkPolicy {
+    method public static androidx.work.ExistingPeriodicWorkPolicy valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.work.ExistingPeriodicWorkPolicy[] values();
+    enum_constant public static final androidx.work.ExistingPeriodicWorkPolicy CANCEL_AND_REENQUEUE;
+    enum_constant public static final androidx.work.ExistingPeriodicWorkPolicy KEEP;
+    enum_constant @Deprecated public static final androidx.work.ExistingPeriodicWorkPolicy REPLACE;
+    enum_constant public static final androidx.work.ExistingPeriodicWorkPolicy UPDATE;
+  }
+
+  public enum ExistingWorkPolicy {
+    method public static androidx.work.ExistingWorkPolicy valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.work.ExistingWorkPolicy[] values();
+    enum_constant public static final androidx.work.ExistingWorkPolicy APPEND;
+    enum_constant public static final androidx.work.ExistingWorkPolicy APPEND_OR_REPLACE;
+    enum_constant public static final androidx.work.ExistingWorkPolicy KEEP;
+    enum_constant public static final androidx.work.ExistingWorkPolicy REPLACE;
+  }
+
+  public final class ForegroundInfo {
+    ctor public ForegroundInfo(int, android.app.Notification);
+    ctor public ForegroundInfo(int, android.app.Notification, int);
+    method public int getForegroundServiceType();
+    method public android.app.Notification getNotification();
+    method public int getNotificationId();
+  }
+
+  public interface ForegroundUpdater {
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setForegroundAsync(android.content.Context, java.util.UUID, androidx.work.ForegroundInfo);
+  }
+
+  public interface InitializationExceptionHandler {
+    method public void handleException(Throwable);
+  }
+
+  public abstract class InputMerger {
+    ctor public InputMerger();
+    method public abstract androidx.work.Data merge(java.util.List<androidx.work.Data!>);
+  }
+
+  public abstract class InputMergerFactory {
+    ctor public InputMergerFactory();
+    method public abstract androidx.work.InputMerger? createInputMerger(String);
+  }
+
+  public abstract class ListenableWorker {
+    ctor public ListenableWorker(android.content.Context, androidx.work.WorkerParameters);
+    method public final android.content.Context getApplicationContext();
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.work.ForegroundInfo!> getForegroundInfoAsync();
+    method public final java.util.UUID getId();
+    method public final androidx.work.Data getInputData();
+    method @RequiresApi(28) public final android.net.Network? getNetwork();
+    method @IntRange(from=0) public final int getRunAttemptCount();
+    method public final java.util.Set<java.lang.String!> getTags();
+    method @RequiresApi(24) public final java.util.List<java.lang.String!> getTriggeredContentAuthorities();
+    method @RequiresApi(24) public final java.util.List<android.net.Uri!> getTriggeredContentUris();
+    method public final boolean isStopped();
+    method public void onStopped();
+    method public final com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setForegroundAsync(androidx.work.ForegroundInfo);
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> setProgressAsync(androidx.work.Data);
+    method @MainThread public abstract com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result!> startWork();
+  }
+
+  public abstract static class ListenableWorker.Result {
+    method public static androidx.work.ListenableWorker.Result failure();
+    method public static androidx.work.ListenableWorker.Result failure(androidx.work.Data);
+    method public abstract androidx.work.Data getOutputData();
+    method public static androidx.work.ListenableWorker.Result retry();
+    method public static androidx.work.ListenableWorker.Result success();
+    method public static androidx.work.ListenableWorker.Result success(androidx.work.Data);
+  }
+
+  public enum NetworkType {
+    method public static androidx.work.NetworkType valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.work.NetworkType[] values();
+    enum_constant public static final androidx.work.NetworkType CONNECTED;
+    enum_constant public static final androidx.work.NetworkType METERED;
+    enum_constant public static final androidx.work.NetworkType NOT_REQUIRED;
+    enum_constant public static final androidx.work.NetworkType NOT_ROAMING;
+    enum_constant @RequiresApi(30) public static final androidx.work.NetworkType TEMPORARILY_UNMETERED;
+    enum_constant public static final androidx.work.NetworkType UNMETERED;
+  }
+
+  public final class OneTimeWorkRequest extends androidx.work.WorkRequest {
+    method public static androidx.work.OneTimeWorkRequest from(Class<? extends androidx.work.ListenableWorker> workerClass);
+    method public static java.util.List<androidx.work.OneTimeWorkRequest> from(java.util.List<? extends java.lang.Class<? extends androidx.work.ListenableWorker>> workerClasses);
+    field public static final androidx.work.OneTimeWorkRequest.Companion Companion;
+  }
+
+  public static final class OneTimeWorkRequest.Builder extends androidx.work.WorkRequest.Builder<androidx.work.OneTimeWorkRequest.Builder,androidx.work.OneTimeWorkRequest> {
+    ctor public OneTimeWorkRequest.Builder(Class<? extends androidx.work.ListenableWorker> workerClass);
+    method public androidx.work.OneTimeWorkRequest.Builder setInputMerger(Class<? extends androidx.work.InputMerger> inputMerger);
+  }
+
+  public static final class OneTimeWorkRequest.Companion {
+    method public androidx.work.OneTimeWorkRequest from(Class<? extends androidx.work.ListenableWorker> workerClass);
+    method public java.util.List<androidx.work.OneTimeWorkRequest> from(java.util.List<? extends java.lang.Class<? extends androidx.work.ListenableWorker>> workerClasses);
+  }
+
+  public final class OneTimeWorkRequestKt {
+    method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.OneTimeWorkRequest.Builder! OneTimeWorkRequestBuilder();
+    method public static inline androidx.work.OneTimeWorkRequest.Builder setInputMerger(androidx.work.OneTimeWorkRequest.Builder, kotlin.reflect.KClass<? extends androidx.work.InputMerger> inputMerger);
+  }
+
+  public interface Operation {
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.work.Operation.State.SUCCESS!> getResult();
+    method public androidx.lifecycle.LiveData<androidx.work.Operation.State!> getState();
+  }
+
+  public abstract static class Operation.State {
+  }
+
+  public static final class Operation.State.FAILURE extends androidx.work.Operation.State {
+    ctor public Operation.State.FAILURE(Throwable);
+    method public Throwable getThrowable();
+  }
+
+  public static final class Operation.State.IN_PROGRESS extends androidx.work.Operation.State {
+  }
+
+  public static final class Operation.State.SUCCESS extends androidx.work.Operation.State {
+  }
+
+  public enum OutOfQuotaPolicy {
+    method public static androidx.work.OutOfQuotaPolicy valueOf(String name) throws java.lang.IllegalArgumentException;
+    method public static androidx.work.OutOfQuotaPolicy[] values();
+    enum_constant public static final androidx.work.OutOfQuotaPolicy DROP_WORK_REQUEST;
+    enum_constant public static final androidx.work.OutOfQuotaPolicy RUN_AS_NON_EXPEDITED_WORK_REQUEST;
+  }
+
+  public final class OverwritingInputMerger extends androidx.work.InputMerger {
+    ctor public OverwritingInputMerger();
+    method public androidx.work.Data merge(java.util.List<androidx.work.Data!>);
+  }
+
+  public final class PeriodicWorkRequest extends androidx.work.WorkRequest {
+    field public static final androidx.work.PeriodicWorkRequest.Companion Companion;
+    field public static final long MIN_PERIODIC_FLEX_MILLIS = 300000L; // 0x493e0L
+    field public static final long MIN_PERIODIC_INTERVAL_MILLIS = 900000L; // 0xdbba0L
+  }
+
+  public static final class PeriodicWorkRequest.Builder extends androidx.work.WorkRequest.Builder<androidx.work.PeriodicWorkRequest.Builder,androidx.work.PeriodicWorkRequest> {
+    ctor public PeriodicWorkRequest.Builder(Class<? extends androidx.work.ListenableWorker> workerClass, long repeatInterval, java.util.concurrent.TimeUnit repeatIntervalTimeUnit);
+    ctor @RequiresApi(26) public PeriodicWorkRequest.Builder(Class<? extends androidx.work.ListenableWorker> workerClass, java.time.Duration repeatInterval);
+    ctor public PeriodicWorkRequest.Builder(Class<? extends androidx.work.ListenableWorker> workerClass, long repeatInterval, java.util.concurrent.TimeUnit repeatIntervalTimeUnit, long flexInterval, java.util.concurrent.TimeUnit flexIntervalTimeUnit);
+    ctor @RequiresApi(26) public PeriodicWorkRequest.Builder(Class<? extends androidx.work.ListenableWorker> workerClass, java.time.Duration repeatInterval, java.time.Duration flexInterval);
+  }
+
+  public static final class PeriodicWorkRequest.Companion {
+  }
+
+  public final class PeriodicWorkRequestKt {
+    method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder! PeriodicWorkRequestBuilder(long repeatInterval, java.util.concurrent.TimeUnit repeatIntervalTimeUnit);
+    method @RequiresApi(26) public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder! PeriodicWorkRequestBuilder(java.time.Duration repeatInterval);
+    method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder! PeriodicWorkRequestBuilder(long repeatInterval, java.util.concurrent.TimeUnit repeatIntervalTimeUnit, long flexTimeInterval, java.util.concurrent.TimeUnit flexTimeIntervalUnit);
+    method @RequiresApi(26) public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.PeriodicWorkRequest.Builder! PeriodicWorkRequestBuilder(java.time.Duration repeatInterval, java.time.Duration flexTimeInterval);
+  }
+
+  public interface ProgressUpdater {
+    method public com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> updateProgress(android.content.Context, java.util.UUID, androidx.work.Data);
+  }
+
+  public interface RunnableScheduler {
+    method public void cancel(Runnable);
+    method public void scheduleWithDelay(@IntRange(from=0) long, Runnable);
+  }
+
+  public interface SchedulingExceptionHandler {
+    method public void handleException(Throwable);
+  }
+
+  public abstract class WorkContinuation {
+    ctor public WorkContinuation();
+    method public static androidx.work.WorkContinuation combine(java.util.List<androidx.work.WorkContinuation!>);
+    method public abstract androidx.work.Operation enqueue();
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.util.List<androidx.work.WorkInfo!>!> getWorkInfos();
+    method public abstract androidx.lifecycle.LiveData<java.util.List<androidx.work.WorkInfo!>!> getWorkInfosLiveData();
+    method public final androidx.work.WorkContinuation then(androidx.work.OneTimeWorkRequest);
+    method public abstract androidx.work.WorkContinuation then(java.util.List<androidx.work.OneTimeWorkRequest!>);
+  }
+
+  public final class WorkInfo {
+    method public int getGeneration();
+    method public java.util.UUID getId();
+    method public androidx.work.Data getOutputData();
+    method public androidx.work.Data getProgress();
+    method @IntRange(from=0) public int getRunAttemptCount();
+    method public androidx.work.WorkInfo.State getState();
+    method public java.util.Set<java.lang.String!> getTags();
+  }
+
+  public enum WorkInfo.State {
+    method public boolean isFinished();
+    enum_constant public static final androidx.work.WorkInfo.State BLOCKED;
+    enum_constant public static final androidx.work.WorkInfo.State CANCELLED;
+    enum_constant public static final androidx.work.WorkInfo.State ENQUEUED;
+    enum_constant public static final androidx.work.WorkInfo.State FAILED;
+    enum_constant public static final androidx.work.WorkInfo.State RUNNING;
+    enum_constant public static final androidx.work.WorkInfo.State SUCCEEDED;
+  }
+
+  public abstract class WorkManager {
+    method public final androidx.work.WorkContinuation beginUniqueWork(String, androidx.work.ExistingWorkPolicy, androidx.work.OneTimeWorkRequest);
+    method public abstract androidx.work.WorkContinuation beginUniqueWork(String, androidx.work.ExistingWorkPolicy, java.util.List<androidx.work.OneTimeWorkRequest!>);
+    method public final androidx.work.WorkContinuation beginWith(androidx.work.OneTimeWorkRequest);
+    method public abstract androidx.work.WorkContinuation beginWith(java.util.List<androidx.work.OneTimeWorkRequest!>);
+    method public abstract androidx.work.Operation cancelAllWork();
+    method public abstract androidx.work.Operation cancelAllWorkByTag(String);
+    method public abstract androidx.work.Operation cancelUniqueWork(String);
+    method public abstract androidx.work.Operation cancelWorkById(java.util.UUID);
+    method public abstract android.app.PendingIntent createCancelPendingIntent(java.util.UUID);
+    method public final androidx.work.Operation enqueue(androidx.work.WorkRequest);
+    method public abstract androidx.work.Operation enqueue(java.util.List<? extends androidx.work.WorkRequest>);
+    method public abstract androidx.work.Operation enqueueUniquePeriodicWork(String, androidx.work.ExistingPeriodicWorkPolicy, androidx.work.PeriodicWorkRequest);
+    method public androidx.work.Operation enqueueUniqueWork(String, androidx.work.ExistingWorkPolicy, androidx.work.OneTimeWorkRequest);
+    method public abstract androidx.work.Operation enqueueUniqueWork(String, androidx.work.ExistingWorkPolicy, java.util.List<androidx.work.OneTimeWorkRequest!>);
+    method public abstract androidx.work.Configuration getConfiguration();
+    method @Deprecated public static androidx.work.WorkManager getInstance();
+    method public static androidx.work.WorkManager getInstance(android.content.Context);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Long!> getLastCancelAllTimeMillis();
+    method public abstract androidx.lifecycle.LiveData<java.lang.Long!> getLastCancelAllTimeMillisLiveData();
+    method public abstract com.google.common.util.concurrent.ListenableFuture<androidx.work.WorkInfo!> getWorkInfoById(java.util.UUID);
+    method public abstract androidx.lifecycle.LiveData<androidx.work.WorkInfo!> getWorkInfoByIdLiveData(java.util.UUID);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.util.List<androidx.work.WorkInfo!>!> getWorkInfos(androidx.work.WorkQuery);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.util.List<androidx.work.WorkInfo!>!> getWorkInfosByTag(String);
+    method public abstract androidx.lifecycle.LiveData<java.util.List<androidx.work.WorkInfo!>!> getWorkInfosByTagLiveData(String);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.util.List<androidx.work.WorkInfo!>!> getWorkInfosForUniqueWork(String);
+    method public abstract androidx.lifecycle.LiveData<java.util.List<androidx.work.WorkInfo!>!> getWorkInfosForUniqueWorkLiveData(String);
+    method public abstract androidx.lifecycle.LiveData<java.util.List<androidx.work.WorkInfo!>!> getWorkInfosLiveData(androidx.work.WorkQuery);
+    method public static void initialize(android.content.Context, androidx.work.Configuration);
+    method public static boolean isInitialized();
+    method public abstract androidx.work.Operation pruneWork();
+    method public abstract com.google.common.util.concurrent.ListenableFuture<androidx.work.WorkManager.UpdateResult!> updateWork(androidx.work.WorkRequest);
+  }
+
+  public enum WorkManager.UpdateResult {
+    enum_constant public static final androidx.work.WorkManager.UpdateResult APPLIED_FOR_NEXT_RUN;
+    enum_constant public static final androidx.work.WorkManager.UpdateResult APPLIED_IMMEDIATELY;
+    enum_constant public static final androidx.work.WorkManager.UpdateResult NOT_APPLIED;
+  }
+
+  public final class WorkManagerInitializer implements androidx.startup.Initializer<androidx.work.WorkManager> {
+    ctor public WorkManagerInitializer();
+    method public androidx.work.WorkManager create(android.content.Context);
+    method public java.util.List<java.lang.Class<? extends androidx.startup.Initializer<?>>!> dependencies();
+  }
+
+  public final class WorkQuery {
+    method public static androidx.work.WorkQuery fromIds(java.util.List<java.util.UUID!>);
+    method public static androidx.work.WorkQuery fromIds(java.util.UUID!...);
+    method public static androidx.work.WorkQuery fromStates(java.util.List<androidx.work.WorkInfo.State!>);
+    method public static androidx.work.WorkQuery fromStates(androidx.work.WorkInfo.State!...);
+    method public static androidx.work.WorkQuery fromTags(java.util.List<java.lang.String!>);
+    method public static androidx.work.WorkQuery fromTags(java.lang.String!...);
+    method public static androidx.work.WorkQuery fromUniqueWorkNames(java.lang.String!...);
+    method public static androidx.work.WorkQuery fromUniqueWorkNames(java.util.List<java.lang.String!>);
+    method public java.util.List<java.util.UUID!> getIds();
+    method public java.util.List<androidx.work.WorkInfo.State!> getStates();
+    method public java.util.List<java.lang.String!> getTags();
+    method public java.util.List<java.lang.String!> getUniqueWorkNames();
+  }
+
+  public static final class WorkQuery.Builder {
+    method public androidx.work.WorkQuery.Builder addIds(java.util.List<java.util.UUID!>);
+    method public androidx.work.WorkQuery.Builder addStates(java.util.List<androidx.work.WorkInfo.State!>);
+    method public androidx.work.WorkQuery.Builder addTags(java.util.List<java.lang.String!>);
+    method public androidx.work.WorkQuery.Builder addUniqueWorkNames(java.util.List<java.lang.String!>);
+    method public androidx.work.WorkQuery build();
+    method public static androidx.work.WorkQuery.Builder fromIds(java.util.List<java.util.UUID!>);
+    method public static androidx.work.WorkQuery.Builder fromStates(java.util.List<androidx.work.WorkInfo.State!>);
+    method public static androidx.work.WorkQuery.Builder fromTags(java.util.List<java.lang.String!>);
+    method public static androidx.work.WorkQuery.Builder fromUniqueWorkNames(java.util.List<java.lang.String!>);
+  }
+
+  public abstract class WorkRequest {
+    method public java.util.UUID getId();
+    property public java.util.UUID id;
+    field public static final androidx.work.WorkRequest.Companion Companion;
+    field public static final long DEFAULT_BACKOFF_DELAY_MILLIS = 30000L; // 0x7530L
+    field public static final long MAX_BACKOFF_MILLIS = 18000000L; // 0x112a880L
+    field public static final long MIN_BACKOFF_MILLIS = 10000L; // 0x2710L
+  }
+
+  public abstract static class WorkRequest.Builder<B extends androidx.work.WorkRequest.Builder<B, ?>, W extends androidx.work.WorkRequest> {
+    method public final B addTag(String tag);
+    method public final W build();
+    method public final B keepResultsForAtLeast(long duration, java.util.concurrent.TimeUnit timeUnit);
+    method @RequiresApi(26) public final B keepResultsForAtLeast(java.time.Duration duration);
+    method public final B setBackoffCriteria(androidx.work.BackoffPolicy backoffPolicy, long backoffDelay, java.util.concurrent.TimeUnit timeUnit);
+    method @RequiresApi(26) public final B setBackoffCriteria(androidx.work.BackoffPolicy backoffPolicy, java.time.Duration duration);
+    method public final B setConstraints(androidx.work.Constraints constraints);
+    method public B setExpedited(androidx.work.OutOfQuotaPolicy policy);
+    method public final B setId(java.util.UUID id);
+    method public B setInitialDelay(long duration, java.util.concurrent.TimeUnit timeUnit);
+    method @RequiresApi(26) public B setInitialDelay(java.time.Duration duration);
+    method public final B setInputData(androidx.work.Data inputData);
+  }
+
+  public static final class WorkRequest.Companion {
+  }
+
+  public abstract class Worker extends androidx.work.ListenableWorker {
+    ctor public Worker(android.content.Context, androidx.work.WorkerParameters);
+    method @WorkerThread public abstract androidx.work.ListenableWorker.Result doWork();
+    method @WorkerThread public androidx.work.ForegroundInfo getForegroundInfo();
+    method public final com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result!> startWork();
+  }
+
+  public abstract class WorkerFactory {
+    ctor public WorkerFactory();
+    method public abstract androidx.work.ListenableWorker? createWorker(android.content.Context, String, androidx.work.WorkerParameters);
+  }
+
+  public final class WorkerParameters {
+    method @IntRange(from=0) public int getGeneration();
+    method public java.util.UUID getId();
+    method public androidx.work.Data getInputData();
+    method @RequiresApi(28) public android.net.Network? getNetwork();
+    method @IntRange(from=0) public int getRunAttemptCount();
+    method public java.util.Set<java.lang.String!> getTags();
+    method @RequiresApi(24) public java.util.List<java.lang.String!> getTriggeredContentAuthorities();
+    method @RequiresApi(24) public java.util.List<android.net.Uri!> getTriggeredContentUris();
+  }
+
+}
+
+package androidx.work.multiprocess {
+
+  public abstract class RemoteWorkContinuation {
+    method public static androidx.work.multiprocess.RemoteWorkContinuation combine(java.util.List<androidx.work.multiprocess.RemoteWorkContinuation!>);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enqueue();
+    method public final androidx.work.multiprocess.RemoteWorkContinuation then(androidx.work.OneTimeWorkRequest);
+    method public abstract androidx.work.multiprocess.RemoteWorkContinuation then(java.util.List<androidx.work.OneTimeWorkRequest!>);
+  }
+
+  public abstract class RemoteWorkManager {
+    method public final androidx.work.multiprocess.RemoteWorkContinuation beginUniqueWork(String, androidx.work.ExistingWorkPolicy, androidx.work.OneTimeWorkRequest);
+    method public abstract androidx.work.multiprocess.RemoteWorkContinuation beginUniqueWork(String, androidx.work.ExistingWorkPolicy, java.util.List<androidx.work.OneTimeWorkRequest!>);
+    method public final androidx.work.multiprocess.RemoteWorkContinuation beginWith(androidx.work.OneTimeWorkRequest);
+    method public abstract androidx.work.multiprocess.RemoteWorkContinuation beginWith(java.util.List<androidx.work.OneTimeWorkRequest!>);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> cancelAllWork();
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> cancelAllWorkByTag(String);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> cancelUniqueWork(String);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> cancelWorkById(java.util.UUID);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enqueue(androidx.work.WorkRequest);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enqueue(java.util.List<androidx.work.WorkRequest!>);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enqueueUniquePeriodicWork(String, androidx.work.ExistingPeriodicWorkPolicy, androidx.work.PeriodicWorkRequest);
+    method public final com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enqueueUniqueWork(String, androidx.work.ExistingWorkPolicy, androidx.work.OneTimeWorkRequest);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.lang.Void!> enqueueUniqueWork(String, androidx.work.ExistingWorkPolicy, java.util.List<androidx.work.OneTimeWorkRequest!>);
+    method public static androidx.work.multiprocess.RemoteWorkManager getInstance(android.content.Context);
+    method public abstract com.google.common.util.concurrent.ListenableFuture<java.util.List<androidx.work.WorkInfo!>!> getWorkInfos(androidx.work.WorkQuery);
+  }
+
+}
+
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/StartStopToken.kt b/work/work-runtime/src/main/java/androidx/work/impl/StartStopToken.kt
index 034a5a45..f9c4245 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/StartStopToken.kt
+++ b/work/work-runtime/src/main/java/androidx/work/impl/StartStopToken.kt
@@ -37,8 +37,7 @@
 
     fun tokenFor(id: WorkGenerationalId): StartStopToken {
         return synchronized(lock) {
-            val startStopToken = StartStopToken(id)
-            runs.getOrPut(id) { startStopToken }
+            runs.getOrPut(id) { StartStopToken(id) }
         }
     }
 
@@ -56,6 +55,10 @@
         }
     }
 
+    fun contains(id: WorkGenerationalId): Boolean {
+        return synchronized(lock) { runs.contains(id) }
+    }
+
     fun tokenFor(spec: WorkSpec) = tokenFor(spec.generationalId())
     fun remove(spec: WorkSpec) = remove(spec.generationalId())
 }
\ No newline at end of file
diff --git a/work/work-runtime/src/main/java/androidx/work/impl/background/greedy/GreedyScheduler.java b/work/work-runtime/src/main/java/androidx/work/impl/background/greedy/GreedyScheduler.java
index e1c9c42..656f129 100644
--- a/work/work-runtime/src/main/java/androidx/work/impl/background/greedy/GreedyScheduler.java
+++ b/work/work-runtime/src/main/java/androidx/work/impl/background/greedy/GreedyScheduler.java
@@ -124,6 +124,11 @@
         Set<String> constrainedWorkSpecIds = new HashSet<>();
 
         for (WorkSpec workSpec : workSpecs) {
+            // it doesn't help against races, but reduces useless load in the system
+            WorkGenerationalId id = generationalId(workSpec);
+            if (mStartStopTokens.contains(id)) {
+                continue;
+            }
             long nextRunTime = workSpec.calculateNextRunTime();
             long now = System.currentTimeMillis();
             if (workSpec.state == WorkInfo.State.ENQUEUED) {
@@ -146,8 +151,11 @@
                         constrainedWorkSpecIds.add(workSpec.id);
                     }
                 } else {
-                    Logger.get().debug(TAG, "Starting work for " + workSpec.id);
-                    mWorkManagerImpl.startWork(mStartStopTokens.tokenFor(workSpec));
+                    // it doesn't help against races, but reduces useless load in the system
+                    if (!mStartStopTokens.contains(generationalId(workSpec))) {
+                        Logger.get().debug(TAG, "Starting work for " + workSpec.id);
+                        mWorkManagerImpl.startWork(mStartStopTokens.tokenFor(workSpec));
+                    }
                 }
             }
         }
@@ -195,8 +203,11 @@
     public void onAllConstraintsMet(@NonNull List<WorkSpec> workSpecs) {
         for (WorkSpec workSpec : workSpecs) {
             WorkGenerationalId id = generationalId(workSpec);
-            Logger.get().debug(TAG, "Constraints met: Scheduling work ID " + id);
-            mWorkManagerImpl.startWork(mStartStopTokens.tokenFor(id));
+            // it doesn't help against races, but reduces useless load in the system
+            if (!mStartStopTokens.contains(id)) {
+                Logger.get().debug(TAG, "Constraints met: Scheduling work ID " + id);
+                mWorkManagerImpl.startWork(mStartStopTokens.tokenFor(id));
+            }
         }
     }
 
diff --git a/work/work-rxjava2/api/2.8.0-beta01.txt b/work/work-rxjava2/api/2.8.0-beta01.txt
new file mode 100644
index 0000000..1cca40e
--- /dev/null
+++ b/work/work-rxjava2/api/2.8.0-beta01.txt
@@ -0,0 +1,16 @@
+// Signature format: 4.0
+package androidx.work {
+
+  public abstract class RxWorker extends androidx.work.ListenableWorker {
+    ctor public RxWorker(android.content.Context, androidx.work.WorkerParameters);
+    method @MainThread public abstract io.reactivex.Single<androidx.work.ListenableWorker.Result!> createWork();
+    method protected io.reactivex.Scheduler getBackgroundScheduler();
+    method public io.reactivex.Single<androidx.work.ForegroundInfo!> getForegroundInfo();
+    method public final io.reactivex.Completable setCompletableProgress(androidx.work.Data);
+    method public final io.reactivex.Completable setForeground(androidx.work.ForegroundInfo);
+    method @Deprecated public final io.reactivex.Single<java.lang.Void!> setProgress(androidx.work.Data);
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result!> startWork();
+  }
+
+}
+
diff --git a/work/work-rxjava2/api/public_plus_experimental_2.8.0-beta01.txt b/work/work-rxjava2/api/public_plus_experimental_2.8.0-beta01.txt
new file mode 100644
index 0000000..1cca40e
--- /dev/null
+++ b/work/work-rxjava2/api/public_plus_experimental_2.8.0-beta01.txt
@@ -0,0 +1,16 @@
+// Signature format: 4.0
+package androidx.work {
+
+  public abstract class RxWorker extends androidx.work.ListenableWorker {
+    ctor public RxWorker(android.content.Context, androidx.work.WorkerParameters);
+    method @MainThread public abstract io.reactivex.Single<androidx.work.ListenableWorker.Result!> createWork();
+    method protected io.reactivex.Scheduler getBackgroundScheduler();
+    method public io.reactivex.Single<androidx.work.ForegroundInfo!> getForegroundInfo();
+    method public final io.reactivex.Completable setCompletableProgress(androidx.work.Data);
+    method public final io.reactivex.Completable setForeground(androidx.work.ForegroundInfo);
+    method @Deprecated public final io.reactivex.Single<java.lang.Void!> setProgress(androidx.work.Data);
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result!> startWork();
+  }
+
+}
+
diff --git a/work/work-rxjava2/api/res-2.8.0-beta01.txt b/work/work-rxjava2/api/res-2.8.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/work/work-rxjava2/api/res-2.8.0-beta01.txt
diff --git a/work/work-rxjava2/api/restricted_2.8.0-beta01.txt b/work/work-rxjava2/api/restricted_2.8.0-beta01.txt
new file mode 100644
index 0000000..1cca40e
--- /dev/null
+++ b/work/work-rxjava2/api/restricted_2.8.0-beta01.txt
@@ -0,0 +1,16 @@
+// Signature format: 4.0
+package androidx.work {
+
+  public abstract class RxWorker extends androidx.work.ListenableWorker {
+    ctor public RxWorker(android.content.Context, androidx.work.WorkerParameters);
+    method @MainThread public abstract io.reactivex.Single<androidx.work.ListenableWorker.Result!> createWork();
+    method protected io.reactivex.Scheduler getBackgroundScheduler();
+    method public io.reactivex.Single<androidx.work.ForegroundInfo!> getForegroundInfo();
+    method public final io.reactivex.Completable setCompletableProgress(androidx.work.Data);
+    method public final io.reactivex.Completable setForeground(androidx.work.ForegroundInfo);
+    method @Deprecated public final io.reactivex.Single<java.lang.Void!> setProgress(androidx.work.Data);
+    method public com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result!> startWork();
+  }
+
+}
+
diff --git a/work/work-rxjava3/api/2.8.0-beta01.txt b/work/work-rxjava3/api/2.8.0-beta01.txt
new file mode 100644
index 0000000..0983052
--- /dev/null
+++ b/work/work-rxjava3/api/2.8.0-beta01.txt
@@ -0,0 +1,15 @@
+// Signature format: 4.0
+package androidx.work.rxjava3 {
+
+  public abstract class RxWorker extends androidx.work.ListenableWorker {
+    ctor public RxWorker(android.content.Context, androidx.work.WorkerParameters);
+    method @MainThread public abstract io.reactivex.rxjava3.core.Single<androidx.work.ListenableWorker.Result!> createWork();
+    method protected io.reactivex.rxjava3.core.Scheduler getBackgroundScheduler();
+    method public io.reactivex.rxjava3.core.Single<androidx.work.ForegroundInfo!> getForegroundInfo();
+    method public final io.reactivex.rxjava3.core.Completable setCompletableProgress(androidx.work.Data);
+    method public final io.reactivex.rxjava3.core.Completable setForeground(androidx.work.ForegroundInfo);
+    method public final com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result!> startWork();
+  }
+
+}
+
diff --git a/work/work-rxjava3/api/public_plus_experimental_2.8.0-beta01.txt b/work/work-rxjava3/api/public_plus_experimental_2.8.0-beta01.txt
new file mode 100644
index 0000000..0983052
--- /dev/null
+++ b/work/work-rxjava3/api/public_plus_experimental_2.8.0-beta01.txt
@@ -0,0 +1,15 @@
+// Signature format: 4.0
+package androidx.work.rxjava3 {
+
+  public abstract class RxWorker extends androidx.work.ListenableWorker {
+    ctor public RxWorker(android.content.Context, androidx.work.WorkerParameters);
+    method @MainThread public abstract io.reactivex.rxjava3.core.Single<androidx.work.ListenableWorker.Result!> createWork();
+    method protected io.reactivex.rxjava3.core.Scheduler getBackgroundScheduler();
+    method public io.reactivex.rxjava3.core.Single<androidx.work.ForegroundInfo!> getForegroundInfo();
+    method public final io.reactivex.rxjava3.core.Completable setCompletableProgress(androidx.work.Data);
+    method public final io.reactivex.rxjava3.core.Completable setForeground(androidx.work.ForegroundInfo);
+    method public final com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result!> startWork();
+  }
+
+}
+
diff --git a/work/work-rxjava3/api/res-2.8.0-beta01.txt b/work/work-rxjava3/api/res-2.8.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/work/work-rxjava3/api/res-2.8.0-beta01.txt
diff --git a/work/work-rxjava3/api/restricted_2.8.0-beta01.txt b/work/work-rxjava3/api/restricted_2.8.0-beta01.txt
new file mode 100644
index 0000000..0983052
--- /dev/null
+++ b/work/work-rxjava3/api/restricted_2.8.0-beta01.txt
@@ -0,0 +1,15 @@
+// Signature format: 4.0
+package androidx.work.rxjava3 {
+
+  public abstract class RxWorker extends androidx.work.ListenableWorker {
+    ctor public RxWorker(android.content.Context, androidx.work.WorkerParameters);
+    method @MainThread public abstract io.reactivex.rxjava3.core.Single<androidx.work.ListenableWorker.Result!> createWork();
+    method protected io.reactivex.rxjava3.core.Scheduler getBackgroundScheduler();
+    method public io.reactivex.rxjava3.core.Single<androidx.work.ForegroundInfo!> getForegroundInfo();
+    method public final io.reactivex.rxjava3.core.Completable setCompletableProgress(androidx.work.Data);
+    method public final io.reactivex.rxjava3.core.Completable setForeground(androidx.work.ForegroundInfo);
+    method public final com.google.common.util.concurrent.ListenableFuture<androidx.work.ListenableWorker.Result!> startWork();
+  }
+
+}
+
diff --git a/work/work-testing/api/2.8.0-beta01.txt b/work/work-testing/api/2.8.0-beta01.txt
new file mode 100644
index 0000000..f3f3fe2
--- /dev/null
+++ b/work/work-testing/api/2.8.0-beta01.txt
@@ -0,0 +1,52 @@
+// Signature format: 4.0
+package androidx.work.testing {
+
+  public class SynchronousExecutor implements java.util.concurrent.Executor {
+    ctor public SynchronousExecutor();
+    method public void execute(Runnable);
+  }
+
+  public interface TestDriver {
+    method public void setAllConstraintsMet(java.util.UUID);
+    method public void setInitialDelayMet(java.util.UUID);
+    method public void setPeriodDelayMet(java.util.UUID);
+  }
+
+  public class TestListenableWorkerBuilder<W extends androidx.work.ListenableWorker> {
+    method public W build();
+    method public static androidx.work.testing.TestListenableWorkerBuilder<? extends androidx.work.ListenableWorker> from(android.content.Context, androidx.work.WorkRequest);
+    method public static <W extends androidx.work.ListenableWorker> androidx.work.testing.TestListenableWorkerBuilder<W!> from(android.content.Context, Class<W!>);
+    method public androidx.work.testing.TestListenableWorkerBuilder<W!> setForegroundUpdater(androidx.work.ForegroundUpdater);
+    method public androidx.work.testing.TestListenableWorkerBuilder<W!> setId(java.util.UUID);
+    method public androidx.work.testing.TestListenableWorkerBuilder<W!> setInputData(androidx.work.Data);
+    method @RequiresApi(28) public androidx.work.testing.TestListenableWorkerBuilder<W!> setNetwork(android.net.Network);
+    method public androidx.work.testing.TestListenableWorkerBuilder<W!> setProgressUpdater(androidx.work.ProgressUpdater);
+    method public androidx.work.testing.TestListenableWorkerBuilder<W!> setRunAttemptCount(int);
+    method public androidx.work.testing.TestListenableWorkerBuilder<W!> setTags(java.util.List<java.lang.String!>);
+    method @RequiresApi(24) public androidx.work.testing.TestListenableWorkerBuilder<W!> setTriggeredContentAuthorities(java.util.List<java.lang.String!>);
+    method @RequiresApi(24) public androidx.work.testing.TestListenableWorkerBuilder<W!> setTriggeredContentUris(java.util.List<android.net.Uri!>);
+    method public androidx.work.testing.TestListenableWorkerBuilder<W!> setWorkerFactory(androidx.work.WorkerFactory);
+  }
+
+  public final class TestListenableWorkerBuilderKt {
+    method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.testing.TestListenableWorkerBuilder<W>! TestListenableWorkerBuilder(android.content.Context context, optional androidx.work.Data inputData, optional java.util.List<? extends java.lang.String> tags, optional int runAttemptCount, optional java.util.List<? extends android.net.Uri> triggeredContentUris, optional java.util.List<? extends java.lang.String> triggeredContentAuthorities);
+  }
+
+  public class TestWorkerBuilder<W extends androidx.work.Worker> extends androidx.work.testing.TestListenableWorkerBuilder<W> {
+    method public static androidx.work.testing.TestWorkerBuilder<? extends androidx.work.Worker> from(android.content.Context, androidx.work.WorkRequest, java.util.concurrent.Executor);
+    method public static <W extends androidx.work.Worker> androidx.work.testing.TestWorkerBuilder<W!> from(android.content.Context, Class<W!>, java.util.concurrent.Executor);
+  }
+
+  public final class TestWorkerBuilderKt {
+    method public static inline <reified W extends androidx.work.Worker> androidx.work.testing.TestWorkerBuilder<W>! TestWorkerBuilder(android.content.Context context, java.util.concurrent.Executor executor, optional androidx.work.Data inputData, optional java.util.List<? extends java.lang.String> tags, optional int runAttemptCount, optional java.util.List<? extends android.net.Uri> triggeredContentUris, optional java.util.List<? extends java.lang.String> triggeredContentAuthorities);
+  }
+
+  public final class WorkManagerTestInitHelper {
+    method @Deprecated public static androidx.work.testing.TestDriver? getTestDriver();
+    method public static androidx.work.testing.TestDriver? getTestDriver(android.content.Context);
+    method public static void initializeTestWorkManager(android.content.Context);
+    method public static void initializeTestWorkManager(android.content.Context, androidx.work.Configuration);
+  }
+
+}
+
diff --git a/work/work-testing/api/public_plus_experimental_2.8.0-beta01.txt b/work/work-testing/api/public_plus_experimental_2.8.0-beta01.txt
new file mode 100644
index 0000000..f3f3fe2
--- /dev/null
+++ b/work/work-testing/api/public_plus_experimental_2.8.0-beta01.txt
@@ -0,0 +1,52 @@
+// Signature format: 4.0
+package androidx.work.testing {
+
+  public class SynchronousExecutor implements java.util.concurrent.Executor {
+    ctor public SynchronousExecutor();
+    method public void execute(Runnable);
+  }
+
+  public interface TestDriver {
+    method public void setAllConstraintsMet(java.util.UUID);
+    method public void setInitialDelayMet(java.util.UUID);
+    method public void setPeriodDelayMet(java.util.UUID);
+  }
+
+  public class TestListenableWorkerBuilder<W extends androidx.work.ListenableWorker> {
+    method public W build();
+    method public static androidx.work.testing.TestListenableWorkerBuilder<? extends androidx.work.ListenableWorker> from(android.content.Context, androidx.work.WorkRequest);
+    method public static <W extends androidx.work.ListenableWorker> androidx.work.testing.TestListenableWorkerBuilder<W!> from(android.content.Context, Class<W!>);
+    method public androidx.work.testing.TestListenableWorkerBuilder<W!> setForegroundUpdater(androidx.work.ForegroundUpdater);
+    method public androidx.work.testing.TestListenableWorkerBuilder<W!> setId(java.util.UUID);
+    method public androidx.work.testing.TestListenableWorkerBuilder<W!> setInputData(androidx.work.Data);
+    method @RequiresApi(28) public androidx.work.testing.TestListenableWorkerBuilder<W!> setNetwork(android.net.Network);
+    method public androidx.work.testing.TestListenableWorkerBuilder<W!> setProgressUpdater(androidx.work.ProgressUpdater);
+    method public androidx.work.testing.TestListenableWorkerBuilder<W!> setRunAttemptCount(int);
+    method public androidx.work.testing.TestListenableWorkerBuilder<W!> setTags(java.util.List<java.lang.String!>);
+    method @RequiresApi(24) public androidx.work.testing.TestListenableWorkerBuilder<W!> setTriggeredContentAuthorities(java.util.List<java.lang.String!>);
+    method @RequiresApi(24) public androidx.work.testing.TestListenableWorkerBuilder<W!> setTriggeredContentUris(java.util.List<android.net.Uri!>);
+    method public androidx.work.testing.TestListenableWorkerBuilder<W!> setWorkerFactory(androidx.work.WorkerFactory);
+  }
+
+  public final class TestListenableWorkerBuilderKt {
+    method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.testing.TestListenableWorkerBuilder<W>! TestListenableWorkerBuilder(android.content.Context context, optional androidx.work.Data inputData, optional java.util.List<? extends java.lang.String> tags, optional int runAttemptCount, optional java.util.List<? extends android.net.Uri> triggeredContentUris, optional java.util.List<? extends java.lang.String> triggeredContentAuthorities);
+  }
+
+  public class TestWorkerBuilder<W extends androidx.work.Worker> extends androidx.work.testing.TestListenableWorkerBuilder<W> {
+    method public static androidx.work.testing.TestWorkerBuilder<? extends androidx.work.Worker> from(android.content.Context, androidx.work.WorkRequest, java.util.concurrent.Executor);
+    method public static <W extends androidx.work.Worker> androidx.work.testing.TestWorkerBuilder<W!> from(android.content.Context, Class<W!>, java.util.concurrent.Executor);
+  }
+
+  public final class TestWorkerBuilderKt {
+    method public static inline <reified W extends androidx.work.Worker> androidx.work.testing.TestWorkerBuilder<W>! TestWorkerBuilder(android.content.Context context, java.util.concurrent.Executor executor, optional androidx.work.Data inputData, optional java.util.List<? extends java.lang.String> tags, optional int runAttemptCount, optional java.util.List<? extends android.net.Uri> triggeredContentUris, optional java.util.List<? extends java.lang.String> triggeredContentAuthorities);
+  }
+
+  public final class WorkManagerTestInitHelper {
+    method @Deprecated public static androidx.work.testing.TestDriver? getTestDriver();
+    method public static androidx.work.testing.TestDriver? getTestDriver(android.content.Context);
+    method public static void initializeTestWorkManager(android.content.Context);
+    method public static void initializeTestWorkManager(android.content.Context, androidx.work.Configuration);
+  }
+
+}
+
diff --git a/work/work-testing/api/res-2.8.0-beta01.txt b/work/work-testing/api/res-2.8.0-beta01.txt
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/work/work-testing/api/res-2.8.0-beta01.txt
diff --git a/work/work-testing/api/restricted_2.8.0-beta01.txt b/work/work-testing/api/restricted_2.8.0-beta01.txt
new file mode 100644
index 0000000..f3f3fe2
--- /dev/null
+++ b/work/work-testing/api/restricted_2.8.0-beta01.txt
@@ -0,0 +1,52 @@
+// Signature format: 4.0
+package androidx.work.testing {
+
+  public class SynchronousExecutor implements java.util.concurrent.Executor {
+    ctor public SynchronousExecutor();
+    method public void execute(Runnable);
+  }
+
+  public interface TestDriver {
+    method public void setAllConstraintsMet(java.util.UUID);
+    method public void setInitialDelayMet(java.util.UUID);
+    method public void setPeriodDelayMet(java.util.UUID);
+  }
+
+  public class TestListenableWorkerBuilder<W extends androidx.work.ListenableWorker> {
+    method public W build();
+    method public static androidx.work.testing.TestListenableWorkerBuilder<? extends androidx.work.ListenableWorker> from(android.content.Context, androidx.work.WorkRequest);
+    method public static <W extends androidx.work.ListenableWorker> androidx.work.testing.TestListenableWorkerBuilder<W!> from(android.content.Context, Class<W!>);
+    method public androidx.work.testing.TestListenableWorkerBuilder<W!> setForegroundUpdater(androidx.work.ForegroundUpdater);
+    method public androidx.work.testing.TestListenableWorkerBuilder<W!> setId(java.util.UUID);
+    method public androidx.work.testing.TestListenableWorkerBuilder<W!> setInputData(androidx.work.Data);
+    method @RequiresApi(28) public androidx.work.testing.TestListenableWorkerBuilder<W!> setNetwork(android.net.Network);
+    method public androidx.work.testing.TestListenableWorkerBuilder<W!> setProgressUpdater(androidx.work.ProgressUpdater);
+    method public androidx.work.testing.TestListenableWorkerBuilder<W!> setRunAttemptCount(int);
+    method public androidx.work.testing.TestListenableWorkerBuilder<W!> setTags(java.util.List<java.lang.String!>);
+    method @RequiresApi(24) public androidx.work.testing.TestListenableWorkerBuilder<W!> setTriggeredContentAuthorities(java.util.List<java.lang.String!>);
+    method @RequiresApi(24) public androidx.work.testing.TestListenableWorkerBuilder<W!> setTriggeredContentUris(java.util.List<android.net.Uri!>);
+    method public androidx.work.testing.TestListenableWorkerBuilder<W!> setWorkerFactory(androidx.work.WorkerFactory);
+  }
+
+  public final class TestListenableWorkerBuilderKt {
+    method public static inline <reified W extends androidx.work.ListenableWorker> androidx.work.testing.TestListenableWorkerBuilder<W>! TestListenableWorkerBuilder(android.content.Context context, optional androidx.work.Data inputData, optional java.util.List<? extends java.lang.String> tags, optional int runAttemptCount, optional java.util.List<? extends android.net.Uri> triggeredContentUris, optional java.util.List<? extends java.lang.String> triggeredContentAuthorities);
+  }
+
+  public class TestWorkerBuilder<W extends androidx.work.Worker> extends androidx.work.testing.TestListenableWorkerBuilder<W> {
+    method public static androidx.work.testing.TestWorkerBuilder<? extends androidx.work.Worker> from(android.content.Context, androidx.work.WorkRequest, java.util.concurrent.Executor);
+    method public static <W extends androidx.work.Worker> androidx.work.testing.TestWorkerBuilder<W!> from(android.content.Context, Class<W!>, java.util.concurrent.Executor);
+  }
+
+  public final class TestWorkerBuilderKt {
+    method public static inline <reified W extends androidx.work.Worker> androidx.work.testing.TestWorkerBuilder<W>! TestWorkerBuilder(android.content.Context context, java.util.concurrent.Executor executor, optional androidx.work.Data inputData, optional java.util.List<? extends java.lang.String> tags, optional int runAttemptCount, optional java.util.List<? extends android.net.Uri> triggeredContentUris, optional java.util.List<? extends java.lang.String> triggeredContentAuthorities);
+  }
+
+  public final class WorkManagerTestInitHelper {
+    method @Deprecated public static androidx.work.testing.TestDriver? getTestDriver();
+    method public static androidx.work.testing.TestDriver? getTestDriver(android.content.Context);
+    method public static void initializeTestWorkManager(android.content.Context);
+    method public static void initializeTestWorkManager(android.content.Context, androidx.work.Configuration);
+  }
+
+}
+